理解滚动scroll

滚动宽高

scrollHeight

  scrollHeight表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分

scrollWidth

  scrollWidth表示元素的总宽度,包括由于溢出而无法展示在网页的不可见部分

  [注意]IE7-浏览器返回值是不准确的

  【1】没有滚动条时,scrollHeight与clientHeight属性结果相等,scrollWidth与clientWidth属性结果相等

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;"></div><script>//120 120console.log(test.scrollHeight,test.scrollWidth);//120 120console.log(test.clientHeight,test.clientWidth);</script>

  【2】存在滚动条时,但元素设置宽高大于等于元素内容宽高时,scroll和client属性的结果相等

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:1;">
    内容<br>内容<br></div><script>//103(120-17) 103(120-17)console.log(test.scrollHeight,test.scrollWidth);//103(120-17) 103(120-17)console.log(test.clientHeight,test.clientWidth);</script>

  【3】存在滚动条,但元素设置宽高小于元素内容宽高,即存在内容溢出的情况时,scroll属性大于client属性

  [注意]scrollHeight属性存在兼容性问题,chrome和safari浏览器中,scrollHeight包含padding-bottom;而IE和firefox不包含padding-bottom

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:200px;">
    内容</div><script>//chrome/safari:220(200+10+10)//firefox/IE:210(200+10)console.log(test.scrollHeight);//103(120-17)console.log(test.clientHeight);</script>

页面尺寸

  document.documentElement.clientHeight表示页面的可视区域的尺寸,而document.documentElement.scrollHeight表示html元素内容的实际尺寸。但是由于各个浏览器表现不一样,分为以下几种情况

  【1】html元素没有滚动条时,IE和firefox的client和scroll属性始终相同,且返回可视区的尺寸大小;而safari和chrome表现正常,clientHeight返回可视区域大小,而scrollHeight返回元素内容大小

//firefox:  755 755//chrome:   947 8(body元素的margin)//safari:   744 8(body元素的margin)//IE:       768 768console.log(document.documentElement.clientHeight,document.documentElement.scrollHeight)

  【2】html元素存在滚动条时,各个浏览器都表现正常。clientHeight返回可视区域大小,而scrollHeight返回元素内容大小

<body style="height:1000px"><script>//firefox:  755 1016(1000+8*2)//chrome:   947 1016(1000+8*2)//safari:   744 1016(1000+8*2)//IE:       768 1016(1000+8*2)console.log(document.documentElement.clientHeight,document.documentElement.scrollHeight)</script>

兼容

  因此要取得文档实际高度时,要取得<html>元素的scrollHeight和clientHeight的最大值

var docHeight = Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight);var docWidth  = Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth);

滚动长度

scrollTop

  scrollTop属性表示被隐藏在内容区域上方的像素数。元素未滚动时,scrollTop的值为0,如果元素被垂直滚动了,scrollTop的值大于0,且表示元素上方不可见内容的像素宽度

scrollLeft

  scrollLeft属性表示被隐藏在内容区域左侧的像素数。元素未滚动时,scrollLeft的值为0,如果元素被水平滚动了,scrollLeft的值大于0,且表示元素左侧不可见内容的像素宽度

  当滚动条滚动到内容底部时,符合以下等式

scrollHeight == scrollTop  + clientHeight

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:200px;">
    内容</div><button id=‘btn1‘>点击</button><div id="result"></div><script>btn1.onclick = function(){
    result.innerHTML = ‘scrollTop:‘ + test.scrollTop+‘;clientHeight:‘ + test.clientHeight + ‘;scrollHeight:‘ + test.scrollHeight
}</script>

  与scrollHeight和scrollWidth属性不同的是,scrollLeft和scrollTop是可写的

  [注意]为scrollLeft和scrollTop赋值为负值时,并不会报错,而是静默失败

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:200px;">
    内容</div><button id=‘btn1‘>向下滚动</button><button id=‘btn2‘>向上滚动</button><script>btn1.onclick = function(){test.scrollTop += 10;}
btn2.onclick = function(){test.scrollTop -= 10;}</script>

页面滚动

  理论上,通过document.documentElement.scrollTop和scrollLeft可以反映和控制页面的滚动;但是chrome和safari浏览器是通过document.body.scrollTop和scrollLeft来控制的

<body style="height:1000px"><button id=‘btn1‘ style="position:fixed;top:0;">点击</button><div id="result" style="position:fixed;top:30px;"></div><script>btn1.onclick = function(){
    result.innerHTML = ‘html的scrollTop:‘ + document.documentElement.scrollTop +‘;body的scrollTop:‘ + document.body.scrollTop;
}</script>    </body>

  所以,页面的滚动高度兼容写法是

var docScrollTop = document.documentElement.scrollTop || document.body.scrollTop

回到顶部

  可以利用scrollTop来实现回到顶部的功能

function scrollTop(){    if((document.body.scrollTop || document.documentElement.scrollTop) != 0){
        document.body.scrollTop = document.documentElement.scrollTop = 0;
    }
}

<body style="height:1000px">
<button id=‘btn‘ style="position:fixed">回到顶部</button>
<script>function scrollTop(){    if((document.body.scrollTop || document.documentElement.scrollTop) != 0){
        document.body.scrollTop = document.documentElement.scrollTop = 0;
    }
}
btn.onclick = scrollTop;</script>
</body>

  还有两个window的只读属性可以获取整个页面滚动的像素值,它们是pageXOffset和pageYOffset

pageXOffset

  pageXOffset表示水平方向上页面滚动的像素值

pageYOffset

  pageYOffset表示垂直方向上页面滚动的像素值

  [注意]IE8-浏览器不支持

<body style="height:1000px"><button id=‘btn1‘ style="position:fixed;top:0;">点击</button><div id="result" style="position:fixed;top:30px;"></div><script>btn1.onclick = function(){
    result.innerHTML = ‘pageYOffset:‘ + window.pageYOffset;
}</script>    </body>

滚动方法

scrollTo(x,y)

  scrollTo(x,y)方法滚动当前window中显示的文档,让文档中由坐标x和y指定的点位于显示区域的左上角

<body style="height:1000px"><button id=‘btn‘ style="position:fixed">滚动</button><script>btn.onclick = function(){scrollTo(0,0);}</script>

scrollBy(x,y)

  scrollBy(x,y)方法滚动当前window中显示的文档,x和y指定滚动的相对量

<body style="height:1000px"><button id=‘btn1‘ style="position:fixed">向下滚动</button><button id=‘btn2‘ style="position:fixed;top:40px">向上滚动</button><script>btn1.onclick = function(){scrollBy(0,100);}
btn2.onclick = function(){scrollBy(0,-100);}</script>

【小应用】

  利用scrollBy()加setInterval计时器实现简单的快速滚动功能

<body style="height:1000px"><button id=‘btn1‘ style="position:fixed">开始滚动</button><button id=‘btn2‘ style="position:fixed;top:40px">停止滚动</button><script>var timer = 0;
btn1.onclick = function(){
    timer = setInterval(function(){
        scrollBy(0,10);
    },100)}
btn2.onclick = function(){
    clearInterval(timer);
    timer = 0;
}</script>

scrollIntoView()

  Element.scrollIntoView方法滚动当前元素,进入浏览器的可见区域

  该方法可以接受一个布尔值作为参数。如果为true,表示元素的顶部与当前区域的可见部分的顶部对齐(前提是当前区域可滚动);如果为false,表示元素的底部与当前区域的可见部分的尾部对齐(前提是当前区域可滚动)。如果没有提供该参数,默认为true

<body style="height:1000px"><div id="test" style="height:100px;width:100px;position:absolute;left:0;top:500px;background-color:green"></div><button id=‘btn1‘ style="position:fixed">滚动到页面开头</button><button id=‘btn2‘ style="position:fixed;top:40px">滚动到页面结尾</button><script>btn1.onclick = function(){
    test.scrollIntoView();
};
btn2.onclick = function(){
    test.scrollIntoView(false);
}</script>

scrollIntoViewIfNeeded()

  scrollIntoViewIfNeeded(true)方法只在当前元素在视口中不可见的情况下,才滚动浏览器窗口或容器元素,最终让它可见。如果当前元素在视口中可见,这个方法什么也不做

  如果将可选的alignCenter参数设置为true,则表示尽量将元素显示在视口中部(垂直方向)

  [注意]该方法只有chrome和safari支持

<body style="height:1000px"><div id="test" style="height:100px;width:100px;position:absolute;left:0;top:500px;background-color:green"></div><button id=‘btn‘ style="position:fixed">滚动到页面中间</button><script>btn.onclick = function(){
    test.scrollIntoViewIfNeeded(true)
};</script>

scrollByLines(lineCount)

  scrollByLines(lineCount)方法将元素的内容滚动指定的行髙,lineCount值可以是正值, 也可以是负值

  [注意]该方法只有safari支持

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:200px;">
    内容</div><button id=‘btn1‘>向下滚动</button><button id=‘btn2‘>向上滚动</button><script>btn1.onclick = function(){test.scrollByLines(1);}
btn2.onclick = function(){test.scrollByLines(-1);}</script>

scrollByPages(pageCount)

  scrollByPages(pageCount)方法将元素的内容滚动指定的页面高度,具体高度由元素的高度决定

  [注意]该方法只有safari支持

<div id="test" style="width: 100px;height: 100px;padding: 10px;margin: 10px;border: 1px solid black;overflow:scroll;font-size:20px;line-height:200px;">
    内容</div><button id=‘btn1‘>向下滚动</button><button id=‘btn2‘>向上滚动</button><script>btn1.onclick = function(){test.scrollByPages(1);}
btn2.onclick = function(){test.scrollByPages(-1);}</script>

滚动事件

  scroll事件是在window对象上发生的,它表示的是页面中相应元素的变化。当然,scroll事件也可以用在有滚动条的元素上

<body style="height:1000px"><div id="result" style="position:fixed;top:10px;"></div><script>window.onscroll = function(){
    result.innerHTML = ‘页面的scrollTop:‘ + (document.documentElement.scrollTop||document.body.scrollTop);
}</script>    </body>

时间: 2024-10-11 11:04:37

理解滚动scroll的相关文章

深入理解滚动scroll

原文链接:http://www.cnblogs.com/xiaohuochai/p/5831640.html#undefined 滚动宽高 scrollHeight scrollHeight表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分 scrollWidth scrollWidth表示元素的总宽度,包括由于溢出而无法展示在网页的不可见部分 [注意]IE7-浏览器返回值是不准确的 [1]没有滚动条时,scrollHeight与clientHeight属性结果相等,scrollWidt

jacascript 滚动scroll

滚动 scroll scrollHeight 表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分: scrollWidth 表示元素的总宽度,包括由于溢出而无法展示在网页的不可见部分: 没有滚动条时,scroll 和 client 属性的结果相等,即 scrollWidth= padding + width: scrollHeight= padding + height: 存在滚动条时,但元素设置宽高大于等于元素内容宽高时(没有内容溢出),scroll 和 client 属性的结果相等,

高性能滚动 scroll 及页面渲染优化

本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,可以对照上面的知识点,选择性跳到相应地方阅读.    滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看看: 1 2 3 4 var i = 0; window.addEventListener('scroll',function(){   

【前端性能】高性能滚动 scroll 及页面渲染优化

最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,是我自己学习记录的一个过程,如果上面列出的知识点都了然于胸了,就可以不必往下看了.    滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看

【前端性能】高性能滚动 scroll 及页面渲染优化--转发

本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,可以对照上面的知识点,选择性跳到相应地方阅读.    滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看看: 1 2 3 4 var i = 0; window.addEventListener('scroll',function(){   

滚动scroll&amp;拖拽client

鼠标事件有: mousedown.mouseup.mousemove.mouseover.mouseout.click.dblclick 事件对象的属性: clientX/clientY 所有浏览器都支持,窗口位置 pageX/pageY IE8以前不支持,页面位置 参数e在IE8以前不支持,它支持window.event 封装兼容性的函数: window.onload = function () { var i1 = document.getElementById("i1"); do

前端高性能滚动 scroll 及页面渲染优化

前言 最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作.本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,是我自己学习记录的一个过程,如果上面列出的知识点都了然于胸了,就可以不必往下看了. 滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看看

Android View的滚动scroll

在View中: public void computeScroll() { //空实现 } public void scrollTo(int x,int y) {//view的(left,top)滚动到一个点(x,y) if (mScrollX != x ||mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; invalidateParentCaches(); onScrol

移动端软件盘遮挡输入框问题

第一.首先解决软键盘影响布局的问题: 软键盘弹出会改变浏览器可视区域的高度,安卓会触发window.resize事件,ios不会触发,所以如果页面元素的布局是以窗口大小为基准的话,会出现布局混乱:比如body的height:100%等等, 所以需要在页面初始化完成后执行这段代码(固定body的高度,不让他自适应) $(document).ready(function () { $('body').height($('body')[0].clientHeight); }); 第二.区分输入框被遮挡