[1]滾動寬高 [2]頁面尺寸 [3]滾動長度 [4]頁面滾動 [5]滾動方法 [6]滾動事件 ...
×
目錄
[1]滾動寬高 [2]頁面尺寸 [3]滾動長度[4]頁面滾動[5]滾動方法[6]滾動事件前面的話
前面兩篇博文分別介紹過偏移大小、可視區大小。本文介紹元素尺寸中內容最多的一部分——滾動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 120 console.log(test.scrollHeight,test.scrollWidth); //120 120 console.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返回可視區域大小,而scroll返回元素內容大小
//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返回可視區域大小,而scroll返回元素內容大小
<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對象上發生的,它表示的是頁面中相應元素的變化
<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的知識,基本上囊括了關於滾動現有的所有屬性和方法。本文中並未詳細介紹滾動條,詳細內容移步至此
下文將以實例的形式,對滾動的屬性和方法進行應用,總結回到頂部的多種寫法,並嘗試優化
歡迎交流