Bootstrap框架动态生成Web页面文章内目录的方法


Posted in Javascript onMay 12, 2016

引言
在写博客的时候,为了条理性起见,经常会使用许多小标题,当文章长时,需要来回在不同的标题之间穿梭,如果手动添加目录,添加锚点,实在是麻烦,为此,可以动态生成一块目录区域,并使用Bootstrap提供的Affix插件将目录区域固定在页面上。Bootstrap文档便使用了它

准备工作-引入bootstrap.min.js
将bootstrap.min.js放入body之前的script标签中,uikit.min.js暂时不引入。
引入相关插件之后,我们的思路是首先根据文章自动生成锚点以及菜单内容,随后为其添加Affix产生固定效果,再使用uikit的scrollSpy插件(bootstrap中也有scrollspy,使用方法几乎一致)。
引-学习Affix的使用
Affix插件?“镏?颐枪潭ǖ己讲糠值奈恢茫?⑶腋?萦没У墓龆?榭隼次?潭ǖ脑?卦黾哟怪逼?屏浚?沟?av在三个类之间进行切换:
1.affix-top:表示在顶端
2.affix:表示在页面滚动,增加fixed属性,同时使用自定义的offset偏移量
3.affix-bottom:表示到达最底端

启用Affix只需要以下代码:

$('#nav').affix({
  offset: {
          top:$('header').offset().top,
      bottom: ($('footer').outerHeight(true) + 
        $('.application').outerHeight(true)) + 40
    }
});

一、组织HTML代码部分

<ul id="mysidebar" class="nav affix" >
</ul>

一定要注意为ul添加nav和affix类。

二、生成封装代码
将本代码段引入到你自己的script脚本中

;$.fn.extend({
    "createAffix": function(selector) {
      $list = $("" + selector),
        length = $list.length,
        affixValue = "";
      for (var i = 0; i < length; i++) {
        //给每一个标题增加name属性
        $list.eq(i).attr("id", ("node" + i));
        var text = $list.eq(i).text();
        if (i == 0) {
          affixValue += "<li><a href=#node" + i + " class='active' >" + text + "</a></li>";
        } else {
          affixValue += "<li><a href=#node" + i + ">" + text + "</a></li>";
        }
      }
      this.append(affixValue);
      this.affix({
        offset: {
          top: this.offset().top//在固定之后距离顶部的偏移量
        }
      });
      return this;
    }

 });

上述代码的原理是为createAffix函数传入需要被认为是标题单元的标签或者类,在遍历过程中为其增加锚点链接。

三、使用方法
书写HTML部分

<ul id="mysidebar" class="nav affix" >
 <li><a href="#node1"></a></li>
 <li><a href="#node2"></a></li>
 <li><a href="#node3"></a></li>
 </ul>

 <h3 id="node1">标题1</h3>
 <h3 id="node2">标题2</h3>
 <h3 id="node3">标题3</h3>

书写Javascript部分

$(function(){
 $(' #mysidebar').createAffix('h3');
 //表示在文章中,使用`h3`标签的是 需要被添加锚点的地方。
 });

解决锚点偏移的问题
因为锚点默认将页面偏移到锚点元素的顶部,也就是如果我们对标题1进行了上述操作,当我们点击锚点时,页面会偏移到'标题1'所在的顶端位置,如果顶端有菜单栏,那么将会被遮住,通过设置css样式来解决。

.class{
    /*
    添加padding可以让锚点向下偏移num px,也就是跳过菜单栏的高度,
    通过设置margin-top为负值来`弥补`因为padding-top带来的空白部分
    */
    padding-top: num px;
    margin-top: -num px;
}

添加滚动监听
目前我们的DOM文档是这样的。

<ul id="mysidebar" class="nav affix" >
<li><a href="#node1"></a></li>
<li><a href="#node2"></a></li>
<li><a href="#node3"></a></li>
</ul>

加工一下,引入uikit属性,具体查看文档

<ul id="mysidebar" class="nav affix uk-nav uk-nav-side" data-uk-scrollspy-nav="{closest:'li',smoothscrool:true}" >
<li><a href="#node1"></a></li>
<li><a href="#node2"></a></li>
<li><a href="#node3"></a></li>
</ul>

引入uikit.min.js
由于我们的菜单项(li)是在文档加载后执行的,那么如果在生成菜单项之前变执行uikit的scrollspy,那么必定不起作用,所以要在菜单项生成后引入uikit.min.js,代码如下:

$(function(){
$(' #mysidebar').createAffix('h3');//生成菜单
$.getScript("uikit.min.js");//异步载入uikit.min.js,滚动监听生效。
});
Javascript 相关文章推荐
javascript完美拖拽的实现方法
Sep 29 Javascript
bootstrap改变按钮加载状态
Dec 01 Javascript
jQuery实现简单的间隔向上滚动效果
Mar 09 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
Oct 16 Javascript
jQuery绑定事件的四种方式介绍
Oct 31 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
Nov 22 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
json前后端数据交互相关代码
Sep 19 Javascript
js实现动态增加文件域表单功能
Oct 22 Javascript
JS实现横向跑马灯效果代码
Apr 20 Javascript
VUE实时监听元素距离顶部高度的操作
Jul 29 Javascript
elementUI同一页面展示多个Dialog的实现
Nov 19 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 #Javascript
js自定义select下拉框美化特效
May 12 #Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 #Javascript
JS函数的定义与调用方法推荐
May 12 #Javascript
使用jQuery实现Web页面换肤功能的要点解析
May 12 #Javascript
JS定义类的六种方式详解
May 12 #Javascript
值得分享和收藏的Bootstrap学习教程
May 12 #Javascript
You might like
PHP判断图片格式的七种方法小结
2013/06/03 PHP
php输出xml属性的方法
2015/03/19 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
如何更好的编写js async函数
2018/05/13 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
Python NumPy库安装使用笔记
2015/05/18 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python入门学习指南分享
2018/04/11 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
python中二分查找法的实现方法
2020/12/06 Python
启动一个线程是用run()还是start()
2016/12/25 面试题
《值日生》教学反思
2014/02/17 职场文书
逃课上网检讨书
2014/02/20 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
详解vue中v-for的key唯一性
2021/05/15 Vue.js
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript
Go语言基础map用法及示例详解
2021/11/17 Golang