Butterfly美化之路(二)
Butterfly美化之路(二)
一、前言
我的博客使用的是 Hexo + GitHub 搭建在线博客,主题用的是 Butterfly,教程及官方文档均可在网上找到,我只是在这里记录一些自己的感受,以防以后玩崩了找不到回家的路
**本文中,如果没有特殊说明,修改的文件一律为 主题配置文件 **
参考文档:
Butterfly安装文档: https://butterfly.js.org/posts/21cfbf15/
Fomalhaut的分享: https://www.fomal.cc/
Akilarの糖果屋: https://akilar.top/
二、一图流
在 source 文件夹下新建一个文件夹 css,该文件夹用于存放自定义的 css 样式,再新建一个名为 custom.css,
在里面写入以下代码:
1 | /* 页脚与头图透明 */ |
在主题配置文件 inject.head 下添加引入
1 | - <link rel="stylesheet" href="/css/custom.css" media="defer" onload="this.media='all'"> |

将之前设置的背景图置空, 避免冗余加载
1 | # Disable all banner image |

三、新增留言板
新建留言板路径
1 | hexo new page comments |
导航栏添加
1 | 留言板: /comments/ ||fas fa-envelope-open |

配置文件添加
1 | # envelope_comment |

四、页脚GitHub徽标
安装插件:
1 | npm install hexo-butterfly-footer-beautify --save |
添加配置项
1 | # footer_beautify |
runtime.css
1 | /*电子钟字体*/ |
runtime.js
1 | setInterval(() => { |

| 参数 | 备选值/类型 | 释义 |
|---|---|---|
| priority | number | 【可选】过滤器优先级,数值越小,执行越早,默认为10,选填 |
| enable.timer | true/false | 【必选】计时器控制开关 |
| enable.bdage | true/false | 【必选】徽标控制开关 |
| enable_page | path | 【可选】填写想要应用的页面,如根目录就填 /,分类页面就填 /categories/。若要应用于所有页面,就填 all,默认为all |
| exclude | path | 【可选】填写想要屏蔽的页面,可以多个。仅当 enable_page 为 all 时生效。写法见示例。原理是将屏蔽项的内容逐个放到当前路径去匹配,若当前路径包含任一屏蔽项,则不会挂载。 |
| layout.type | id/class | 【可选】挂载容器类型,填写 id 或 class,不填则默认为id |
| layout.name | text | 【必选】挂载容器名称 |
| layout.index | 0和正整数 | 【可选】前提是 layout.type 为 class,因为同一页面可能有多个 class,此项用来确认究竟排在第几个顺位 |
| runtime_js | url | 【必选】页脚计时器脚本,可以下载上文填写示例的链接,参照注释和教程:Native JS Timer自行修改。 |
| runtime_css | url | 【可选】自定义样式,预留开发者接口,可自行下载。 |
| swiperpara | number | 【可选】若非零,则开启轮播功能,此项表示每行最多容纳徽标个数,用来应对徽标过多显得页脚拥挤的问题 |
| bdageitem.link | url | 【可选】页脚徽标指向的网站链接 |
| bdageitem.shields | url | 【必选】页脚徽标对应的API,API具体写法示例参照教程Add Github Badge |
| bdageitem.message | text | 【可选】页脚徽标悬停时显示的信息 |
| swiper_css | url | 【可选】swiper的依赖 |
| swiper_js | url | 【可选】swiper的依赖 |
| swiperbdage_init_js | url | 【可选】swiper初始化方法 |

五、首页分类磁贴
安装插件:
1 | npm install hexo-butterfly-categories-card --save |
添加配置项
1 | # hexo-butterfly-categories-card |
| 参数 | 备选值/类型 | 释义 |
|---|---|---|
| priority | number | 【可选】过滤器优先级,数值越小,执行越早,默认为 10 ,选填 |
| enable | true/false | 【必选】控制开关 |
| enable_page | path/all | 【可选】填写想要应用的页面的相对路径(即路由地址),如根目录就填 /,分类页面就填 /categories/。若要应用于所有页面,就填 all,默认为 / |
| layout.type | id/class | 【可选】挂载容器类型,填写 id 或 class,不填则默认为 id |
| layout.name | text | 【必选】挂载容器名称 |
| layout.index | 0和正整数 | 【可选】前提是 layout.type 为class,因为同一页面可能有多个 class ,此项用来确认究竟排在第几个顺位 |
| column | odd/even | 【可选】显示列数,考虑到比例问题,只提供3列和4列,odd为3列, even为4列 |
| row | number | 【可选】显示行数,默认两行,超过行数切换为滚动显示 |
| message.descr | text | 分类描述,需要和你自己的文章分类一一对应。 |
| message.cover | url | 分类背景,需要和你自己的文章分类一一对应。 |
| custom_css | url | 【可选】自定义样式,会替换默认的css链接,可以下载文档给出的cdn链接后自主修改 |


六、文章置顶滚动栏
安装插件:
1 | npm install hexo-butterfly-swiper --save |
添加配置项
1 | # hexo-butterfly-swiper |
| 参数 | 备选值/类型 | 释义 |
|---|---|---|
| priority | number | 【可选】过滤器优先级,数值越小,执行越早,默认为 10,选填 |
| enable | true/false | 【必选】控制开关 |
| enable_page | path/all | 【可选】填写想要应用的页面的相对路径(即路由地址),如根目录就填 /,分类页面就填 /categories/。若要应用于所有页面,就填 all,默认为 all |
| timemode | date/updated | 【可选】时间显示,date 为显示创建日期,updated 为显示更新日期,默认为 date |
| layout.type | id/class | 【可选】挂载容器类型,填写 id 或 class,不填则默认为 id |
| layout.name | text | 【必选】挂载容器名称 |
| layout.index | 0和正整数 | 【可选】前提是 layout.type 为 class,因为同一页面可能有多个 class,此项用来确认究竟排在第几个顺位 |
| default_descr | text | 默认文章描述 |
| swiper_css | url | 【可选】自定义的swiper依赖项css链接 |
| swiper_js | url | 【可选】自定义的swiper依赖项加js链接 |
| custom_css | url | 【可选】适配主题样式补丁 |
| custom_js | url | 【可选】swiper初始化方法 |
使用方法: 在要使用的文章的 fromt_matter 中添加配置项
1 | swiper_index: 1 #置顶轮播图顺序,非负整数,数字越大越靠前 |
七、文章双侧栏显示
安装插件:
1 | npm i hexo-butterfly-article-double-row --save |
在博客配置文件中添加配置
1 | # 文章双侧栏显示 |

在 custom.css 中添加代码
1 | /* 翻页按钮居中 */ |


八、wow.js动画
安装插件:
1 | npm install hexo-butterfly-wowjs --save |
添加配置项
1 | wowjs: |
| 参数 | 备选值/类型 | 释义 |
|---|---|---|
| enable | true/false | 【必选】控制开关 |
| priority | number | 【可选】过滤器优先级,数值越小,执行越早,默认为10,选填 |
| mobile | true/false | 控制移动端是否启用,默认移动端禁用 |
| animateitem.class | class | 【可选】添加动画类名,只支持给class添加 |
| animateitem.style | text | 【可选】动画样式,具体类型参考animate.css |
| animateitem.duration | time,单位为s或ms | 【可选】动画持续时间,单位可以是ms也可以是s。例如3s,700ms。 |
| animateitem.delay | time,单位为s或ms | 【可选】动画开始的延迟时间,单位可以是ms也可以是s。例如3s,700ms。 |
| animateitem.offset | number,单位为px | 【可选】开始动画的距离(相对浏览器底部)。 |
| animateitem.iteration | number,单位为s或ms | 【可选】动画重复的次数 |
| animate_css | URL | 【可选】animate.css的CDN链接,默认为https://npm.elemecdn.com/hexo-butterfly-wowjs/lib/animate.min.css |
| wow_js | URL | 【可选】wow.min.js的CDN链接,默认为https://npm.elemecdn.com/hexo-butterfly-wowjs/lib/wow.min.js |
| wow_init_js | URL | 【可选】wow_init.js的CDN链接,默认为https://npm.elemecdn.com/hexo-butterfly-wowjs/lib/wow_init.js |

九、改变导航栏
如果子菜单也需要导航栏魔改请参考前言中的参考文档
在 custom.css 中添加代码
1 | /* 一级菜单居中 */ |


十、星空背景&流星特效
在 source/js 下新建universe.js
写入以下代码
1 | function dark() {window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;var n,e,i,h,t=.05,s=document.getElementById("universe"),o=!0,a="180,184,240",r="226,225,142",d="226,225,224",c=[];function f(){n=window.innerWidth,e=window.innerHeight,i=.216*n,s.setAttribute("width",n),s.setAttribute("height",e)}function u(){h.clearRect(0,0,n,e);for(var t=c.length,i=0;i<t;i++){var s=c[i];s.move(),s.fadeIn(),s.fadeOut(),s.draw()}}function y(){this.reset=function(){this.giant=m(3),this.comet=!this.giant&&!o&&m(10),this.x=l(0,n-10),this.y=l(0,e),this.r=l(1.1,2.6),this.dx=l(t,6*t)+(this.comet+1-1)*t*l(50,120)+2*t,this.dy=-l(t,6*t)-(this.comet+1-1)*t*l(50,120),this.fadingOut=null,this.fadingIn=!0,this.opacity=0,this.opacityTresh=l(.2,1-.4*(this.comet+1-1)),this.do=l(5e-4,.002)+.001*(this.comet+1-1)},this.fadeIn=function(){this.fadingIn&&(this.fadingIn=!(this.opacity>this.opacityTresh),this.opacity+=this.do)},this.fadeOut=function(){this.fadingOut&&(this.fadingOut=!(this.opacity<0),this.opacity-=this.do/2,(this.x>n||this.y<0)&&(this.fadingOut=!1,this.reset()))},this.draw=function(){if(h.beginPath(),this.giant)h.fillStyle="rgba("+a+","+this.opacity+")",h.arc(this.x,this.y,2,0,2*Math.PI,!1);else if(this.comet){h.fillStyle="rgba("+d+","+this.opacity+")",h.arc(this.x,this.y,1.5,0,2*Math.PI,!1);for(var t=0;t<30;t++)h.fillStyle="rgba("+d+","+(this.opacity-this.opacity/20*t)+")",h.rect(this.x-this.dx/4*t,this.y-this.dy/4*t-2,2,2),h.fill()}else h.fillStyle="rgba("+r+","+this.opacity+")",h.rect(this.x,this.y,this.r,this.r);h.closePath(),h.fill()},this.move=function(){this.x+=this.dx,this.y+=this.dy,!1===this.fadingOut&&this.reset(),(this.x>n-n/4||this.y<0)&&(this.fadingOut=!0)},setTimeout(function(){o=!1},50)}function m(t){return Math.floor(1e3*Math.random())+1<10*t}function l(t,i){return Math.random()*(i-t)+t}f(),window.addEventListener("resize",f,!1),function(){h=s.getContext("2d");for(var t=0;t<i;t++)c[t]=new y,c[t].reset();u()}(),function t(){document.getElementsByTagName('html')[0].getAttribute('data-theme')=='dark'&&u(),window.requestAnimationFrame(t)}()}; |
在 source/css 下新建 universe.css
写入以下代码
1 | /* 背景宇宙星光 */ |
在主题配置文件 inject.bottom 下添加引入
1 | - <canvas id="universe"></canvas> |
在主题配置文件 inject.head 下添加引入
1 | - <link rel="stylesheet" href="/css/universe.css"> |



十一、Twikoo 评论系统
11.1 后端配置
点击快速上手
Vercel 部署

注册一个 MongoDB 账号

我是这样选的

免费的

再这样选

用户名密码要记住

同意所有 IP

结束

无痕模式申请 Vercel 账号









下面要好好操作 值


操作这个字符串, 将 <password> 改成刚刚设置的自己的密码







11.2 前端配置


这一步主要是防止背墙, 但是我这里没办法了只能先不设置二级域名, 直接用下面的吧, 后期在搞大陆可以访问的

先将就用这个一级域名

进入主题配置文件


1 | comments: |
1 | # Twikoo |
记得设置后台密码

十二、博客文章统计图
12.1 新建 charts 页面
1 | hexo new page charts |

12.2 安装插件
1 | npm i cheerio --save |
12.3 引入 ECharts.js
1 | inject: |

12.4 文章统计代码
在 hexo-theme-butterfly\scripts\helpers\ 文件下新建 charts.js 文件
不要管缩进, 复制就完了
1 | const cheerio = require('cheerio') |
12.5 使用统计图
在 source\charts\index.md 文件中添加以下内容
1 | <!-- 文章发布时间统计图 --> |
posts-chart的data-start="2021-01"属性表示文章发布时间统计图仅显示2021-01及以后的文章数据。tags-chart的data-length="10"属性表示仅显示排名前10的标签。categories-chart的data-parent="true"属性表示有子分类时以旭日图显示分类,其他无子分类或设置为false或不设置该属性或设置为其他非true属性情况都以饼状图显示分类。
在归档页使用统计图
在 hexo-theme-butterfly\layout\archive.pug 中修改代码, 直接复制过去就行
代码中的先后顺序会影响统计图在博客中的显示顺序
1 | extends includes/layout.pug |

在标签页使用统计图
这个标签页不是指 tag 文件夹下的 index.md文件, 而是博客中点进去一个标签进去的页面
在 hexo-theme-butterfly\layout\tag.pug 中修改代码, 直接复制过去就行
代码中的先后顺序会影响统计图在博客中的显示顺序
1 | extends includes/layout.pug |

在分类页使用统计图
这个分类页不是指 category 文件夹下的 index.md文件, 而是博客中点进去一个分类进去的页面
在 hexo-theme-butterfly\layout\category.pug 中修改代码, 直接复制过去就行
代码中的先后顺序会影响统计图在博客中的显示顺序
1 | extends includes/layout.pug |

12.6 适配明暗模式
在 charts.js 中加入以下代码
1 | function switchPostChart () { |
12.7 Hexo 三连
1 | hexo c;hexo g;hexo d |
十三、直达底部按钮
在 hexo-theme-butterfly\layout\includes\rightside.pug 下进行修改

1 | button#go-up(type="button" title=_p("rightside.back_to_top")) |

十四、网站恶搞标题
在 source\js 下新建 title.js 文件, 写入以下内容
1 | //动态标题 |

在主题配置文件中引入
1 | inject: |









