用jq實現簡單的錨點切換


功能描述

想了半天 還是沒有取好名字,這是一個蠻難形容的效果,不過現在的很多門戶網站都會有這樣的效果。

舉個栗子:
頁面分為四個區域:
 
當瀏覽到頁面的相應區域時,這塊指示牌上的對應版塊高亮顯示。並且點擊指示牌上的對應版塊,也可以將頁面滑動到指定的區域。
 
知識點概要
 
1.$(window).scroll()
         當用戶滾動指定的元素時,會發生 scroll 事件。 scroll 事件適用於所有可滾動的元素和 window 對象(這里主要監聽瀏覽器窗口)。

   scroll() 方法觸發 scroll 事件,或規定當發生 scroll 事件時運行的函數。

2.scrollTop()

          scrollTop() 方法返回或設置匹配元素的滾動條的垂直位置。 scroll top offset 指的是滾動條相對於其頂部的偏移。

    如果該方法未設置參數,則返回以像素計的相對滾動條頂部的偏移。

3.offset()

          offset() 方法返回或設置匹配元素相對於文檔的偏移(位置)。 返回第一個匹配元素的偏移坐標。

    該方法返回的對象包含兩個整型屬性:top 和 left,以像素計。此方法只對可見元素有效。

 
功能實現
    首先我們需要將頁面上的區域對應的DOM塊插入一個數組中,方便獲取每塊區域在頁面中的位置。
1     var top_Arr =[];
2     varAbout_main= $(".About_main")
3     //將所需的區域對應的Class插入jq選擇器隊列中,並通過each遍歷到數組中
4     $(".About_main,.About_main1").each(function(){
5     top_Arr.push($(this))
6     })

 

我的html代碼 布局如下:
指示牌的html代碼為:
 1     <divclass="About_nav">
 2     <divclass="tab1">
 3     <ul>
 4     <liclass="slt"><imgclass="sanjiao"style="bottom:0; left:78px;"src="images/sanjiao.png"/><astyle="background-position:18px-26px;">公司簡介</a></li>
 5     <li><imgclass="sanjiao"style="bottom:0; left:261px;"src="images/sanjiao.png"/><astyle="background-position:-32px0;">發展歷程</a></li>
 6     <li><imgclass="sanjiao"style="bottom:0; left:444px;"src="images/sanjiao.png"/><astyle="background-position:-136px0;">團隊風采</a></li>
 7     <li><imgclass="sanjiao"style="bottom:0; left:627px;"src="images/sanjiao.png"/><astyle="background-position:-80px0;">領導關懷</a></li>
 8     </ul>
 9     </div>
10     </div>

 

scroll事件代碼如下:
 1     $(window).scroll(function(){
 2     About_main.each(function(i){
 3     //將對應區域距離頁面頭部的距離 保存到一個變量中
 4     var sss =($(this).offset().top)-200,
 5     //滾動條已滾動的距離
 6     winST = $(window).scrollTop(),
 7     //判斷當前頁面是否處於某個區域中
 8     inArea = sss < winST && winST <(sss + $(this).height());
 9     if(inArea){
10     //移除所有高亮class
11     $(".tab1 li.slt").removeClass("slt")
12     //將所有指示牌圖標改為為紅色背景
13     $(".tab1 li a").position_y(0)
14     //將區域對應的指示牌圖標變為白色背景 並且添加高亮class
15     $(".tab1 li").eq(i).addClass("slt").find("a").position_y(-26)
16     }
17     })
18     })

 

代碼中的position_y為修改background-position的對應y軸的值:
 1     $.fn.extend({
 2     position_x:function(x){
 3     var _this = $(this)
 4     _this.each(function(){
 5     var y = $(this).css("background-position").split('px')[1]
 6     $(this).css("background-position", x +"px"+ y +"px")
 7     })
 8     return _this
 9     },
10     position_y:function(y){
11     var _this = $(this)
12     _this.each(function(){
13     var x = $(this).css("background-position").split('px')[0]
14     $(this).css("background-position", x +"px "+ y +"px")
15     })
16     return _this
17     }
18     })

 

然后是點擊指示牌的某版塊 可以將頁面滑動到版塊對應的區域:
1     $(".tab1 li").click(function(){
2     var index = $(this).index()
3     $('body,html').animate({ scrollTop: top_Arr[index].offset().top -100},800);
4     })

 

具體的功能代碼已經全部貼上,基本上的問題 也在注釋中已經注明,其中 需要特別提一下的是:
1. sss = ( $ ( this ). offset (). top ) - 200
    這里為什么要-200?因為我這里的指示牌是fixed定位在頁面的頂部,如果沒有這200像素的偏移,將會導致指示牌遮擋住區域的內容。
2. inArea = sss < winST && winST < ( sss + $ ( this ). height ());
   貼個圖片更形象一點(畫的有點難看,各位看官意思下看得懂就行。。),下圖所示對應的 sss和winST都是指什么。

這塊代碼的意思就是 當頁面處於區域范圍之中時,返回true。sss是區域塊到頁面頂部的距離,假如 sss < winST  說明當前看得見的頁面處於這個區域的上邊框的下方。 winST < ( sss + $ ( this ). height ()) 指的是看得見的部分處於對應區域的下邊框的上方。然而滿足這兩個條件就可以說明,當前的可視區域處於對應的區域范圍中。
 
總結
    這段功能的實現 並不是有多么高的技術含量,是很基本的方法的運用。貼出來也是為一些想實現該效果,但是心中沒有頭緒,只能找另外的插件來實現的前端道友看看的,請大神看到這段代碼,留下寶貴的意見 因為代碼還是存在很多問題或者需要優化。
 
 
 
 
 
 
 






免責聲明!

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



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