jQuery 源碼解析(二十八) 樣式操做模塊 scrollLeft和scrollTop詳解

scrollLeft和scrollTop用於獲取/設置滾動條的,以下:html

  • scrollLeft(val)  ;讀取或設置整個頁面的水平滾動條距離
  • scrollTop(val)  ;讀取或設置整個頁面的垂直滾動條距離

若是沒有傳入val值則獲取滾動條距離,若是有設置val則標識設置滾動條距離,仍是舉個栗子,以scrollTop爲例,以下:node

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js"></script>
    <style>
        *{margin:0;padding:0;}
        button{margin:1px 0;}
        div{margin:20px;width: 200px;height: 180px;position: relative;padding-top: 20px;background: #c38;}
        h1{margin:10px;color: #333;}
    </style>
</head>
<body>
    <br/>
    <p id="result">結果:<span></span></p>
    <button id="b1">獲取垂直滾動條距離</button><br/>
    <button id="b2">回到首頁</button>
    <br/><br/>
    <script>
        $('#b1').click(()=>{                        //獲取滾動條距離
            $('span').text( $(window).scrollTop() )
        })
        $('#b2').click(()=>{                        //設置垂直滾動條滾動到頂部
            $(window).scrollTop(0)
        })
        //這裏先新增一個文檔碎片,而後添加50個p標籤,最後添加到body子節點的最前面,以模擬滾動條
        {
            let i=1,fragments=document.createDocumentFragment()
            while(i<=50){
                let p = document.createElement('p');
                p.innerHTML = i++;
                fragments.append(p)
            }
            document.body.insertBefore(fragments,document.body.childNodes[0])
        }
    </script>    
</body>
</html>

當咱們點擊按鈕1時將獲取當前垂直滾動條的距離,並將結果添加到span裏面,點擊按鈕2會設置垂直滾動條,讓它滾動到頂部,效果以下:jquery

 writer by:大沙漠 QQ:22969969app

不少網站右下角有一個滾動到頂部就能夠用這個來實現,完美兼容全部網站,這個得感謝完美jQuery的兼容性。源碼分析

 

源碼分析網站


代碼實現以下this

jQuery.each( ["Left", "Top"], function( i, name ) {    //在jQuery.fn加上.scrollLeft()和.scrollTop()方法     對於scrollLeft來講,i爲0,對於scrollTop來講,i爲1
    var method = "scroll" + name;

    jQuery.fn[ method ] = function( val ) {                //掛在實例上面
        var elem, win;

        if ( val === undefined ) {                        //若是沒有傳入val參數
            elem = this[ 0 ];

            if ( !elem ) {                                //若是沒有匹配元素
                return null;                                //則返回null
            }

            win = getWindow( elem );                    //獲取window對象,若是參數elem是window對象,則返回window對象,不然返回false

            // Return the scroll offset
            return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
                jQuery.support.boxModel && win.document.documentElement[ method ] ||
                    win.document.body[ method ] :
                elem[ method ];                            //用於讀取window對象、document對象、元素的滾動偏移
        }
        //執行到這裏,則表示是設置滾動了
        // Set the scroll offset
        return this.each(function() {                    //遍歷匹配元素,設置每一個元素的滾動偏移
            win = getWindow( this );

            if ( win ) {                                //若是是window對象,則調用scrollTo()滾動到執行的位置,該方法兩個參數都是必須的。
                win.scrollTo(
                    !i ? val : jQuery( win ).scrollLeft(),    //這兩個參數是必填的
                     i ? val : jQuery( win ).scrollTop()
                );

            } else {
                this[ method ] = val;                    //不然設置元素的scrollLeft、scrollTop屬性。
            }
        });
    };
});

getWindow實現以下:spa

function getWindow( elem ) {
    return jQuery.isWindow( elem ) ?
        elem :                                         //若是是elem是window對象,則直接返回elem
        elem.nodeType === 9 ?
            elem.defaultView || elem.parentWindow : //不然若是elem表示整個文檔,則返回elem.defaultView(即window對象),不然返回elem.parentWindow,若是elem.parentWindow不存在則返回false
            false;
}

從源碼能夠發現,若是是操做滾動條的話,就須要匹配window或documetn對象才能夠code

相關文章
相關標籤/搜索