JavaScript實現樓梯滾動特效(jQuery實現)
阿新 • • 發佈:2021-09-23
想必大家都用過JD,在它的首頁裡面有個很常見的特性:就是 樓梯特效 。
對於程式設計師的我們,可以說是萬物皆可盤。那麼,我們就來盤一下它。
先上要實現的效果圖:
效果功能描述:當點選右側懸浮的按鈕時,點選相應模組,左側內容區域會自動跳轉到該模組區域。
下面,上程式碼:
<!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; } li{ list-style-type: none; } .top{ height:900px; background : #ddd; } .footer{ height : 600px; background : #ddd; } .content{ height:800px; } .content h1{ text-align:center; line-height: 80px; } .stairs-list{ width : 60px; position: fixed; right:5%; top:50%; margin-top:-120px; background : #fff;} .stairs-list li{ width:50px; height:50px; line-height: 25px; text-align : center; padding:5px; border-bottom:1px solid #ddd; } .stairs-list li.active{ color : orangered; } .stairs li span{ display: block; } </style> </head> <body> <div class="top"> </div> <divFrEjUNZPclass="content" style="background-color : yellowgreen "> <h1>京東秒殺</h1> </div> <div class="content" style="background-color : skyblue "> <h1>特色優選</h1> </div> <div class="content" style="background-color : #666 "> <h1>頻道廣場</h1> </div> <div class="content" style="background-color : orangered "> <h1>為您推薦</h1> </div> <div class="footer"></div> <ul class="stairs-list"> <li> <span>京東</span> <span>秒殺</span> </li> <li> <span>特色</span> <span>優選</span> </li> <li> <span>頻道</span> <span>廣場</span> </li> <li> <span>為您</span> <span>推薦</span> </li> </ul> <script src="https://cdn.boot.com//3.4.1/jquery.min."></script> <script> // OOA : // 1. 初始化資料; // 2. 事件繫結; // 3. 根據scrollTop值判定所在樓層; // 4. 效果新增; // 5. 根據點選事件切換下標; function Stairs( options ){ this.options = options; this.init(); } Stairs.prototype = { constructor : Stairs,init : function(){ // 內容元素高度陣列; this.content_ele_offset_top_list = []; // 獲取元素的偏移高度; $(this.options.content_selector).offset( function( index,coords) { // 將每一個元素的高度值放入高度列表之中; this.content_ele_offset_top_list.push(coords.top); return cwww.cppcns.comoords; }.bind(this)) // 獲取最小高度值; var _length = this.content_ele_offset_top_list.length ; this.min_top = this.content_ele_offset_top_list[0]; this.max_top = this.content_ele_offset_top_list[_length - 1] + $(this.options.content_selector).last().height(); this.content_ele_offset_top_list.push(this.max_top); FrEjUNZP this.bindEvent(); },bindEvent:function(){ var $body_html = $("body,html"); // 儲存例項物件的指標; // var _this = this; var instance = this; // 高頻執行的scroll事件; // 優化 : 節流 ; $(document).scroll( function(){ var scrollTop = $body_html.scrollTop(); this.calStairsIndex(scrollTop); }.bind(this)) $(this.options.stairs_selector).click(function(){ // 知道當前發生事件的元素是誰; this; 因為這jQuery事件繫結處理沒有辦法,在外部傳入當前發生事件的元素; 這個this不能變; // 當前的例項物件是誰; this; var index = $(this).index(instance.options.stairs_selector); instance.changeScrollTop(index); }) },// 計算當前樓層; calStairsIndex : function( st ){ // 沒有到達樓梯區域進行隔離; if(st < this.min_top || st &FrEjUNZPgt; this.max_top){ // console.log(-1); this.index = -1; this.changeStairsBtn(); return false }; // 如果還在範圍之內不用繼續判斷; var _list = this.content_ele_offset_top_list; // 如果 st 還在當前index 範圍之內則不繼續進行查詢; if(st >= _list[this.index] && st < _list[this.index + 1]){ return false; } // 遍歷 ; for(var i = 0 ; i < _list.length ; i ++){ if(st >= _list[i] && st < _list[i + 1]){ this.index = i; break; } } this.changeStairsBtn(); },changeStairsBtn : function(){ if(this.index === -1){ $(this.options.stairs_selector).removeClass("active"); return false; } $(this.options.stairs_selector).eq(this.index).addClass("active") .siblings() .removeClass("active"); },changeScrollTop : function( index ){ $("body,html").scrollTop(this.content_ele_offset_top_list[index]); // 事件觸發器; $(document).trigger("scroll"); } } var staris = new Stairs({ content_selector : ".content",stairs_selector : ".stairs-list li" }); console.log(staris); </script> </body> </html>
現在,我們也能實現跟它一樣的功能效果了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。