前言
最近将博客从 Jekyll 迁移到 Hexo,在迁移的过程中也遇到一些问题,下面就简单记录一下 Hexo+NexT+Github Pages 的搭建步骤。
在上一章,我们将为博客添加一个网页音乐播放器,在本章,我们将进行最后的博客样式调整,让他变得更好看一些。
实现点击出现桃心效果
实现效果图
具体实现方法
在网址输入如下:
1 | http://7u2ss1.com1.z0.glb.clouddn.com/love.js |
然后将里面的代码copy一下,新建love.js
文件并且将代码复制进去,然后保存。将love.js
文件放到路径/themes/next/source/js/src
里面,然后打开\themes\next\layout\_layout.swig
文件,在末尾(在前面引用会出现找不到的bug)添加以下代码:
1 | <!-- 页面点击小红心 --> |
点击爆炸效果
创建 Hexo/themes/next/source/js/fireworks.js
文件,添加以下内容。
1 | function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,180)*Math.PI/180,a=anime.random(25,90),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(8,16),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color="#F00",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(600,900),easing:"easeOutExpo",update:renderParticule}).add({targets:a,radius:anime.random(40,80),lineWidth:0,alpha:{value:0,easing:"linear",duration:anime.random(300,400)},duration:anime.random(600,900),easing:"easeOutExpo",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(".fireworks");if(canvasEl){var ctx=canvasEl.getContext("2d"),numberOfParticules=30,pointerX=0,pointerY=0,tap="mousedown",colors=["#FF1461","#18FF92","#5A87FF","#FBF38C"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+"px",canvasEl.style.height=window.innerHeight+"px",canvasEl.getContext("2d").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){"sidebar"!==e.target.id&&"toggle-sidebar"!==e.target.id&&"A"!==e.target.nodeName&&"IMG"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener("resize",setCanvasSize,!1)}"use strict";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,180)*Math.PI/90,a=anime.random(25,90),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(8,16),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color="#F00",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t<e.animatables.length;t++){e.animatables[t].target.draw()}}function animateParticules(e,t){for(var a=createCircle(e,t),n=[],i=0;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({targets:n,x:function(e){return e.endPos.x},y:function(e){return e.endPos.y},radius:0.1,duration:anime.random(600,900),easing:"easeOutExpo",update:renderParticule}).add({targets:a,radius:anime.random(40,80),lineWidth:0,alpha:{value:0,easing:"linear",duration:anime.random(300,400)},duration:anime.random(600,900),easing:"easeOutExpo",update:renderParticule,offset:0})}function debounce(e,t){var a;return function(){var n=this,i=arguments;clearTimeout(a),a=setTimeout(function(){e.apply(n,i)},t)}}var canvasEl=document.querySelector(".fireworks");if(canvasEl){var ctx=canvasEl.getContext("2d"),numberOfParticules=30,pointerX=0,pointerY=0,tap="mousedown",colors=["#FF1461","#18FF92","#5A87FF","#FBF38C"],setCanvasSize=debounce(function(){canvasEl.width=2*window.innerWidth,canvasEl.height=2*window.innerHeight,canvasEl.style.width=window.innerWidth+"px",canvasEl.style.height=window.innerHeight+"px",canvasEl.getContext("2d").scale(2,2)},500),render=anime({duration:1/0,update:function(){ctx.clearRect(0,0,canvasEl.width,canvasEl.height)}});document.addEventListener(tap,function(e){"sidebar"!==e.target.id&&"toggle-sidebar"!==e.target.id&&"A"!==e.target.nodeName&&"IMG"!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!1),setCanvasSize(),window.addEventListener("resize",setCanvasSize,!1)}; ; |
接着打开 主题配置文件 ,在最底部添加
1 | Fireworks |
打开 hexo/next/layout/_layout.swig
, 在</body>
上面写下如下代码:
1 | {% if theme.fireworks.enabled %} |
在每篇文章末尾统一添加“本文结束”标记
实现效果图
具体实现方法
在路径 \themes\next\layout\_macro
中新建 passage-end-tag.swig
文件,并添加以下内容:
1 | <div> |
接着打开 \themes\next\layout\_macro\post.swig
文件,在 post-body
之后, post-footer
之前添加如下代码:
1 | {% if not is_index and theme.passage_end_tag.enabled %} |
接着打开 主题配置文件 ,在末尾添加:
1 | 文章末尾添加“本文结束”标记 |
完成以上设置之后,在每篇文章之后都会添加如上效果图的样子。
设置网站的图标 Favicon
实现效果图
具体方法实现
在 EasyIcon 中找一张合适的 ico 图标,或者去别的网站下载或者制作,并将图标名称改为 favicon.ico
,然后把图标放在 /themes/next/source/images
里,接着打开 主题配置文件 ,搜索关键字 iocn
, 修改如下:
1 | favicon: |
背景添加动态线条效果
打开 next/layout/_layout.swig
在 </body>
之前添加代码(注意不要放在 </head>
的后面)
1 | {% if theme.canvas_nest %} |
打开 主题配置文件 ,在末尾添加如下代码:
1 | -------------------------------------------------------------- |
如果你感觉默认的线条太多的话可以修改 ``next/layout/_layout.swig`:
1 | {% if theme.canvas_nest %} |
color:
线条颜色, 默认: '0,0,0'
;三个数字分别为(R,G,B)opacity:
线条透明度(0~1), 默认: 0.5
count:
线条的总数量, 默认: 150
zIndex:
背景的 z-index 属性,css 属性用于控制所在层的位置, 默认: -1
背景添加动态彩带效果
在 Hexo 文件夹下打开 git bash ,并输入:
1 | cd themes/next |
打开 主题配置文件 ,搜索 canvas_ribbon
关键字,设置如下:
1 | canvas_ribbon: |
需要使用 CDN 的话继续设置:
1 | vendors: |
设置圆角
打开 hexo\themes\next\source\css\_variables\Gemini.styl
, 修改变量:
1 | $border-radius-inner = 0.5rem; |
设置背景图片
分享一个非常好用的背景图网站 https://www.toptal.com/designers/subtlepatterns
找一个你心仪的背景图,下载保存到 hexo\themes\next\images\
下
打开 hexo\themes\next\source\css\_variables\Gemini.styl
, 找到 $body-bg-color
, 设置如下:
1 | $body-bg-color = url(/images/background.png); |
设置目录背景图
找一个你心仪的背景图,下载保存到 hexo\themes\next\images\
下
打开 hexo\themes\next\source\css\_variables\Gemini.styl
, 添加变量:
1 | $header-inner-bg-color = url(/images/site-brand-background.jpg); |
新建 hexo\themes\next\source\css\_schemes\Gemini\_header.styl
, 输入:
1 | .site-brand-container { |
打开 hexo\themes\next\source\css\_schemes\Gemini\index.styl
, 搜索 @import '../Pisces/_header';
, 修改为
1 | @import '../Gemini/_header'; |
设置回到顶部彩带
打开 hexo\themes\next\source\css\_variables\Gemini.styl
, 添加变量:
1 | $b2c-bg-color = linear-gradient(90deg,#6dba82 0,#07b39b 15%,#1098ad 30%,#5073b8 44%,#a166ab 58%,#ef4e7b 72%,#f37055 86%,#f79533 100%); |
新建 hexo\themes\next\source\css\_schemes\Gemini\_sidebar.styl
, 输入:
1 | .sidebar { |
打开 hexo\themes\next\source\css\_schemes\Gemini\index.styl
, 搜索 @import '../Pisces/_sidebar';
, 修改为
1 | @import '../Gemini/_sidebar'; |
设置分页样式
打开 hexo\themes\next\source\css\_schemes\Gemini\index.styl
, 搜索 // Pagination.
, 修改为
1 | // Pagination. |
设置 Valine 评论样式
新建 hexo\themes\next\source\css\_schemes\Gemini\valine.styl
, 输入:
1 | #valine-comments button { |
打开 hexo\themes\next\source\css\_schemes\Gemini\index.styl
, 引入刚才新加的样式
1 | @import '../Gemini/valine.styl'; |