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 相关文章推荐
JS在IE和FireFox之间常用函数的区别小结
Mar 12 Javascript
jquery中event对象属性与方法小结
Dec 18 Javascript
js实现的四级左侧网站分类菜单实例
May 06 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
May 09 Javascript
JavaScript处理解析JSON数据过程详解
Sep 11 Javascript
JS中使用变量保存arguments对象的方法
Jun 03 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
使用微信SDK自定义分享的方法
Jul 03 Javascript
layui table 列宽百分比显示的实现方法
Sep 28 Javascript
vue实现点击追加选中样式效果
Nov 01 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 Javascript
javascript拖曳互换div的位置实现示例
Jun 28 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
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
php抽象类用法实例分析
2015/07/07 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
python getopt 参数处理小示例
2009/06/09 Python
java直接调用python脚本的例子
2014/02/16 Python
python k-近邻算法实例分享
2014/06/11 Python
python实现udp数据报传输的方法
2014/09/26 Python
Python实现建立SSH连接的方法
2015/06/03 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
详解django中Template语言
2020/02/22 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
施工工地安全标语
2014/06/07 职场文书
投标授权委托书范文
2014/08/02 职场文书
完整版商业计划书
2014/09/15 职场文书
元旦标语大全
2014/10/09 职场文书
2014年社区民政工作总结
2014/12/02 职场文书
vue实现简易音乐播放器
2022/08/14 Vue.js