1. 程式人生 > >scroll()和scrollTop()方法——實現電商網站中的電梯導航

scroll()和scrollTop()方法——實現電商網站中的電梯導航

窗口 css樣式 ram 每一個 最新 top index hid none

要想實現電商網站的電梯導航效果,首先需要了解以下知識點:

jquery 事件 - scroll() 方法

對元素滾動的次數進行計數,當用戶滾動指定的元素時,會發生 scroll 事件。scroll 事件適用於所有可滾動的元素和 window 對象(瀏覽器窗口)。scroll() 方法觸發 scroll 事件,或規定當發生 scroll 事件時運行的函數。

jquery CSS 操作 - scrollTop() 方法

設置元素中滾動條的垂直偏移,scrollTop() 方法返回或設置匹配元素的滾動條的垂直位置;scroll top offset 指的是滾動條相對於其頂部的偏移;如果該方法未設置參數,則返回以像素計的相對滾動條頂部的偏移。
【scrollTop()俗稱“卷邊函數”,獲取到的是當滾動條滾動時,該頁面文檔被瀏覽器最頂端所卷去的高度;另外還有scrollLeft()方法,顧名思義是被瀏覽器最左端所卷去的距離】

jQuery CSS 操作 - offset() 方法

offset() 方法返回或設置匹配元素相對於文檔的偏移(位置)。該方法返回的對象包含兩個整型屬性:top 和 left,以像素計。此方法只對可見元素有效。

  1. 電梯導航的結構布局怎麽做?
    布局這一塊並不是固定的,只要效果達到就好。

    <ul class="dianTi">
            <li>
                1F
                <div class="wenZi">服飾</div>
            </li>
            <li>
                2F
                <div class="wenZi">美妝</div>
            </li>
            <li>
                3F
                <div class="wenZi">手機</div>
            </li>
            <li>
                4F
                <div class="wenZi">家電</div>
            </li>
            <li>
                5F
                <div class="wenZi">數碼</div>
            </li>
        </ul>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  2. 電梯導航的CSS樣式該怎麽寫?
    寬度可以給一個固定的值;高度本應該由JS去控制,這裏是給的固定的值;定位方式采用的是固定定位,讓它垂直到中間,水平先到瀏覽器的中間,然後設置margin-left為負的網頁版心的一半距離,這樣就緊貼在頁面左側位置了;默認是隱藏的。

    <style type="text/css">
            .dianTi{width: 30px; height: 150px; position: fixed; top: 50%; margin-top: -75px;
                left: 50%; margin-left: -660px; color: #666; cursor: pointer; display: none;}
            .dianTi li{height: 29px; border-bottom: 1px dotted #ccc; text-align: center;
                line-height: 29px; position: relative;}
            .wenZi{width: 29px; height: 29px; position: absolute; left: 0; top: 0; color: #C81623;
                background: #fff; display: none;}
            .dianTi li.current .wenZi{display: block;}
            .dianTi li:hover .wenZi{display: block; background: #C81623; color: #fff;}
        </style>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  3. 怎麽實現最終的效果?
    1.電商網站一般是吧商品分為一樓、二樓、三樓…所以,第一步先要獲取每一個樓層相對於document (0,0)的距離。

    //檢測樓層時,跳轉時,不需要那麽精確,所以減去100
    var f1Top=$(‘.f1‘).offset().top-100;
    var f2Top=$(‘.f2‘).offset().top-100;
    var f3Top=$(‘.f3‘).offset().top-100;
    var f4Top=$(‘.f4‘).offset().top-100;
    var f5Top=$(‘.f5‘).offset().top-100;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.檢測樓層,用scrollTop()方法獲取當滾動條滾動時每次最新的被卷去的高度,即當前可視區域內最頂部距離document (0,0)的距離,然後拿這個距離的值去和之前得到的每個樓層對應的值進行比較,就可以知道當前滾動條滾動到哪個區域了。這裏最好將這個功能性的模塊封裝起來,寫成一個方法,然後用$(window).scroll(jianCe)去調用。

    var jianCe=function(){
        var windowScrollTop=$(window).scrollTop();
    
        if(windowScrollTop>=f5Top){
            console.log(‘到達5樓‘);
            //到達5樓
            $(‘.dianTi‘).show();
            $(‘.dianTi li‘).eq(4).addClass(‘current‘).siblings(‘li‘).removeClass(‘current‘);
        }else if(windowScrollTop>=f4Top){
            console.log(‘到達4樓‘);
            //到達4樓
            $(‘.dianTi‘).show();
            $(‘.dianTi li‘).eq(3).addClass(‘current‘).siblings(‘li‘).removeClass(‘current‘);
        }else if(windowScrollTop>=f3Top){
            console.log(‘到達3樓‘);
            //到達3樓
            $(‘.dianTi‘).show();
            $(‘.dianTi li‘).eq(2).addClass(‘current‘).siblings(‘li‘).removeClass(‘current‘);
        }else if(windowScrollTop>=f2Top){
            console.log(‘到達2樓‘);
            //到達2樓
            $(‘.dianTi‘).show();
            $(‘.dianTi li‘).eq(1).addClass(‘current‘).siblings(‘li‘).removeClass(‘current‘);
        }else if(windowScrollTop>=f1Top){
            console.log(‘到達1樓‘);
            //到達一樓
            $(‘.dianTi‘).show();
            $(‘.dianTi li‘).eq(0).addClass(‘current‘).siblings(‘li‘).removeClass(‘current‘);
        }else{
            //不再5樓中的任意一層時,讓電梯導航隱藏
            $(‘.dianTi‘).hide();
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3.當點擊左側電梯導航時,也需要對應起來,因為在點擊時,按鈕會有一個特殊類用於突出顯示,如果從5層跳到1層,會經過4,3,2,這樣就會看到整個跳轉的過程,所以,這裏需要用到一個off()方法,用於取消綁定事件,$(window).off(‘scroll’); 因為你移除了scroll事件,當前這個LI具備特殊類名還要再書寫一次,最後只需要判斷當前點擊的是第幾層,做相應的操作即可。

       $(‘.dianTi li‘).click(function(event) {
            //在動畫運動的過程中,不希望current特殊類名跟著滿世界跑
            //所以把讓current滿世界跑的源頭掐掉
            //源頭:$(window).scroll()
            $(window).off(‘scroll‘);
            //因為你移除了scroll事件,當前這個LI具備特殊類名還要再書寫一次
            $(this).addClass(‘current‘).siblings(‘li‘).removeClass(‘current‘);
            //需要知道現在要往幾層樓跳
            //得到當前這個LI的序號,這個序號加1就是你需要去的樓層
            var i=$(this).index()+1;
            if(i==5){
                //要往第5層跳
                //檢測樓層時,希望的差不多到了;跳轉時,需要精確,所以再加上100
                //f5Top是5層距離document (0,0)點的距離
                //但是當動畫執行完畢了,還要繼續檢測樓層
                $(‘html,body‘).stop().animate({‘scrollTop‘:f5Top+100}, 500,function(){
                    $(window).scroll(jianCe);
                }); 
            }else if(i==4){
                $(‘html,body‘).stop().animate({‘scrollTop‘:f4Top+100}, 500,function(){
                    $(window).scroll(jianCe);
                });
            }else if(i==3){
                $(‘html,body‘).stop().animate({‘scrollTop‘:f3Top+100}, 500,function(){
                    $(window).scroll(jianCe);
                });
            }else if(i==2){
                $(‘html,body‘).stop().animate({‘scrollTop‘:f2Top+100}, 500,function(){
                    $(window).scroll(jianCe);
                });
            }else if(i==1){
                $(‘html,body‘).stop().animate({‘scrollTop‘:f1Top+100}, 500,function(){
                    $(window).scroll(jianCe);
                });
            }
        });

scroll()和scrollTop()方法——實現電商網站中的電梯導航