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 字符串连接[性能比较]
May 10 Javascript
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
jquery.post用法示例代码
Jan 03 Javascript
jquery常用特效方法使用示例
Apr 25 Javascript
jQuery基于muipicker实现仿ios时间选择
Feb 22 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
js for循环倒序输出数组元素的实例
Mar 01 Javascript
JavaScript手风琴页面制作
May 17 Javascript
Vue.js简易安装和快速入门(第二课)
Oct 17 Javascript
VUE前后端学习tab写法实例
Aug 06 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 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
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
PHP return语句的另一个作用
2014/07/30 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
python用match()函数爬数据方法详解
2019/07/23 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
如何使用python切换hosts文件
2020/04/29 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
Python字符串三种格式化输出
2020/09/17 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
大学生创业策划书
2014/02/02 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
童年读书笔记
2015/06/26 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
浅谈Python基础之列表那些事儿
2021/05/11 Python
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS