在上篇不少工作,但是由国庆要建模,修改进度就耽搁了。现在又重新拾起开始优化。
代码高亮优化
增加其他语言支持
由于本主题的代码高亮功能使用的是 prism.js
功能。默认主题中的支持的高亮代码类型较少,而我会接触到的语言类型又很繁多,因此需要多一些代码支持。
在 Prismjs 网站上重新下载对应的 js 文件包。
亮暗主题下切换不同代码高亮样式
该主题有存在白天与黑夜两个模式,而代码样式只是一种。经过观察发现,白天样式使用的似乎是prism.css
的默认样式,而黑夜模式的样式又是另外一个 css 文件控制。
夜间模式
晚11点至次日凌晨6点自动开启夜间模式。如果不需要,则将配置文件_config.yml
中nightMode
属性的值改为false
即可。
1
2
3 > # Night mode
> nightMode: true
>
说明 参数 开启夜间模式 true
关闭夜间模式 false
首先在配置文件中找到关于夜间模式的属性 nightMode
,经过搜索后定位到这一行中。
1 | <input id="nm-switch" type="hidden" value="{{ site.nightMode }}"> |
无论是在default.html
还是post.html
这两个模板文件中都有这一行指令,说明本行是用于控制夜间模式的代码。
而<input>
句柄常常用于交互行为,意识到这部分的夜间模式的切换应该是由一个 js 文件控制。
在index.js
文件中找到夜间模式的函数,实现上就是给 body 添加了了一个night-mode
的类。
1 | function nightMode() { |
于是接下来就只要找这个类 night-mode
的位置,即可搞清楚控制夜间模式的 CSS 样式了。
在common.scss
中找到对应的代码块。
1 | // 夜间模式 |
也就是说,夜间模式下给 markdown-body
类换了一个背景颜色,其他基本没有变化。那么我们只要选用一个白天可用的 prism.js
主题即可。经过挑选,最终选择了default
这个主题。
并且替换了代码块的背景颜色,
1 | pre[class*="language-"] { |
但是测试后发现夜间模式效果奇怪。
查了下样式发现是多了一个字体的阴影效果,在白底下看不错来,一到黑底就特别明显了。
在prism.css
中注释掉text-shadow
的属性,显示良好。
同时发现 +=
这些符号背景色变得十分奇怪,原因似乎是 url
类的 background
属性用了50%不透明度的纯白色。
将不透明度改为0.05,显示良好。
1 | background: hsla(0, 0%, 100%, .05); |
然后是行内 code
类的背景颜色问题,原因是之前在设置的时候没有考虑不同主题,直接用色值作为底色,实际上从背景属性上来说,背景色应该是「褪色」了的主色,因此应该使用 RGBA 模式。在文件中修改code
类的背景颜色。
1 | background-color: rgba(199, 37, 79, 0.02); |
显示良好。
主题效果一览:
白天模式:
黑夜模式:
行内代码支持在列表、表格中显示
默认主题的代码只能在行内显示样式,一旦出现在列表或者表格中的话就不再改变样式。
通过查找行内代码的样式,发现code
类的代码只在p
类中才会改变样式,因此会出现上述情况。
1 | .markdown-body p code { |
于是在后方添加几个类,使在li
和table
中的code
也可以显示出对应的样式。
1 | .markdown-body p code,.markdown-body li code,.markdown-body table code { |
添加文章导航栏
文章导航栏对于一篇长文来说非常有用,便于快速搜索与定位。因此也希望本主题能够拥有该功能。
在网上查阅相关资料后,找到一个纯JS 实现的TOC插件 - tocmd-generator。(Github 本身不支持 Jekyll 插件扩展。)
安装
将本插件在 jQuery 库之后载入。我将这个 js 改名成了toc.js
,便于输入。
1 | <script src="/path/to/toc.js"></script> |
##配置
这个插件是识别 HTML 中的h1
、h2
、h3
三个元素来构建 TOC。
在post.html
中要插入 TOC 的地方加入 以下代码。后续的 toc 内容将会出现在这个div
下面。
1 | <div id="toc"></div> |
在 toc.js
中加入执行代码。
1 | // 配置 TOC 参数 |
toc()
函数将查找.post-content
中的h1
、h2
、h3
等标签,并将内容输出至 id
为 toc
的div
区域中。
虽然实现了文章目录效果,但是 CSS 样式仍然存在问题。
双栏样式
可以看到,g-sidebar
的样式来自cardStyle
,因此如果想要引用这种卡片效果,可以直接通过@include cardStyle
来引用。
由于默认主页就是双栏设计,且作者介绍在宽度变小后直接隐藏,因此可以参考主页的框架与样式设计。
1 | <main class="g-container home-content"> |
汇总相关的 CSS 代码
1 | .g-container { |
从结构上来看,g-container
负责了尺寸的控制,home-content
负责了内容的间距控制。article-list
是放文章的容器,g-sidebar-warp
是放侧边栏的容器。
那么类似的,在post.html
中,我们把文章的主体与 TOC 放进main
容器中,赋予post-container
类控制尺寸,直接调用home-content
来控制间距。 把post-content
放入一个新的容器,尺寸为720px。
1 | <main class="post-container home-content"> |
1 | .post-container{ |
初步修改后的效果,可以看到已经实现分栏显示了。
但是目前文字和边框是在一起的,看着十分拥挤。因此需要再思考一下post-content
的属性。实际上post-content
已经有自己的样式特征,并不适合直接将 CSS 样式写入该类。
1 | .post-content { |
在原来的post.html
中,post-content
是被post-container
包裹的,位置与尺寸均由post-container
控制。因此给post-content
类包裹一个框架,控制其内容(这里起的是post-article
)。实现和之前的post-container
一样的作用。由于文章宽度是720px,从阅读舒适性来说至少需要保证边距为960px,这样才能使得视觉效果良好。
1 | .post-article{ |
同时为了让文章目录自适应宽度大小,调整post-container
的 width
属性为100%,而不是固定值,这样在网站宽度大于1080px时也仍然可以显示在最边上。
自适应宽度尺寸
接下来则是宽度尺寸的自适应问题,
当页面尺寸大于 960+(240+120)*2+ = 1680px 时才能保证有充足空间呈现右侧文章目录。(120为目录右侧的边距)
因此将 layout.scss
增加一栏来控制目录的位置。
1 | @media screen and (max-width: $post-container-w) { |
实现效果就是当整个页面大于1680px 时目录显示在右侧,而页面小于1680px 时目录移动到文章上方。
当宽度小于960px时,发现文章并不会自适应宽度,原因便是post-article
和post-toc-wrapper
在小于 960px 后没有设置成自适应,因此在最大宽度为 960px 的控制句段中加入宽度自动的代码。
1 | @media screen and (max-width: $g-container-w) { |
在手机上模拟的效果如下:
写了这么多了,还是再分篇文章单独写吧。这一部分就到此为止。
剩下的就在下一篇再继续。