jQuery實現電梯導航特效

来源:https://www.cnblogs.com/sunyan-blog/archive/2019/12/02/11966577.html
-Advertisement-
Play Games

功能描述: 當滾動條滑到某個位置時,顯示電梯導航; 當用戶滾動滾動條時,讓電梯導航的選中狀態和當前滾動到的區域保持一致; 當用戶點擊電梯導航時,滾動條滾動到被點擊導航對應的區域 準備工作: 首先將jQuery文件以及你自己的js文件引入你的html里,jq文件要放在上面 <script src="j ...


功能描述:

  當滾動條滑到某個位置時,顯示電梯導航; 

  當用戶滾動滾動條時,讓電梯導航的選中狀態和當前滾動到的區域保持一致;

  當用戶點擊電梯導航時,滾動條滾動到被點擊導航對應的區域

準備工作:

首先將jQuery文件以及你自己的js文件引入你的html里,jq文件要放在上面

<script src="js/jquery.min.js"></script>
<script src="js/index.js"></script>

HTML代碼:

 1 <body>
 2     <div class="slider-bar">
 3         <ul>
 4             <li>頭部區域</li>
 5             <li class="current">導航區域</li>
 6             <li>第一部分</li>
 7             <li>第二部分</li>
 8             <li>第三部分</li>
 9             <li>底部區域</li>
10         </ul>
11     </div>
12     <div class="header w">頭部區域</div>
13     <div class="banner w">banner區域</div>
14     <div class="main w">主體部分1</div>
15     <div class="main w">主體部分2</div>
16     <div class="main w">主體部分2</div>
17     <div class="footer w">footer部分</div>
18 </body>
 1 <style>
 2     * {
 3         margin: 0;
 4         padding: 0;
 5     }
 6     li {
 7         list-style: none;
 8     }
 9     .slider-bar {
10         display: none;
11         position: fixed;
12         left: 47%;
13         top: 160px;
14         margin-left: 600px;
15         width: 45px;
16         height: 305px;
17         background-color: pink;
18         cursor: pointer;
19         overflow: hidden;
20     }
21     .slider-bar li {
22         font-size: 15px;
23         padding: 5px;
24         border-bottom: 1px solid #fff;
25     }
26     .slider-bar li:hover {
27         background-color: red;
28         color: #fff;
29     }
30     .current {
31         background-color: red;
32         color: #fff;
33     }
34     .w {
35         width: 1100px;
36         margin: 10px auto;
37     }
38     .header {
39         height: 150px;
40         background-color: purple;
41     }
42     .banner {
43         height: 300px;
44         background-color: skyblue;
45     }
46     .main {
47         height: 500px;
48         background-color: yellowgreen;
49     }
50     .footer {
51         height: 300px;
52         background-color: orange;
53     }
54 </style>
CSS樣式代碼

 

具體功能實現:

1. 當用戶滑動到banner區域時,顯示電梯導航。封裝成一個函數toggleTool()

1 function toggleTool() {
2     if($(document).scrollTop() > $(".banner").offset().top - 1) {
3         $(".slider-bar").fadeIn();  // fadeIn()淡入(顯示)
4     } else {
5         $(".slider-bar").fadeOut(); // fadeOut()淡出(隱藏)
6     }
7 }

2. each()遍歷所有模塊,讓電梯導航的選中狀態和對應模塊區域保持一致。封裝成一個函數eachTool()

如果滾動上去的高度($(document).scrollTop())大於模塊距離文檔頂部的距離($(ele).offset().top),說明滾動到了相應模塊。給對應的電梯導航添加current類(選中狀態),並移除其他導航的current類;

但是如果footer部分太短,那footer對應的導航永遠也不會成選中狀態,所以要再寫一個判斷,判斷是否滾動到底部;

(滾上去的高度)+(當前視窗的高度)>=(整個文檔的高度)時說明滾動到了底部,給footer添加current 並移除其他current

 1 function eachTool() {
 2     if(flag) {  // flag互斥鎖 當它為true時才執行裡邊的代碼
 3         $(".w").each(function(i, ele) {   // i是索引,ele是遍歷對象
 4             // 減1是為瞭解決一個小bug
 5             if($(document).scrollTop() > $(ele).offset().top - 1) {
 6                 // 給對應導航添加current類,並移除其他導航的current類(li里就這一個類,寫不寫上current都行)
 7                 $(".slider-bar li").eq(i).addClass("current").siblings().removeClass();
 8             } else if($(window).scrollTop() + $(window).height() >= $(document).height() - 1) {
 9                 // 當頁面滾到底部時,給footer對應的導航添加current類
10                 var footIndex = $(".slider-bar li").length - 1;
11                 $(".slider-bar li").eq(footIndex).addClass("current").siblings().removeClass();
12             }
13         })
14     }
15 }

給window對象綁定滾動事件,當頁面滾動時調用上面那兩個函數;

當然,為了防止用戶刷新頁面時導航條顯示不正確,所以當頁面載入完時我們先調用一次

1 toggleTool(); 
2 eachTool();
3 $(window).scroll(function(e) {
4     toggleTool();
5     eachTool();
6 })

3. 用戶點擊導航,讓滾動條滾到對應的區域;

用戶點擊導航時頁面會滾動,就會觸發頁面滾動事件,會執行eachTool()里的背景選擇(選中狀態),所以點擊導航後先讓flag改為false,禁止執行eachTool()里的內容;

獲取用戶當前點擊的li的索引index,正好對應的就是相應模塊的索引,知道了是哪個模塊 就可以算出這個模塊距離文檔頂部的距離。調用動畫函數animate()讓滾動條滾動到這個高度;

執行完動畫後要把flag改為true,不然flag永遠是false,就沒辦法執行eachTool()里的內容

 1 $(".slider-bar li").click(function(e) {
 2     flag = false;
 3     // 將模塊距離頂部的高度,賦值給current
 4     var current = $(".w").eq($(this).index()).offset().top;  // $(".w").eq(index) 選擇器,選擇第幾個元素
 5     $("html").stop().animate({  // 調用動畫前先stop()停止其他未完成的動畫(解決排隊問題)
 6         scrollTop: current
 7     }, function() {   // 回調函數,動畫完成後執行
 8         flag = true;
 9     })
10     // 點擊添加current類(選中狀態) 並移除兄弟節點的current類
11     $(this).addClass("current").siblings().removeClass();
12 })

 

完整JavaScript代碼:

 1 $(function() {
 2     // 節流閥(互斥鎖) 用來解決一個小bug(當用戶點擊導航條時,頁面滾動會觸發eachTool()里的內容,當我們點擊時不需要觸發eachTool())
 3     var flag = true;
 4     // 當用戶滑動到banner區域,顯示電梯導航。封裝成一個函數toggleTool()
 5     function toggleTool() {
 6         if($(document).scrollTop() > $(".banner").offset().top - 1) {
 7             $(".slider-bar").fadeIn();  // fadeIn()淡入(顯示)
 8         } else {
 9             $(".slider-bar").fadeOut(); // fadeOut()淡出(隱藏)
10         }
11     }
12     // each()遍歷所有模塊,讓電梯導航和對應模塊保持一致。封裝成一個函數eachTool()
13     function eachTool() {
14         if(flag) {
15             $(".w").each(function(i, ele) {   // i是索引,ele是遍歷對象
16                 // 如果滾動上去的高度大於模塊距離文檔頂部的距離,說明滾動到了相應模塊(減1是為瞭解決一個小bug)
17                 if($(document).scrollTop() > $(ele).offset().top - 1) {
18                     // 給對應的電梯導航添加current類,並移除兄弟的current類(li里就這一個類,寫不寫上current都行)
19                     $(".slider-bar li").eq(i).addClass("current").siblings().removeClass();
20                 // 如果footer部分太短,那footer對應的導航永遠也不會亮了,所以要再寫一個判斷↓判斷是否滾動到底部
21                 } else if($(window).scrollTop() + $(window).height() >= $(document).height() - 1) {
22                     // 當頁面滾到底部時,給footer對應的導航添加current類
23                     var footIndex = $(".slider-bar li").length - 1;
24                     $(".slider-bar li").eq(footIndex).addClass("current").siblings().removeClass();
25                 }
26             })
27         }
28     }
29     // 先調用兩個函數,以防用戶刷新頁面後不顯示
30     toggleTool(); 
31     eachTool();
32     $(window).scroll(function(e) {
33         toggleTool();
34         eachTool();
35     })
36 
37     // 用戶點擊導航,讓滾動條滾到相應模塊
38     $(".slider-bar li").click(function(e) {
39         // 點擊li頁面也會滾動,就會觸發頁面滾動事件,會執行eachTool()里的背景選擇
40         // 所以點擊li後讓flag為false,禁止執行eachTool()里的內容
41         flag = false;
42         // $(this).index()獲取用戶當前點擊的li的索引,正好對應的就是相應模塊索引
43         // 得到相應模塊索引就可以算出這個模塊距離頂部的高度,賦值給current
44         var current = $(".w").eq($(this).index()).offset().top;  // $(".w").eq(index) 選擇器,選擇第幾個元素
45         $("html").stop().animate({  // 調用動畫前先stop()停止其他未完成的動畫(解決排隊問題)
46             scrollTop: current
47         }, function() {   // 回調函數,動畫執行完後執行
48             flag = true;   // 讓flag變為true,不然flag永遠是false,沒辦法執行eachTool()里的內容
49         })
50         // 點擊添加current類 並移除兄弟節點的current類
51         $(this).addClass("current").siblings().removeClass();
52     })
53 })

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在使用jquery-validate.js插件時可以做一些初始化配置在初始化jquery-validate.js對象的時候,將外部的一些配置和該插件內部的一些預設配置合併在一起,如果有相同的配置,前者覆蓋後者(預設)的配置 // Constructor for validator $.validat ...
  • JS是一門什麼樣的語言? 是一門解釋性的語言 是一門腳本語言 是一門弱類型語言,聲明變數都用var 是一門基於對象的語言 是一門動態類型的語言: 1. 代碼(變數)只有執行到這個位置的時候,才知道這個變數中到底存儲的是什麼,如果是對象,就有對象的屬性和方法,如果是變數就是變數的作用 2. 對象沒有什 ...
  • 1. 簡書類 實現效果 html代碼 <div class="container"> <form action="" class="parent"> <input type="text" class="search" placeholder="搜索"> <input type="button" na ...
  • javascript 報錯 string.split is not a function ...
  • 自定義html元素滑鼠右鍵菜單 實現思路 在觸發contextmenu事件時,取消預設行為(也就是阻止瀏覽器顯示自帶的菜單),獲取右鍵事件對象,來確定滑鼠的點擊位置,作為顯示菜單的left和top值 編碼實現 <!DOCTYPE html> <html> <head> <meta charset=" ...
  • 功能:在文本框中輸入待辦事項按下回車後,事項會出現在未完成列表中;點擊未完成事項前邊的覆選框後,該事項會出現在已完成列表中,反之亦然;點擊刪除按鈕會刪除該事項。待辦事項的數據是保存到本地存儲的(localStorage),就算關閉頁面再打開,數據還是存在的(前提是要用相同瀏覽器)。 ToDoList ...
  • 基於Taro多端實踐TaroPop:自定義模態框|dialog對話框|msg消息框|Toast提示 taro自定義彈出框支持編譯到多端H5/小程式/ReactNative,還可以自定義彈窗類型/彈窗樣式、多按鈕事件/樣式、自動關閉、遮罩層、彈窗顯示位置及自定義內容模板 用法 ▍在相應頁面引入組件 i ...
  • 創建對象三種方式: 調用系統的構造函數創建對象 自定義構造函數創建對象(結合第一種和需求通過工廠模式創建對象) 字面量的方式創建對象 第一種:調用系統的構造函數創建對象 //小蘇舉例子: //實例化對象 var obj = new Object(); //對象有特征 屬性;和 行為 方法 //添加屬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...