G&TOC&CSS
TOC 的需求实现以及相关的思考总结。

GHOST 并没有内置 Table Of Content 的功能,且官方提供的解决方案存在不合理处,遂自行调整部分效果,本文意在记录总结实现过程。
初步实现
按照官方文档,根据文章内容中的标题生成目录需采用一款名为 Tocbot 的小型库。
将获取到的 Tocbot CSS 链接添加到 Casper 主题 default.hbs
文件中 <head>
标签体尾部。
同样地操作 Tocbot JavaScript 链接至 default.hbs
里 </body>
标签之前。值得一提的是,随着版本更新,内容选择器不再是官方所绑定的 .post-content
,而是根据源码得到的 .gh-content
。
对于选择区域进行渲染,期望是目录出现在文章内容之前,因此在 .post.hbs
文件完成如下更新。
定制效果
期望能在浏览文章的同时,在侧边看见即时的 TOC 面板,故增加 TOC 随页面滚动更改位置的需求。
对于其他理论可行的方案来说,都或多或少与当前版本源码存在差异,最典型的是布局方式。众所周知,Ghost 后台开启服务的方式有很多种,像是 PM2、云代理,更有甚者直接用 Node 写了一个与 Ghost 模样一致的替代版。
去除下划线样式并解决类名为 toc-list-item 的 li 下首个子元素距顶部位置较窄。
总结反思
Ghost 现阶段源码的布局是使用 Grid 与 Flex 交叉的方式。若在改变 TOC 元素位置时,将其原有位置在 DOM 上移除,则会导致重排效果,体验感大大降低且消耗性能。鉴于页面可视区的滚动,使用者也不会关注到留白的移动区,故不考虑 DOM 元素的摘除,纯粹临时性改变坐标。
CSS
postion 的选择方式上,比较固定定位 fixed 与粘性定位 sticky。二者都可以在拖动滚动条时,固定元素于指定位置。但是在效果上,前者是直接固定于指定位置,后者在达到临界值时进行固定。在性质上,前者脱离文档流,后者不脱离文档流。在使用上,前者无需指定 top、button、left、right 中的任一值,就能以当前视口进行定位。后者必须指定其一,然后相对最近滚动祖先进行偏移。
Ghost 源码的视窗单位出现较丰富。viewport 是浏览器实际显示内容的区域,即不包括工具栏的浏览器区域。
Javascript
在效果实现的过程中,滚动监听事件获取当前页面滚动距离,应注意页面端与到移动端的兼容;同时也应注意获取元素尺寸与视口高宽的问题。相关链接于文末。


结束
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处!