JavaScript目錄菜單滾動反顯組件,有以下兩個特點
- 每個導航菜單項(nav)對應頁面一個內容區域(content)
- 滾動頁面到特定內容區域(content)時,對應的菜單會自動切換,一般會添加一個高亮樣式
這個功能可以很方便的提醒用戶目前所瀏覽的位置,有時目錄菜單還會設計為滾動時一直固定在指定位置。
以下為此類功能的應用示例:
1. 京東團購首頁左側導航菜單
2. 京東圖書詳細頁右側圖書目錄導航
3. 京東團購品牌惠樓層分類菜單
實現思路:
和吸頂燈類似,也是滾動在特定內容的時候去對特定的元素做樣式處理。不同的是這里的每一個菜單項一一對應相應的內容區域。
- 給菜單和內容區域加特定的屬性(data-xx),關聯起對應關系
- 記錄所有內容(content)的位置信息(注意,需要在頁面load后)
- 給window添加scroll事件,當滾動到指定內容時高亮顯示對應的菜單項(因為是一一對應的,通過索引就可以找到對應菜單項)
如果使用了jQuery,通過插件方式實現不過50行代碼
/* * 導航/菜單高亮組件 * option * nav 導航/菜單選擇器 * content 內容模塊選擇器 * diffTop 距離頂部的誤差值 * diffBottom 距離底部的誤差值 * lightCls 高亮的class * */ $.fn.navLight = function(option, callback) { option = option || {} var nav = option.nav || '[data-widget=nav]' var content = option.content || '[data-widget=content]' var diffTop = option.diffTop || 200 var diffBottom = option.diffBottom || 500 var lightCls = option.lightCls || 'curr' var $self = $(this) var $nav = $self.find(nav) var $content = $self.find(content) // 記錄每個分類的位置 var contentPosi = $content.map(function(idx, elem) { var $cont = $(elem) var top = $cont.offset().top var height = $cont.height() return { top: top-diffTop, bottom: top+diffBottom, jq: $cont } }) var $win = $(window) var $doc = $(document) var handler = $.throttle(function(e) { var dTop = $doc.scrollTop() highLight(dTop) }, 100) function highLight(docTop) { contentPosi.each(function(idx, posi) { if (posi.top < docTop && posi.bottom > docTop) { $nav.removeClass(lightCls) $nav.eq(idx).addClass(lightCls) if (callback) { callback($nav, $content) } } }) } $win.scroll(handler) };