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 相关文章推荐
jquery插件开发注意事项小结
Jun 04 Javascript
JS简单实现浮动窗口效果示例
Sep 07 Javascript
vue.js实现含搜索的多种复选框(附源码)
Mar 23 Javascript
js操作二进制数据方法
Mar 03 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
vue+iview 实现可编辑表格的示例代码
Oct 31 Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
详解VUE前端按钮权限控制
Apr 26 Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 Javascript
JQuery常用简单动画操作方法回顾与总结
Dec 07 jQuery
Vue js with语句原理及用法解析
Sep 03 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
php中的时间显示
2007/01/18 PHP
浅析PHP水印技术
2007/02/14 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
Js中获取frames中的元素示例代码
2013/07/30 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
用实例说明python的*args和**kwargs用法
2013/11/01 Python
Python循环语句之break与continue的用法
2015/10/14 Python
python实现各进制转换的总结大全
2017/06/18 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
JupyterNotebook设置Python环境的方法步骤
2019/12/03 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
数控专业毕业生自荐信范文
2014/03/04 职场文书
求职信名称怎么写
2014/05/26 职场文书
团队拓展活动总结
2014/08/27 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL