滚动监听

滚动监听 bootstrap 实现。

借助 scrollSpy.js Github,或者自己实现监听也行。来实现属于我们的滚动监听。

原理

比如有标题如下:

<h1 id="section">滚动监听</h1>

对应的页面导航:

<ul id="markdown-toc">
  <li style="display: list-item;"><a href="#section" id="markdown-toc-section" class="">滚动监听</a></li>
  <li style="display: list-item;"><a href="#toc" id="markdown-toc-toc" class="active">TOC</a></li>
</ul>

监听实现导航栏高亮代码:

/**
 * 滚动监听
 */
this.scrollSpy = function()
{
    var header = $("h1, h2, h3, h4, h5, h6");   //标题
    header.scrollSpy();

    var firstNav = $("#markdown-toc a").first();    //导航栏第一个
    firstNav.addClass("active");    //初始默认为第一个高亮

    header.on('scrollSpy:enter', function() {
        $("#markdown-toc a").removeClass("active");
        var id = $(this).attr("id");
        $("#markdown-toc a[href='#"+id+"']").addClass("active");

        //滚动到页面的最上方 或者是存在其他没有ID的header信息
        //1.由此可见对于HEADER的定义应该更加具有区分性。
        if(!id)
        {
            firstNav.addClass("active");
        }
    });

    header.on('scrollSpy:exit', function() {
    });
};

  1. 标题可以自定义选择器,最好足够的有区分性。不会与页面其他元素混淆。

  2. 导航栏添加active的样式可以自定义。

(此处有一个BUG,如果文中存在id为空的header信息,会高亮错误。应该去除之前保留上一个高亮,如果ID不存在就将上一个依然设定为高亮。)

当然TOC导航栏是jekyll自动生成的,如果我们写了个静态网页。如何生成对应的TOC呢?

TOC

生成的原理也不难,只是比较繁琐。

jquery.toc 这里是一级菜单的个人实现。

For MarkDown

jianshu zh_CN

md_toc.js

For HTML

js zh_CN