详解百度百科目录导航树小插件

发布时间 - 2026-01-10 22:22:56    点击率:

说起来比较惭愧,在园子里混了4年,注册账号也有3年多了,一篇博客都没有写过,之前不写博客的原因是:1,觉得自己的水平弱爆了,不敢出来误人子弟,也怕大牛们笑话 2,太懒了,有时候自己搞一点小东西,搞的过程中兴趣盎然,等搞出来以后就觉得索然无味了,懒得花时间再去整理。新的一年不想再抱着这种想法继续下去了,改变就从今天开始。

先介绍一下造轮子的背景:前几天给客户设计原型,是关于一个步骤数据展示及打分的页面,客户可以在此页面上看到APP端配置的工作步骤以及采集到的数据,可以分别给每个步骤打分,在设计的时考虑到一般情况下APP端配置的工作步骤比较多,Web后台进行展示的时候页面会非常长,用户在查看数据及评分的过程中可能会不清楚自己评了几个步骤,还剩下几个步骤未打分,所以想在页面中设计一个类似于导航的东西,通过这个导航可以很清晰直观的看到当前正在浏览的是哪个步骤,同时也可以点击自己感兴趣的步骤直接滚动到该步骤的内容区域。当时灵光一闪,想到了百度百科右侧的目录导航树,不如就用这个效果吧,基本满足自己所想的效果,所以就按照这个效果画了一个原型页面跟客户确认,客户也挺满意的,原型确定之后,任务也就开始了。就先从这个导航树开始吧,从可维护性和复用角度考虑,当时就想直接封装一个插件吧,在功能页面,直接通过JQ的方式调用,这样功能页面的代码量会少一些,所以就有了下面这个小东西,先看一下效果图:

一、控件参数介绍

1,data:为控件生成提供数据源,效果图中的标题1,标题2,标题3等导航名称就是通过该属性的NodeName获取的。

2,css:为导航树容器提供css样式,这个可以根据个人的需求进行调整,如控制导航树的距离浏览器的顶部,右侧的位置。

3,className:该参数主要用于浏览器滚动条滚动到对应内容时,导航树光标定位到对应的节点,默认的值为'.item'。

目前只有这个三个参数,大家可以在使用时根据自己的需求扩展自己想要的参数。

二、控件的调用

1,js部分

<script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script src="NavigationTree.js"></script>
<script>
 $(function () {
  //创建控件
  var tree = $('#demo').navigationTree({
  data: [
   { ID: '1', NodeName: '标题1' },
   { ID: '2', NodeName: '标题2' },
   {
   ID: '3',
   NodeName: '标题3',
   Children: [{ ID: '3.1', NodeName: '标题3.1' }, { ID: '3.2', NodeName: '标题3.2' }]
   },
   { ID: '4', NodeName: '标题4' },
   { ID: '5', NodeName: '标题5' }
  ]
  });
 });
</script>

2,控件html部分

<!--控件容器开始-->
<div id="demo"></div>
<!--控件容器结束-->

怎么样,调用是不是比较简单?

三、实现难点说明

其实整个功能可能最难的地方就在于目录导航树如何准确显示当前用户正在浏览的区域,这个主要的是通过监听滚动条滚动的事件,然后在事件中动态的计算当前哪个元素处于浏览器可视区域的,然后取到该元素的唯一标示(ID),然后根据ID在目录导航树中找到对应的节点,计算该节点距离父元素顶部的距离,通过控制光标元素的top值,我知道,当我这句话说完的时候,你可能仍然不太明白,那么请看代码,代码有时候比别人口头解释的要直观清晰的多:

//#region滚动条事件
 var $win = $(window);
 var winHeight = $win.height();
 $win.scroll(function () {
 var winScrollTop = $win.scrollTop();
 for (var i = _allElements.length - 1; i >= 0; i--) {
  var elmObj = $(_allElements[i]);
  //!(滚动条离顶部的距离>元素在当前视图的顶部相对偏移+元素外部高度)&&!(滚动条离顶部的距离<元素在当前视图的顶部相对偏移-window对象高度/2)
  if (!(winScrollTop > elmObj.offset().top + elmObj.outerHeight()) && !(winScrollTop < elmObj.offset().top - winHeight/2)) {
  $('.arrow').css({ top: $('[data-id="' + elmObj.attr('id') + '"]').position().top + 3 });
  return false;
  }
 }
 });
 //#endregion

其中_allElements这个变量保存的就是通过className参数得到的对象数组,在scroll事件中不断的循环该数组,对比哪个元素的处于当前可视的区域内,然后拿到该元素的ID,去目录树中找到对应的节点,拿到该节点元素距离其父元素的距离,把该距离通过css给到$('.arrow')对象,该$('.arrow')对象就是右侧蓝色的光标对象,通过控制它的top值来调整它显示到对应节点的位置。

四、额外小功能

因为我的使用场景中需要能够标示出那个步骤已经评完了分,所以在封装这个控件的时候,额外的加了这个小功能,不过默认情况下“已完成”小图标是不会显示的,当通过以下js代码调用时,图标就会显示在对应的节点的后面:

//控制第二个节点显示已完成
tree.showOkIcon(2);

其中tree对象是创建控件后返回的对象,通过该对象的showOkIcon方法,显示小图标,参数为对应节点的ID,效果图如下:

以上就是所有的内容了,因本人第一次写博客,同时水平有限,代码实现的也可能也不够优雅、简洁。还请各位看官且看且轻拍。希望能够给您带来一丢丢的帮助。、

附下载链接:http://pan.baidu.com/s/1kVFf8I7

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# 百度百科  # 目录树  # 插件  # jQuery仿写百度百科的目录树  # 教你用python3根据关键词爬取百度百科的内容  # 基于Jquery实现仿百度百科右侧导航代码附源码下载  # jquery仿百度百科底部浮动导航特效  # python采集百度百科的方法  # jQuery+css实现百度百科的页面导航效果  # 滚动条  # 到该  # 自己的  # 的是  # 博客  # 过程中  # 小图标  # 就会  # 也有  # 几个步骤  # 兴趣盎然  # 中找到  # 也就  # 在此  # 不太  # 当我  # 抱着  # 感兴趣  # 这句话  # 不清楚 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  jquery插件bootstrapValidator表单验证详解  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何在万网自助建站平台快速创建网站?  利用vue写todolist单页应用  制作企业网站建设方案,怎样建设一个公司网站?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  图册素材网站设计制作软件,图册的导出方式有几种?  如何在香港服务器上快速搭建免备案网站?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  高端企业智能建站程序:SEO优化与响应式模板定制开发  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  javascript读取文本节点方法小结  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  JS中对数组元素进行增删改移的方法总结  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何在阿里云服务器自主搭建网站?  新三国志曹操传主线渭水交兵攻略  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  浅析上传头像示例及其注意事项  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Laravel中的Facade(门面)到底是什么原理  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何处理表单验证?(Requests代码示例)  C++时间戳转换成日期时间的步骤和示例代码  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  想要更高端的建设网站,这些原则一定要坚持!  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  Swift中switch语句区间和元组模式匹配  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  网站制作免费,什么网站能看正片电影?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel如何配置和使用缓存?(Redis代码示例)  如何为不同团队 ID 动态生成多个独立按钮  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  香港服务器建站指南:免备案优势与SEO优化技巧全解析  简历没回改:利用AI润色让你的文字更专业