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 相关文章推荐
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
May 17 Javascript
JS中数组Array的用法示例介绍
Feb 20 Javascript
JQuery悬停控制图片轮播——代码简单
Aug 05 Javascript
jQuery网页选项卡插件rTabs用法实例分析
Aug 26 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
May 09 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
Aug 09 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
使用vue-resource进行数据交互的实例
Sep 02 Javascript
angularjs获取到My97DatePicker选中的值方法
Oct 02 Javascript
判断js数据类型的函数实例详解
May 23 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建立文件夹代码
2015/01/06 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
关于PHP中字符串与多进制转换函数的实例代码
2016/11/03 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
短信提示使用 特效
2007/01/19 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
python实现超市扫码仪计费
2018/05/30 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
《秋游》教学反思
2014/04/24 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL