最近在做一个聊天室的小案例,遇到了一个关于滚动条的问题,需要对获取的信息即时滚动以保证用户总能看到最新消息。聊天程序是基于 ajax 实现的,没有使用框架,消息容器是一个 div,查阅大量资料后写下这篇文章,以作记录!


文章目录

  • 1. div 添加滚动条
  • 2. 滚动条绑定事件
  • (1. 基本属性及方法
  • (2. 绑定滚动事件
  • (3. 判断向上 & 向下滚动
  • (4. 判断滚动条移动至最底部
  • 3. 滚动条样式
  • 样式 demo
  • 4. 小案例


1. div 添加滚动条

overflow:scroll;

只要要设置这么一行 css 语句,我们就为 div 标签添加了一个滚动条,但这是一个双向滚动条,也就是说会在 div标签的上下方向和左右方向都添加一个滚动条,一般我们只需要在一个方向添加滚动条即可,因此我们可以使用overflow-x 或者 overflow-y 来设置单方向滚动条!

html5 iphone 滚动条 html中滚动条_html5

2. 滚动条绑定事件

(1. 基本属性及方法

先介绍一些 js 中和 scroll 滚动相关的属性及方法,了解这些方法可以更方便的帮助我们理解下边的几个事件。

属性

解释

element.scrollHeight

返回元素整个滚动区域的高度

element.scrollWidth

返回元素整个滚动区域的宽度

element.scrollLeft

返回水平滚动条滚动的距离

element.scrollTop

返回垂直滚动条滚动的距离

element.clientHeight

返回元素的可见高度

element.clientWidth0

返回元素的可见宽度

方法

解释

scrollBy(x,y)

在滚动条原位置的基础上向右或者向下滚动的像素数

scrollTo(x,y)

将滚动条直接向右或者向下滚动的像素数

element.scrollTop = 0  `垂直滚动条在最顶端`

element.scrollLeft = 0  `水平滚动条在最左端`

element.scrollTop + element.clientHeight >= element.scrollHeight `垂直滚动条在最底端`

element.scrollLeft + element.clientWidth >= element.scrollWidth `水平滚动条在最右端`

(2. 绑定滚动事件

div 可以直接使用 onscroll 属性来绑定滚动事件,如下所示,当我们在界面进行滚动时,控制台就会打印信息了!

<!-- div 使用 onscroll 来为滚动条绑定绑定事件 -->
	<div style="width:200px;height:150px;overflow-y:scroll;" 
	     class="div_soroll" onscroll="scroll_move()">
		<br><br><br>
		<br><br><br>
		<br><br><br>
	</div>

	<script type="text/javascript">
		var i = 0;
		function scroll_move(){
			i += 1;
			console.log("滚动了"+i+"次")
		}
	</script>

(3. 判断向上 & 向下滚动

为 div 标签添加自定义属性 scrollTop 用来保存当前滚动条位置,在滚动事件中获取滚动之后的位置,判断两个位置的大小即可得出滚动条 向上 或者 向下 移动,最后将滚动之后的位置赋值给 自定义属性 scrollTop。

<div style="width:200px;height:150px;border:1px solid;overflow-y:scroll;" 
		 class="div_soroll" onscroll="scroll_move(this)" scrollTop="0">
		<br><br><br>
		<br><br><br>
		<br><br><br>
	</div>

	<script type="text/javascript">
		function scroll_move(div){
			last_scrollTop = div.getAttribute("scrollTop");
			now_scrollTop = div.scrollTop;
			
			if (last_scrollTop<now_scrollTop){
				console.log("向下移动了");
			}else if(last_scrollTop>now_scrollTop){
				console.log("向上移动了");
			}
			
			div.setAttribute("scrollTop",now_scrollTop)
		}
	</script>

(4. 判断滚动条移动至最底部

通过上述 element.scrollTop + element.clientHeight >= element.scrollHeight 该公式即可判断!

3. 滚动条样式

在 css3 中,我们可以通过 ::-webkit-scrollbar 伪类选择器来设置滚动条的样式

::-webkit-scrollbar 仅仅在支持 WebKit 的浏览器生效 ( 例如, 谷歌Chrome, 苹果Safari )

样式 demo

html5 iphone 滚动条 html中滚动条_javascript_02


详细内容请参考:

  • css scrollbar 样式设置
  • MDN web docs

4. 小案例

html5 iphone 滚动条 html中滚动条_html5 iphone 滚动条_03

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			#the_div {
				border: 1px solid black;
				width: 200px;
				height: 100px;
				overflow-y: scroll;
			}
			#info{
				position:absolute;
				top: 90px;
				left: 8px;
				width: 200px;
				height: 20px;
				background-color: #ffc34c;
				color: white;
				text-align: center;
				line-height: 20px;
				font-size: 12px;
				opacity:0.8;
				visibility: hidden;
			}
		</style>
	</head>
	<body>
		<div id="the_div" onscroll="scroll_move(this)" scrollTop="0"></div>
		<div id="info" onclick="go_bottom()">∨ 有更多新的消息</div>
		
		<script>
			var scroll_FLAG = true

			function scroll_move(div) {
				div_scrollTop = div.getAttribute("scrollTop");
				if (div.offsetHeight + div.scrollTop >= div.scrollHeight) {
					scroll_FLAG = true;
					document.getElementById("info").style.visibility = "hidden"
					return
				}else{
					scroll_FLAG = false;
					document.getElementById("info").style.visibility = "visible"
				}
			}

			function go_bottom() {
				var div = document.getElementById("the_div");
				div.scrollTo(0, div.scrollHeight);
			}
			
			function add_msg(){
				var div = document.getElementById("the_div");
				div.innerText += "123\n"
				if(scroll_FLAG){
					div.scrollTo(0,div.scrollHeight)
				}
			}
			
			setInterval(add_msg,1000)
		</script>
	</body>
</html>