基于Jquery实现仿百度百科右侧导航代码附源码下载


Posted in Javascript onNovember 27, 2015

先给大家展示下效果图,看看是不是亲想要实现的效果,如果还满意的话请查看本文详情,同时大家也可以下载源码哦。

效果图:

基于Jquery实现仿百度百科右侧导航代码附源码下载

效果展示    源码下载

代码说明:

仿百度百科右侧导航代码jquery插件,这个仿百科右侧导航js代码,在很久以前就像搞个用了,因为这个导航特别适合长篇文档使用,花了半天时间写了这个仿百科导航插件,不过和百度百科比起来还是有点弱,没有实现右侧导航区域滚动的功能,如果您的文档不是超级变态长,应该够用。

如果你的导航超级长,可能要用到侧边导航页可以滚动,一般情况下还是用不到,等过些时候有好的实现思路再搞吧,暂时没想到实现右侧导航区域和左侧内容的滚动并且联动的好办法。

注意:var directoryNav = new DirectoryNav($("h2,h3"),{}); 中的"h2,h3"就是生成两级导航的内容节点

/*
 *仿百度百科右侧导航代码 - 页面目录结构导航 v0.01
 * 只写了两级,无限级别也可以,是逻辑上的级别,html结构全是同一级别
 * 滑标动画用的css3过渡动画,不支持的浏览器就没动画效果了
 * 和百度百科比起来还是比较弱,没有实现右边也可以滚动的功能
 */
 function DirectoryNav($h,config){
  this.opts = $.extend(true,{
   scrollThreshold:0.5, //滚动检测阀值 0.5在浏览器窗口中间部位
   scrollSpeed:700,  //滚动到指定位置的动画时间
   scrollTopBorder:500, //滚动条距离顶部多少的时候显示导航
   easing: 'swing',  //不解释
   delayDetection:200,  //延时检测,避免滚动的时候检测过于频繁
   scrollChange:function(){}
  },config);
  this.$win = $(window);
  this.$h = $h;
  this.$pageNavList = "";
  this.$pageNavListLis ="";
  this.$curTag = "";
  this.$pageNavListLiH = "";
  this.offArr = [];
  this.curIndex = 0;
  this.scrollIng = false;
  this.init();
 }
 DirectoryNav.prototype = {
  init:function(){
   this.make();
   this.setArr();
   this.bindEvent();
  },
  make:function(){
   //生成导航目录结构,这是根据需求自己生成的。如果你直接在页面中输出一个结构那也挺好不用 搞js
   $("body").append('<div class="directory-nav" id="directoryNav"><ul></ul><span class="cur-tag"></span><span class="c-top"></span><span class="c-bottom"></span><span class="line"></span></div>>');
   var $hs = this.$h,
    $directoryNav = $("#directoryNav"),
    temp = [],
    index1 = 0,
    index2 = 0;
   $hs.each(function(index){
    var $this = $(this),
      text = $this.text();
    if(this.tagName.toLowerCase()=='h2'){
     index1++;
     if(index1%2==0) index2 = 0;
     temp.push('<li class="l1"><span class="c-dot"></span>'+index1+'. <a class="l1-text">'+text+'</a></li>');
    }else{
     index2++;
     temp.push('<li class="l2">'+index1+'.'+index2+' <a class="l2-text">'+text+'</a></li>');
    }
   });
   $directoryNav.find("ul").html(temp.join(""));
   //设置变量
   this.$pageNavList = $directoryNav;
   this.$pageNavListLis = this.$pageNavList.find("li");
   this.$curTag = this.$pageNavList.find(".cur-tag");
   this.$pageNavListLiH = this.$pageNavListLis.eq(0).height();
   if(!this.opts.scrollTopBorder){
    this.$pageNavList.show();
   }
  },
  setArr:function(){
   var This = this;
   this.$h.each(function(){
    var $this = $(this),
     offT = Math.round($this.offset().top);
    This.offArr.push(offT);
   });
  },
  posTag:function(top){
   this.$curTag.css({top:top+'px'});
  },
  ifPos:function(st){
   var offArr = this.offArr;
   //console.log(st);
   var windowHeight = Math.round(this.$win.height() * this.opts.scrollThreshold);
   for(var i=0;i<offArr.length;i++){
    if((offArr[i] - windowHeight) < st) {
     var $curLi = this.$pageNavListLis.eq(i),
      tagTop = $curLi.position().top;
     $curLi.addClass("cur").siblings("li").removeClass("cur");
     this.curIndex = i;
     this.posTag(tagTop+this.$pageNavListLiH*0.5);
     //this.curIndex = this.$pageNavListLis.filter(".cur").index();
     this.opts.scrollChange.call(this);
    }
   }
  },
  bindEvent:function(){
   var This = this,
    show = false,
    timer = 0;
   this.$win.on("scroll",function(){
    var $this = $(this);
    clearTimeout(timer);
    timer = setTimeout(function(){
     This.scrollIng = true;
     if($this.scrollTop()>This.opts.scrollTopBorder){
      if(!This.$pageNavListLiH) This.$pageNavListLiH = This.$pageNavListLis.eq(0).height();
      if(!show){
       This.$pageNavList.fadeIn();
       show = true;
      }
      This.ifPos( $(this).scrollTop() );
     }else{
      if(show){
       This.$pageNavList.fadeOut();
       show = false;
      }
     }
    },This.opts.delayDetection);
   });
   this.$pageNavList.on("click","li",function(){
    var $this = $(this),
     index = $this.index();
    This.scrollTo(This.offArr[index]);
   })
  },
  scrollTo: function(offset,callback) {
   var This = this;
   $('html,body').animate({
    scrollTop: offset
   }, this.opts.scrollSpeed, this.opts.easing, function(){
    This.scrollIng = false;
    //修正弹两次回调 蛋疼
    callback && this.tagName.toLowerCase()=='body' && callback();
   });
  }
 };
 //调用实例化
 var directoryNav = new DirectoryNav($("h2,h3"),{
  scrollTopBorder:0 //滚动条距离顶部多少的时候显示导航,如果为0,则一直显示
 });

在写百度百科右侧导航js代码的时候有个想法,就是让右侧导航区域的滚动条和左侧内容的滚动条用一个计算公式让他们关联起来,实现同步滚动。

Javascript 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
May 13 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
使用jQuery实现Web页面换肤功能的要点解析
May 12 Javascript
javascript之Boolean类型对象
Jun 07 Javascript
每日十条JavaScript经验技巧(一)
Jun 23 Javascript
前端框架Vue.js中Directive知识详解
Sep 12 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
Jul 12 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
vue组件Prop传递数据的实现示例
Aug 17 Javascript
element-ui封装一个Table模板组件的示例
Jan 04 Javascript
jquery实现两边飘浮可关闭的对联广告
Nov 27 #Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
Nov 27 #Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 #Javascript
基于jquery animate操作css样式属性小结
Nov 27 #Javascript
Javascript简单实现面向对象编程继承实例代码
Nov 27 #Javascript
分享一些常用的jQuery动画事件和动画函数
Nov 27 #Javascript
JS实现的仿淘宝交易倒计时效果
Nov 27 #Javascript
You might like
Php部分常见问题总结
2006/10/09 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
PHP实现的简单缓存类
2015/07/29 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
jquery实现键盘左右翻页特效
2015/04/30 Javascript
JS清除字符串中重复值的实现方法
2016/08/03 Javascript
关于jquery中动态增加select,事件无效的快速解决方法
2016/08/29 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
python:socket传输大文件示例
2017/01/18 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
使用canvas一步步实现图片打码功能的方法
2019/06/17 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
蔬菜基地的创业计划书
2014/01/06 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
公司委托书范本5篇
2014/09/20 职场文书
实习生矿工检讨书
2014/10/13 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
小爸爸观后感
2015/06/15 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
Python数据结构之队列详解
2022/03/21 Python