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 相关文章推荐
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
JavaScript的parseInt 取整使用
May 09 Javascript
日期处理的js库(迷你版)--自建js库总结
Nov 21 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
使用jquery解析XML示例代码
Sep 05 Javascript
jquery实现左右滑动菜单效果代码
Aug 27 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
Mar 02 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
微信小程序如何调用新闻接口实现列表循环
Jul 02 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
Sep 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通过COM使用ADODB的简单例子
2006/12/31 PHP
ThinkPHP中的系统常量和预定义常量集合
2014/07/01 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
js实现弹窗效果
2020/08/09 Javascript
对于Python的Django框架部署的一些建议
2015/04/09 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
python求最大连续子数组的和
2018/07/07 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
Python双链表原理与实现方法详解
2020/02/22 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
Javascript如何发送一个Ajax请求
2015/01/26 面试题
电子商务专业个人的自我评价
2013/11/19 职场文书
策划主管的工作职责
2013/11/24 职场文书
初三物理教学反思
2014/01/21 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis