Hexo&Fluid 代码折叠功能
hexo 博客默认是没有代码折叠功能的,如果需要实现代码折叠功能,需要安装 hexo-sliding-spoiler 库或者借助 Hexo 过滤器功能。
hexo-sliding-spoiler 实现代码折叠
hexo-sliding-spoiler 提供 demo 演示:https://github.com/fletchto99/hexo-sliding-spoiler/blob/master/img/example.gif
安装命令
使用示例
带空格的需要使用双引号
如果没起作用,可能是 hexo 没有检测到插件,可以到_config.yml
中加上
使用示例
title
直接使用的话,会发现代码块和 spoiler 区域有间距,而且标题也是默认白色,如果想要修改的话,可以找到 node_modules\hexo-sliding-spoiler\assets\spoiler.css
进行修改。我的修改如下:
但还是不太完美,自由度不是很够,也可能是我不太会修改吧。
hexo-spoiler 实现文字遮盖
hexo-sliding-spoiler 是受 hexo-spoiler 插件的启发而成的。hexo-spoiler 同样可以帮助你做到文字遮挡效果:
在线演示:http://htmlpreview.github.io/?https://github.com/unnamed42/hexo-spoiler/blob/master/example/index.html
安装命令
和上面的插件一样,如果没有起作用可能是配置文件得配置一下
语法
option:value 中的 value 为可配置选项:
Optionname 选项名 | Type 类型 | value 值 | Effect 效果 |
---|
style | string | blur or box | 文本将被模糊处理或是被方框覆盖 |
color | string | All valid css color NO spaces allowed for inline option! | 仅在 style:box 时起作用;更改框的颜色。默认颜色为黑色 。(不允许内联选项中存在空格) |
p | boolean (in _config.yml or front-matter)
string (in inline options) | empty or any string | 遮盖文字将因 <p> 标签换行而非 < span > 标签。如果你想在剧透文本前后加一个新行,可以添加这个。 对于内联选项,分配任何值(除了 “false” ),甚至忽略它会打开它;“false” 意味着关闭。默认状态为关闭。 |
这表的配置项都在_config.yml
中进行配置,例如:
对于单独的一篇文章,你可以在文章的 front-matter 中设置,例如:
优先级:inline option 内联选项 > front-matter > _config.yml > default
warning
如果你改变了_config.yml
,请运行 hexo clean
清除缓存。
Hexo 过滤器实现代码折叠(推荐)
Kiyan 佬的文章启发了我,于是我自行钻研了一下。
编写 js
由于 fluid 主题已经引入了 Bootstrap,所以我们可以编写一个 js 文件来满足我们的要求。
在 scripts
目录下创建 codeFloding.js
:
这份代码的核心在于 <button class="collapse-btn collapsed">
中的属性:
为什么这么说呢?
当使用 data-toggle="collapse"
和 data-target
属性时,Bootstrap 的 JavaScript 会自动识别这些属性并处理折叠效果。这意味着我们不需要手动编写任何其他 JavaScript 代码来控制折叠内容的显示和隐藏。
处理过程是:
- 当收起或展开按钮被点击时,Bootstrap 先查找与
data-target
属性对应的元素(这里是被加上了 id="${collapseId}"
的 collapseDiv
)。 - 根据当前状态,Bootstrap 会往查找到的带
data-target
值(这里是 collapseId
)的标签中添加或移除 show
类,从而控制折叠内容的显示或隐藏。
人话是:Bootstrap 会自动给 const collapseDiv
加上 show
类或移除来控制展开还是收起。collapseDiv
这里是代码块。 - 同时给按钮更新
aria-expanded
属性,以反映当前状态(值为 true 即展开反之则收起)。 - 同时给按钮增加
collapsed
类来标识收起状态,若无此类则表示展开。
所以,这里有两个值的设定需要注意:
const collapseDiv
的 class="collapse"
:
若类名为 class="collapse"
表示默认将代码块收起,collapse show
表示默认展开。const collapseDiv
的类名若为不带 show 的类名表示默认收起,则 <button class="collapse-btn collapsed"
中的类名 class="collapse-btn"
需要加上 collapsed
。
即:class="collapse-btn collapsed"
与 collapseDiv
收起或展开的状态保持一致。
例如,我的代码默认行为是将代码块收起,所以要设置 const collapseDiv
为:
且按钮 button 应设置为:
另外,你也可以找一个你喜欢的 svg 图用于设置按钮的图标。
相关推荐:阿里巴巴矢量图库
编写 css
在 source\css\
目录下创建 codeFloding.css
:
有兴趣可以自行修改 css 样式使其符合你的审美。
warning
请注意在_config.fluid.yml
中进行引入
一个可选的配置
因为我默认开启了代码块的语言类型显示,所以在代码的右上角会自动显示代码语言,如果点击按钮将代码展开,则会在 header 上出现两个代码语言文字,一左一右不是很美观。
于是我创建了 source\js\watch.js
前情提要
watch.js
是以前写的,你也可以找一个已经写过的 js 文件,在底部写,或是单独创建一个 js 文件用于编写。
为了解决上面的重复问题,编写 js 代码如下:
这样一来,点击按钮展开之后,header 的代码语言提示问题将会被设为隐藏(并非卸载)。
一个可选配置的优化
为什么说是优化呢?因为实际使用下来,我发现每次都要手动使用鼠标点击那么小的一个按钮实在过于折磨,不如直接点击 header 实现折叠或展开。修改就不多说了,如果你能看懂上面的配置,那么下面的配置也能,因为我只做了小小的修改。
codeFloding.js
:将 data-toggle
和 data-target
换到 header 上,并在 watch.js 中手动切换 button 的 class 类名
codeFloding.css
:增加了鼠标悬停在 header 时,将鼠标样式改为 pointer 提示用户
watch.js