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.extend函数扩展自己对象的js代码
Dec 09 Javascript
页面只能打开一次Cooike如何实现
Dec 04 Javascript
原生js做的手风琴效果的导航菜单
Nov 08 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
Jun 01 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
Feb 08 Javascript
js统计页面上每个标签的数量实例代码
May 29 Javascript
解决LayUI表单获取不到data的问题
Aug 20 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
Aug 15 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 Javascript
vue单元格多列合并的实现
Nov 26 Vue.js
通过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经典的给图片加水印程序
2006/12/06 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python中的lstrip()方法使用简介
2015/05/19 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
django2笔记之路由path语法的实现
2019/07/17 Python
深入解析神经网络从原理到实现
2019/07/26 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
canvas绘制表情包的示例代码
2018/07/09 HTML / CSS
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
应用艺术毕业生的自我评价
2013/12/04 职场文书
工程部经理岗位职责
2013/12/08 职场文书
函授毕业自我鉴定
2014/02/04 职场文书
搞笑征婚广告词
2014/03/17 职场文书
汽车广告策划方案
2014/05/31 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL