一文看懂js中元素的滾動大小(scrollWidth,scrollHeight,scrollTop,scrollLeft)


滾動大小(scroll dimension)

滾動大小指的是包含滾動內容元素的大小。

以下是與元素滾動內容大小相關的屬性:

1. scrollWidth:在沒有滾動條的情況下,元素內容的總寬度。

2. scrollHeight:在沒有滾動條的情況下,元素內容的總高度。

3. scrollTop:被隱藏在內容區域左側的像素數。設置該值可以改變元素的滾動位置。

4. scrollLeft:被隱藏在內容區域上方的像素數。設置該值可以改變元素的滾動位置。

接下來就舉例講解一下各個屬性是什么意思,在這里使用html元素最為觀察元素,因為,通常認為<html>元素是在web瀏覽器的視口中滾動的元素(IE6之前版本運行在混雜模式下是<body>元素),因為該元素即使沒有任何執行代碼也能自動地添加滾動條,其他元素需要通過css設置overflow屬性,才會出現滾動條。

案例代碼如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            height: 1200px;
        }

        .container div {
            height: 400px;
            width: 150%;
            font-size: 20px;
            font-weight: bold;
            text-align: right;
        }

        div.red {
            background-color: red;
        }

        div.green {
            background-color: green;
        }

        div.yellow {
            background-color: yellow;
        }

        div.black {
            background-color: black;
        }

        .print {
            position: fixed;
            top: 10px;
            left: 10px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="red">最右邊</div>
        <div class="green">最右邊</div>
        <div class="yellow">最右邊</div>
    </div>
    <div class="print">
        <button>
            打印相關屬性值
        </button>
        <div></div>
    </div>
    <script>
        var _body = document.documentElement;
        var btn = document.querySelector('.print button');
        var text = document.querySelector('.print div');
        btn.onclick = function () {
            var html = "";
            var ch = _body.clientHeight;
            var cw = _body.clientWidth;
            var sh = _body.scrollHeight;
            var sw = _body.scrollWidth;
            var st = _body.scrollTop;
            var sl = _body.scrollLeft;
            html += "clientHeight:" + ch + "<br>";
            html += "clientWidht:" + cw + "<br>";
            html += "scrollHeight:" + sh + "<br>";
            html += "scrollWidth:" + sw + "<br>";
            html += "scrollTop:" + st + "<br>";
            html += "scrollLeft:" + sl + "<br>";
            text.innerHTML = html;
        } 
    </script>
</body>

</html>

頁面第一次加載完之后,我們點擊按鈕得到相關屬性值如下:

現在我們往上,往左滾動一下,在看一下結果:

發現只有scrollTop和scrollLeft發生了一定的改變,其他四個屬性沒有發生改變(並不是說這四個屬性不會改變,在不操作滾動內容和調整窗口大小的情況下,是不會發生改變的,我們的案例就是在此基礎上進行的)。

現在我們在來看一下滾動到最底部的時候,結果又是怎么樣的:

發現,變化的還是scrollTop和scrollLeft(基於上次位置,不左滾動的話scrollLeft是不會變的,我是向左滾動了的,以此避免認為向上滾動scroolleft的值會改變),

但是仔細一看會發現一組非常有意思的數據,即 clientHeight + scrollTop = scrollHeight;

在看一下左滾動到最右邊,會有什么變化:

此時我們發現 clientWidth + scrollLeft = scrollWidth;

到此我們發現了這樣一個規律,就是元素中的滾動內容滾動到邊界的時候,就會有下面一個或者兩個等式成立:

1.  clientWidth + scrollLeft = scrollWidth;

2. clientHeight + scrollTop = scrollHeight;

其實仔細一想也很好理解,比如元素中的滾動內容滾動到最底部的時候,就無法繼續滾動,那么此時內容在元素中的可見高度就是元素的clientHeight,而此時的scrollTop就是元素超出元素上方的距離,這兩個值相加就一定會等於元素的scrollHeight,另一個等式同理。

有了這個等式的成立,那么我們就可以做很多事情,比如下拉加載,自定義滾動條等等,同時通過scrollTop的值的設置,我們還可以實現回到頂部的功能。

以上我們介紹的是在有滾動條的情況下,出現的一種現象,那在沒有滾動條的情況下又會是一個什么樣子了?(前提還是把html元素作為觀察對象)。

其實在不包含滾動條的頁面,scrollWidth和scrollHeight與clientWidth和clientHeight之間的關系不十分清晰,不同瀏覽器之間存在着差異。

1. FireFox 中這兩組屬性大小相等,但大小代表的是文檔內容區域的實際尺寸,而非視口的尺寸(未經測試,查閱資料得知)

2. Safari中clientWidht和scrollWidth相等等於視口寬度,clientHeight等於視口的高度,scrollHeight等於文檔內容區域的高度(Safari版本12.1.2)

3. chrome中這兩組屬性相等,等於視口大小(chrome版本 79.0.3945.130(正式版本) (64 位)mac)

4. IE(在標准模式下)中的兩組屬性不相等,其中scrollWidth和scollHeight等於文檔內容區域的大小,另一組屬性等於視口的大小。(未經測試,查閱資料得知)

 所以有了這些差異,所以我們確定文檔的總高度和寬度的時候,必須取得scrollWIdth/clientWidht和scrollHeihgt/clientHeight中的最大值,才能保證在跨瀏覽器環境中得到精確的結果,現給下兼容寫法:

function getDoc() {
            // 混雜模式
            if (document.compatMode !== 'BackCompat') {
                return {
                    height: Math.max(document.body.scrollHeight, document.body.clientHeight),
                    width: Math.max(document.body.scrollWidth, document.body.clientHeight)
                }
            }
            else {
                return {
                    height: Math.max(document.documentElement.scrollHeight, document.body.clientHeight),
                    width: Math.max(document.documentElement.scrollWidth, document.body.clientHeight)
                }
            }
        };

關於滾動元素大小的知識點介紹完畢,如果有錯就告知一聲,我好及時修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM