JavaScript 生成页面文章 滚动目录(编目)

一篇文章显示在浏览器中,如果文章足够长,那么滚动条亦会非常长,因此,我们最好给文章加上 文章目录,同时告知用户,当前所浏览的文章位置。

缘由

由于项目中需要实现这一功能,所以我便到搜索引擎中寻找对应的插件,必应,百度,搜狗(Google因软件问题无法访问),可惜的是,插件配置复杂。
所以,我经过简单画图,大致明白了实现一个动态的文章目录需要的变量以及步骤,注意:不是基于 a 标签的锚点

简单了解,什么是 文章目录(编目)?

每一篇文章都会有 标题,子标题,这些标题组成起来便是文章的目录,即编目
让我们先来简单看看基本的文章目录由什么组成吧:

图中的是 百度百科 的文章编目,当你浏览到了哪里,那么对应的文字编目便提示你浏览到了哪里。

实现这样功能的简单原理图

当元素的相对高度进入浏览区域后,则说明此元素正在被用户所阅读。
当然,这个浏览触发区域可以自行设置 😃

重要的变量

  • 元素的相对高度(可能为负值)
  • 浏览触发区域
  • 元素底部相对高度

浏览器高度是不必我们理会的 😃 所以我们先来设置一个程序执行步骤:
触发条件:用户滚动页面
步骤:

  • 检查是否初始化 -> 否
    • 寻找所有的被标记的元素
    • 将被标记元素的信息载入至‘浏览概要’中
  • 遍历所有页面标题,包括副标题
    • 判断元素的相对高度是否小于 0 (即负值) -> 已经浏览过了
      • 判断元素底部相对高度(即相对高度+元素本身高度)是否大于浏览区域的最小值
        • 是(处于浏览区域)将所有浏览概要标题重置标记,后寻找对应的浏览概要标题,并进行浏览标记后 break(不必继续执行);
    • 判断元素的相对高度是否处于浏览区域
      • 是(处于浏览区域)将所有浏览概要标题重置标记,后寻找对应的浏览概要标题,并进行浏览标记后 break(不必继续执行);
    • 否 继续遍历

结语

我并不清楚这个执行步骤写得是否详细,所以有问题可以留言,我会进行答复。
这样一来,我们就可以做出一模一样的 文章目录 当前浏览位置了。
值得注意的是,触发条件一定需要延迟执行,可以是 100ms - 300ms 之中,不过仍然可以视情况指定延迟时间。

部分代码片段示例:

// 是否已经初始化 -> 忽略初始化的步骤
if ( this._init ) {
  for (let i = 0; i < allBrowse.length; i++) {
    // 是否当前浏览元素的相对位置大于 0 
    if ( MTools.getElementViewTop(allBrowse[i]) > 0 ) {
      // 当前浏览元素的相对位置是否处于 浏览区域 中
      if (210 > MTools.getElementViewTop(allBrowse[i]) && MTools.getElementViewTop(allBrowse[i]) > 120) {
        // 清除浏览标记
        clearBrowserMark();
        // 寻找对应的‘浏览概要’中的位置并标记
        browserMark(allBrowse[i]);
        break;
      }
    }
    // 获取其底部在视窗的位置 是否处于浏览点之下
    if ((MTools.getElementViewTop(allBrowse[i]) + allBrowse[i].offsetHeight) > 120) {
      // 清除浏览标记
      clearBrowserMark();
      // 寻找对应的‘浏览概要’中的位置并标记
      browserMark(allBrowse[i]);
      break;
    }
  }
}

我觉得已经够详细了。。关于 MTools 是一个前端开源工具包,内涵大量兼容或常用工具,虽然部分来自网络;
其实来自网络的代码片段是我不喜欢重复造轮 😃
这些片段有些包含 bug,但是已经被我修复,可以放心使用

其中手写了事件处理、动画部分和修改部分网络上的代码片段
也有我自己所写的小工具 😃

更多详解可进入此链接中查看 https://www.cnblogs.com/chongsaid/p/javascript-developer-tools.html

后续此部件将可能开源至此工具包。

本文来自 https://www.cnblogs.com/chongsaid/
转载请注明本文地址,否则视为侵犯著作权。

2020-03-13 写于揭阳

posted @ 2020-03-13 20:06  辰之道  阅读(1433)  评论(0编辑  收藏  举报