jQuery仿寫(xiě)百度百科的目錄樹(shù)
一、首先來(lái)看一下需求(截圖為百度百科“醫(yī)?!痹~條):
1、點(diǎn)擊右側(cè)的目錄樹(shù),左側(cè)跳轉(zhuǎn)到指定的錨點(diǎn)位置;
2、滾動(dòng)鼠標(biāo),游標(biāo)跟隨一起滾動(dòng)至響應(yīng)鏈接位置

二、實(shí)現(xiàn)思路
1、針對(duì)第一個(gè)需求,只需要設(shè)置游標(biāo)所在div和右側(cè)列表div的position為fixed,根據(jù)瀏覽器窗口定位,然后給左側(cè)文章各區(qū)塊增加id,為右側(cè)列表每一項(xiàng)增加對(duì)應(yīng)的href屬性指向響應(yīng)的錨點(diǎn)即可;
2、針對(duì)第二個(gè)需求,定義鼠標(biāo)的滾動(dòng)事件mousewheel(在ff下事件為DOMMouseScroll),當(dāng)時(shí)自己琢磨了半天用各種方法計(jì)算,但效果始終無(wú)法達(dá)到要求,后來(lái)分析了百度的實(shí)現(xiàn)源碼恍然大悟,具體實(shí)現(xiàn)參考下圖和代碼部分。

三、代碼實(shí)現(xiàn)
/**定于延時(shí)執(zhí)行函數(shù)**/
var timeFun = null;
/**找到當(dāng)前頁(yè)面滾動(dòng)到的錨點(diǎn)位置**/
var findHref = function(){
var $links = $('.link');
var windowScrollTop = $(window).scrollTop();
var maxDistance = 10000;
var result = $links.eq(0);
$.each($links,function(i,link){
var curDistanceToTop = Math.abs($links.eq(i).offset().top - windowScrollTop);
/**if(maxDistance > curDistanceToTop && ($links.eq(i).offset().top < (windowScrollTop + $(window).height()))){
maxDistance = curDistanceToTop;
result = $links.eq(i);
} 這段代碼相當(dāng)于下面這一句代碼,優(yōu)秀的代碼就應(yīng)該拿來(lái)多學(xué)習(xí)!**/
maxDistance > curDistanceToTop && $links.eq(i).offset().top < windowScrollTop + $(window).height() && (maxDistance = curDistanceToTop,result = $links.eq(i))
});
return result;
};
/***使用jQuery創(chuàng)建移動(dòng)動(dòng)畫(huà)*/
var move = function (dis) {
var $arrow = $('.arrow');
$arrow.animate({top:dis},'normal');
}
/**滾輪事件Handler**/
var wheelHandler = function(e){
clearTimeout(timeFun);
timeFun = setTimeout(function(){
var href = findHref();
var index = href[0].id.substring(1);
var dis = 30*(index-1)+10;
move(dis);
},600);
};
/***注冊(cè)滾輪事件*/
$('body').on('mousewheel',wheelHandler);
四、Tips
1、$('.link')[0]返回的是普通的Dom對(duì)象,而代碼中使用$('.link').eq(0)返回的是jQuery對(duì)象,jQuery對(duì)象才有.offset()方法。
補(bǔ)充說(shuō)明:eq返回的是jquery對(duì)象,而get(n)和索引返回的是dom元素對(duì)象。
2、為什么要使用延時(shí)執(zhí)行函數(shù),并且在wheelHandler中clearTimeout(timeFun)?
因?yàn)槲覀冋L動(dòng)鼠標(biāo)會(huì)觸發(fā)多次的mousewheel事件,為了防止jQuery動(dòng)畫(huà)出現(xiàn)卡頓的現(xiàn)象,將代碼設(shè)計(jì)成只在鼠標(biāo)滾輪停下來(lái)的時(shí)候去觸發(fā),clearTimeout做的事情就是只要鼠標(biāo)滾輪還在滾動(dòng),進(jìn)入wheelHandler方法,就把前面已加入到延時(shí)執(zhí)行隊(duì)列中的方法清除,這樣就可以做到只對(duì)最后一個(gè)滾動(dòng)觸發(fā)動(dòng)畫(huà)事件,看上去就好像鼠標(biāo)滾輪停止?jié)L動(dòng)了才去觸發(fā)一樣。
以上所述是小編給大家介紹的jQuery仿寫(xiě)百度百科的目錄樹(shù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- jquery實(shí)現(xiàn)的樹(shù)形目錄實(shí)例
- jQuery遍歷節(jié)點(diǎn)樹(shù)方法分析
- jQuery樹(shù)形控件zTree使用小結(jié)
- 多功能jQuery樹(shù)插件zTree實(shí)現(xiàn)權(quán)限列表簡(jiǎn)單實(shí)例
- jquery樹(shù)形菜單效果的簡(jiǎn)單實(shí)例
- jQuery zTree加載樹(shù)形菜單功能
- jquery實(shí)現(xiàn)樹(shù)形菜單完整代碼
- 輕松學(xué)習(xí)jQuery插件EasyUI EasyUI創(chuàng)建樹(shù)形菜單
- jQuery實(shí)現(xiàn)文檔樹(shù)效果
- jquery插件treegrid樹(shù)狀表格的使用方法詳解(.Net平臺(tái))
相關(guān)文章
解析JSON對(duì)象與字符串之間的相互轉(zhuǎn)換
本篇文章主要是對(duì)JSON對(duì)象與字符串之間的相互轉(zhuǎn)換進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
jQuery實(shí)現(xiàn)彈出窗口彈出div層的實(shí)例代碼
這篇文章主要介紹了jQuery實(shí)現(xiàn)彈出窗口彈出div層的實(shí)例代碼,點(diǎn)擊頁(yè)面的鏈接,彈出一個(gè)div層,同時(shí)頁(yè)面的其他部分變灰并且不能點(diǎn)擊,,具體實(shí)現(xiàn)代碼大家參考下本文吧2017-01-01
jquery無(wú)刷新驗(yàn)證郵箱地址實(shí)現(xiàn)實(shí)例
原理非常的簡(jiǎn)單在用戶輸入郵箱離開(kāi)之后我們通用jquery ajax發(fā)送數(shù)據(jù)給mail.php文件,然后由它實(shí)現(xiàn)查找此郵箱是不是在數(shù)據(jù)庫(kù)中然后反饋對(duì)應(yīng)信息即可2014-02-02
快速移動(dòng)鼠標(biāo)觸發(fā)問(wèn)題及解決方法(ECharts外部調(diào)用保存為圖片操作及工作流接線mouseenter和mouseleav
這篇文章主要介紹了快速移動(dòng)鼠標(biāo)所觸發(fā)的問(wèn)題及解決方法(ECharts外部調(diào)用保存為圖片操作及工作流接線mouseenter和mouseleave),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
jquery validate.js表單驗(yàn)證入門(mén)實(shí)例(附源碼)
這篇文章主要介紹了jquery validate.js表單驗(yàn)證入門(mén)實(shí)例,為大家提供了jquery validate.js表單驗(yàn)證的源碼,特別適合初學(xué)者學(xué)習(xí)validate.js表單驗(yàn)證,感興趣的小伙伴們可以參考一下2015-11-11
jQuery數(shù)據(jù)類(lèi)型小結(jié)(14個(gè))
jQuery除了包含原生JS中的內(nèi)置數(shù)據(jù)類(lèi)型(built-in datatype),還包括一些擴(kuò)展的數(shù)據(jù)類(lèi)型(virtual types),如Selectors、Events等,通過(guò)本文給大家分享14個(gè)jquery數(shù)據(jù)類(lèi)型,感興趣的朋友一起學(xué)習(xí)吧2016-01-01

