深刻理解滾動scroll

滾動寬高

scrollHeighthtml

  scrollHeight表示元素的總高度,包括因爲溢出而沒法展現在網頁的不可見部分chrome

scrollWidth瀏覽器

  scrollWidth表示元素的總寬度包括因爲溢出而沒法展現在網頁的不可見部分spa

  [注意]IE7-瀏覽器返回值是不許確的firefox

  【1】沒有滾動條時,scrollHeight與clientHeight屬性結果相等,scrollWidth與clientWidth屬性結果相等code

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

  【2】存在滾動條時,但元素設置寬高大於等於元素內容寬高時,scroll和client屬性的結果相等htm

複製代碼
<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-bottomblog

複製代碼
<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 768
console.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; line-height: 1.5 !important;">></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; line-height: 1.5 !important;">></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>
複製代碼

  

最後

  本文詳細介紹了滾動scroll的知識,基本上囊括了關於滾動現有的全部屬性和方法。本文中並未詳細介紹滾動條,詳細內容移步至此

相關文章
相關標籤/搜索