亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

使用Sticky組件實現帶sticky效果的tab導航和滾動導航的方法

2019-11-20 10:21:49
字體:
來源:轉載
供稿:網友

sticky組件,通常應用于導航條或者工具欄,當網頁在某一區域滾動的時候,將導航條或工具欄這類元素固定在頁面頂部或底部,方便用戶快速進行這類元素提供的操作。

在這篇文章Sticky組件的改進實現提供了一個改進版的sticky組件,并將演示效果應用到了自己的博客。有了類似sticky的這種簡單組件,我們就可以在利用它開發更豐富的效果,比如本文要介紹的tab導航和滾動導航。實現簡單,演示效果如下:

tab導航(對應tab-sticky.html):

滾動導航(對應nav-scroll-sticky.html):

1. tab導航的實現

tab導航的需求是:在點擊導航項的時候,除了切換tab內容,還要控制滾動,將要顯示的tab內容置頂,并且要剛好顯示在sticky元素的下邊。由于demo是用bootstrap做的,bootstrap提供的tab組件非常簡單好用,我們可以在tab組件提供的shown.bs.tab的事件回調里做滾動控制處理,所以這個效果實現起來比較容易:

<script>var $target = $('#target');new Sticky('#sticky', {unStickyDistance: 60,target: $target,wait: 1,isFixedWidth: false,getStickyWidth: function($elem) {return $elem.parent()[0].offsetWidth;}});$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {window.scrollTo(0, $target[0].getBoundingClientRect().top + getPageScrollTop() + 1);});function getPageScrollTop() {return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;}</script>

html結構:


2. 滾動導航實現

滾動導航相對麻煩一些,tab組件里面,只會顯示與當前激活的tab項對應的tab內容,而滾動導航里面,要導航的所有內容都是已經在頁面中渲染完畢的,它的需求是:

1)點擊導航項的時候,控制頁面滾動,自動將與點擊的導航項對應的內容置頂顯示,并且要剛好顯示在sticky元素的下邊;

2)頁面滾動的時候,根據當前顯示的導航內容自動給相應的導航項添加active樣式。

盡管聽起來復雜,但是demo中的實現還是比較容易:

<script>var $sticky = $('#sticky');var $target = $('#target');new Sticky($sticky, {unStickyDistance: 60,target: $target,wait: 1,isFixedWidth: false,getStickyWidth: function ($elem) {return $elem.parent()[0].offsetWidth;}});var offsetTop = 60;//實現點擊tab項自動滾動到導航內容的效果$sticky.on('click', 'a', function (e) {e.preventDefault();var $this = $(e.currentTarget);var $parent = $this.parent();if($parent.hasClass('active')) return;$sticky.find('li.active').removeClass('active');$parent.addClass('active');var target = $this.data('target') || $this.attr('href');var $target = $(target);window.scrollTo(0, Math.floor($target[0].getBoundingClientRect().top) + getPageScrollTop() - offsetTop);});/*** Math.floor是解決rect.top或rect.bottom帶小數問題*///實現滾動時根據當前顯示的導航內容自動給相應的導航項添加active樣式$(window).scroll(throttle(function(){var $curItem = $sticky.find('a').filter('[href=' + getCurTarget() + ']');var $parent = $curItem.parent();if($parent.hasClass('active')) return;//最后的blur是為了去掉:active及:focus偽類的樣式$sticky.find('li.active').removeClass('active').find('a').trigger('blur');$parent.addClass('active');},1));//獲取當前顯示的導航內容元素的idfunction getCurTarget() {for(var targets = ['#First', '#Second', '#Third'], i = 0, l = targets.length; i < l; i++) {var curRect = $(targets[i])[0].getBoundingClientRect();if(Math.floor(curRect.top) <= offsetTop && Math.floor(curRect.bottom) > offsetTop) {return targets[i];}}return targets[0];}function getPageScrollTop() {return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;}//這個函數在實際工作中是應該抽出來的,否則sticky.js里面還有一份重復的function throttle(func, wait) {var timer = null;return function () {var self = this, args = arguments;if (timer) clearTimeout(timer);timer = setTimeout(function () {return typeof func === 'function' && func.apply(self, args);}, wait);}}</script>

html結構:


3. 總結

本文結合sticky組件,提供了2種導航效果實現,兼容IE9+,firefox以及chrome,感興趣可以下載源碼再去詳細了解。在實現tab導航的時候,因為有bs的tab組件所以實現起來非常容易,也沒有必要把sticky跟tab組件再封裝起來形成一個新組件,畢竟效果的實現代碼已經比較簡單了。在實現滾動導航的時候,因為沒有用tab組件,所以滾動導航的那兩個需求點都是單獨實現的,在實際情況中,這兩個功能可以封裝成2個獨立的組件或者1個組件,這樣就能把實現代碼寫的像tab導航那樣簡單,不過本文沒有再深入去介紹這兩個組件的寫法,因為這不是本文主要想介紹的內容,雖然我很想這么做,后續肯定會再寫博客來介紹這兩個組件,簡單的東西不造一下輪子,簡直是浪費機會。在實現這兩個效果的時候,也有2點收獲:

1)firefox以及IE,先讓網頁,然后再刷新,雖然網頁還會顯示在刷新的位置,但是不會觸發scroll事件,所以今后做scroll相關的組件,一定在組件初始化的時候主動掉一次scroll相關的回調;

2)getBoundingClientRect返回的rect對象相關的值,在IE和firefox下,都可能是小數,比如60.2222299999,這樣的數,在進行判斷的時候可能會跟預期情況不符,導致一些意外的BUG,如果不是特別嚴謹的話,可以用Math.floor對這些值進行取整,然后再用來計算或者判斷。比如滾動導航實現中,rect.top的值60.2222299999,offsetTop的值是60,期望是curRect.top <= offsetTop這個條件能夠成立,因為小數的原因,所以它不成立。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线高清精品| 日韩免费av片在线观看| 成人av番号网| 成人黄色片在线| 亚洲国产欧美日韩精品| 亚洲 日韩 国产第一| 亚洲在线免费观看| 九九综合九九综合| 亚洲视频在线视频| 亚洲午夜精品久久久久久性色| 亚洲国产精品久久精品怡红院| 91免费的视频在线播放| 久久免费视频观看| 亚洲春色另类小说| 国产精品自拍偷拍视频| 欧美极品第一页| 国产精品久久久久秋霞鲁丝| 久久激情五月丁香伊人| 亚洲有声小说3d| 日韩成人在线视频| 国产精品88a∨| 欧美有码在线观看视频| 日韩欧美国产黄色| 亚洲一区www| 欧美激情xxxxx| 欧洲成人在线视频| 精品一区二区三区三区| 亚洲xxxx18| 亚洲视频专区在线| 亚洲一品av免费观看| 午夜精品美女自拍福到在线| www.xxxx精品| 欧美一区亚洲一区| 欧美在线免费视频| 日韩成人av在线播放| 欧美精品一区二区免费| 亚洲毛片在线免费观看| 日韩欧中文字幕| 国产精品视频成人| 欧美在线视频免费观看| 国产精品揄拍500视频| 亚洲第一视频网| 欧美激情xxxx性bbbb| 成人淫片在线看| 欧美日韩午夜视频在线观看| 日韩av成人在线观看| 日韩高清电影免费观看完整| 亚洲性69xxxbbb| 91国偷自产一区二区三区的观看方式| 日韩av在线直播| 亚洲免费av片| 国产一区二区三区日韩欧美| 欧美日韩一区二区免费在线观看| 国产精品美女999| 欧美性猛交视频| 国产精品福利观看| 欧美日韩ab片| 亚洲国产精品网站| 伊人av综合网| 欧美最顶级丰满的aⅴ艳星| 韩曰欧美视频免费观看| 亚洲美女喷白浆| 欧美成人精品在线观看| 91精品在线一区| 欧美激情综合亚洲一二区| 国产精品大片wwwwww| 久久久久一本一区二区青青蜜月| 亚洲欧美日韩精品久久奇米色影视| 超碰精品一区二区三区乱码| 亚洲成人在线网| 91精品在线影院| 亚洲第一网站免费视频| 久久夜色精品国产| 国产精品视频久| 亚洲精品一区二区三区不| 91国产一区在线| 国产精品高潮呻吟久久av黑人| xxxxxxxxx欧美| 日韩精品视频免费专区在线播放| 亚洲精品自在久久| 亚洲国产日韩精品在线| 欧美精品国产精品日韩精品| 欧美精品999| 中文字幕在线国产精品| 欧美激情国产精品| 奇米4444一区二区三区| 亚洲最大的av网站| 91黑丝在线观看| 久久91亚洲人成电影网站| 国产精品久久久久久久天堂| 按摩亚洲人久久| 亚洲成人在线网| 国产中文欧美精品| 国产精品中文字幕久久久| 久久久91精品国产| 欧美午夜宅男影院在线观看| 97碰在线观看| 日韩欧美国产免费播放| 亚洲图片制服诱惑| 欧美亚洲免费电影| 国产在线999| 国产精品高潮呻吟视频| 欧美大胆在线视频| 777精品视频| 亚洲成人激情视频| 欧美日韩亚洲精品内裤| 欧美日韩国产中字| 午夜精品理论片| 国产精品亚洲精品| 日韩有码在线观看| 亚洲欧美制服第一页| 亚洲区中文字幕| 亚洲国产精品嫩草影院久久| 成人中文字幕在线观看| 久久精品男人天堂| 久久久久久久久中文字幕| 国产精品久久久久久久久影视| 日韩av电影手机在线| 国产精品一区二区久久精品| 亚洲午夜精品久久久久久久久久久久| 韩国三级日本三级少妇99| 久久99久久亚洲国产| 国产精品久久久亚洲| 欧美一区二区三区……| 久久久黄色av| 久久6免费高清热精品| 97在线视频免费观看| 日韩精品999| 欧美性极品少妇精品网站| 91理论片午午论夜理片久久| 爽爽爽爽爽爽爽成人免费观看| 国产成人精品一区二区| 欧美国产精品va在线观看| 伊人伊成久久人综合网小说| 精品小视频在线| 在线成人激情视频| 日韩精品久久久久| 日韩av不卡电影| 亚洲xxx大片| 激情成人在线视频| 欧美一区二区大胆人体摄影专业网站| 欧美亚洲另类视频| 国产欧美日韩中文| 成人免费在线视频网址| 久久精品视频va| 日本成人在线视频网址| 日韩国产欧美精品一区二区三区| 欧美夜福利tv在线| 亚洲国产欧美久久| 亚洲福利在线看| 欧美成人性生活| 欧美多人乱p欧美4p久久| 亚洲自拍偷拍一区| 国产在线精品一区免费香蕉| 91欧美精品成人综合在线观看| 成人中心免费视频| 亚洲最大福利视频网| 国产精品一久久香蕉国产线看观看| 国产日韩欧美夫妻视频在线观看| 91精品91久久久久久| 91久久嫩草影院一区二区| 久久成年人免费电影| 91国产精品91| 久久免费少妇高潮久久精品99|