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 相关文章推荐
一个对于Array的简单扩展
Oct 03 Javascript
JavaScript常用全局属性与方法记录积累
Jul 03 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
js右下角弹出提示框示例代码
Jan 12 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
Feb 24 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
用vue写一个仿简书的轮播图的示例代码
Mar 13 Javascript
js实现简单选项卡功能
Mar 23 Javascript
详解微信小程序之提高应用速度小技巧
Jan 07 Javascript
vue的webcamjs集成方式
Nov 16 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
多重?l件?合查?(一)
2006/10/09 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
php网页病毒清除类
2014/12/08 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
python实现画图工具
2020/08/27 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
晚会邀请函范文
2014/01/24 职场文书
初中语文教学反思
2014/02/02 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
被告答辩状范文
2015/05/22 职场文书
芙蓉镇观后感
2015/06/10 职场文书
技术入股合作协议书
2016/03/21 职场文书
自荐信范文
2019/05/20 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers