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实用基础超详细介绍
Apr 11 Javascript
探讨JavaScript标签位置的存放与功能有无关系
Jan 15 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
May 15 Javascript
详解浏览器渲染页面过程
Feb 09 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
Aug 17 Javascript
vue项目总结之文件夹结构配置详解
Dec 13 Javascript
使用JS获取SessionStorage的值
Jan 12 Javascript
vue 指定组件缓存实例详解
Apr 01 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
Element 默认勾选表格 toggleRowSelection的实现
Sep 04 Javascript
微信小程序获取当前位置和城市名
Nov 13 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 curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
基于Python测试程序是否有错误
2020/05/16 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
详解Python 最短匹配模式
2020/07/29 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
基层工作经历证明
2014/01/13 职场文书
怎样写辞职信
2015/02/27 职场文书
十二生肖观后感
2015/06/12 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
Python制作春联的示例代码
2022/01/22 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server