jQuery仿写百度百科的目录树


Posted in Javascript onJanuary 03, 2017

一、首先来看一下需求(截图为百度百科“医保”词条):

1、点击右侧的目录树,左侧跳转到指定的锚点位置;

2、滚动鼠标,游标跟随一起滚动至响应链接位置

jQuery仿写百度百科的目录树

二、实现思路

1、针对第一个需求,只需要设置游标所在div和右侧列表div的position为fixed,根据浏览器窗口定位,然后给左侧文章各区块增加id,为右侧列表每一项增加对应的href属性指向响应的锚点即可;

2、针对第二个需求,定义鼠标的滚动事件mousewheel(在ff下事件为DOMMouseScroll),当时自己琢磨了半天用各种方法计算,但效果始终无法达到要求,后来分析了百度的实现源码恍然大悟,具体实现参考下图和代码部分。

jQuery仿写百度百科的目录树

三、代码实现

/**定于延时执行函数**/
 var timeFun = null;
 /**找到当前页面滚动到的锚点位置**/
 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);
   } 这段代码相当于下面这一句代码,优秀的代码就应该拿来多学习!**/
   maxDistance > curDistanceToTop && $links.eq(i).offset().top < windowScrollTop + $(window).height() && (maxDistance = curDistanceToTop,result = $links.eq(i))
  });
  return result;
 };
 /***使用jQuery创建移动动画*/
 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);
 };
 /***注册滚轮事件*/
 $('body').on('mousewheel',wheelHandler);

四、Tips

1、$('.link')[0]返回的是普通的Dom对象,而代码中使用$('.link').eq(0)返回的是jQuery对象,jQuery对象才有.offset()方法。

补充说明:eq返回的是jquery对象,而get(n)和索引返回的是dom元素对象。

2、为什么要使用延时执行函数,并且在wheelHandler中clearTimeout(timeFun)?

因为我们正常滚动鼠标会触发多次的mousewheel事件,为了防止jQuery动画出现卡顿的现象,将代码设计成只在鼠标滚轮停下来的时候去触发,clearTimeout做的事情就是只要鼠标滚轮还在滚动,进入wheelHandler方法,就把前面已加入到延时执行队列中的方法清除,这样就可以做到只对最后一个滚动触发动画事件,看上去就好像鼠标滚轮停止滚动了才去触发一样。

以上所述是小编给大家介绍的jQuery仿写百度百科的目录树,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
Extjs学习笔记之二 初识Extjs之Form
Jan 07 Javascript
理解Javascript_01_理解内存分配原理分析
Oct 11 Javascript
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
JQuery工具函数汇总
Jun 15 Javascript
Javascript中apply、call、bind的巧妙使用
Aug 18 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
JS校验与最终登陆界面功能完整示例
Jan 13 Javascript
Node.js API详解之 V8模块用法实例分析
Jun 05 Javascript
koa2 数据api中间件设计模型的实现方法
Jul 13 Javascript
vue使用openlayers实现移动点动画
Sep 24 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
Jan 03 #Javascript
Vue.js系列之vue-router(上)(3)
Jan 03 #Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 #Javascript
JS求解三元一次方程组值的方法
Jan 03 #Javascript
Vue.js系列之项目结构说明(2)
Jan 03 #Javascript
Vue.js系列之项目搭建(1)
Jan 03 #Javascript
jquery实现下拉框多选方法介绍
Jan 03 #Javascript
You might like
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
微信JS接口大全
2016/08/25 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
Preload基础使用方法详解
2020/02/03 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python修改Excel数据的实例代码
2013/11/01 Python
python处理cookie详解
2014/02/07 Python
pandas通过loc生成新的列方法
2018/11/28 Python
python 有效的括号的实现代码示例
2019/11/11 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
尽职尽责村干部自我鉴定
2014/01/23 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
给学校的建议书范文
2014/05/15 职场文书
会计试用期自我评价
2015/03/10 职场文书
毕业论文致谢信
2015/05/14 职场文书
杨善洲观后感
2015/06/04 职场文书
毕业生政审意见范文
2015/06/04 职场文书
公司周年庆典致辞
2015/07/30 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript