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 相关文章推荐
jquery 插件 任意位置浮动固定层
Dec 25 Javascript
JavaScript 判断日期格式是否正确的实现代码
Jul 04 Javascript
探讨JavaScript中声明全局变量三种方式的异同
Dec 03 Javascript
jQuery+PHP打造滑动开关效果
Dec 16 Javascript
jQuery中height()方法用法实例
Dec 24 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
浅析jQuery操作select控件的取值和设值
Dec 07 Javascript
Jquery Easyui表单组件Form使用详解(30)
Dec 19 Javascript
vue-hook-form使用详解
Apr 07 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
Aug 30 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
Sep 18 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中header的用法详解
2013/06/07 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
js查错流程归纳
2012/05/04 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js全屏显示显示代码的三种方法
2013/11/11 Javascript
javascript中的取反再取反~~没有意义
2014/04/06 Javascript
再谈javascript原型继承
2014/11/10 Javascript
jQuery实现tab标签自动切换的方法
2015/02/28 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
python通过文件头判断文件类型
2015/10/30 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
通过cmd进入python的步骤
2020/06/16 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
Python 实现一个简单的web服务器
2021/01/03 Python
市场营销个人求职信范文
2014/02/02 职场文书
车间机修工岗位职责
2014/02/28 职场文书
《囚绿记》教学反思
2014/03/01 职场文书
入党积极分子评语
2014/05/04 职场文书
学校会议通知范文
2015/04/15 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
初中思想品德教学反思
2016/02/24 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang