upgrade fluid && add snowflake

This commit is contained in:
mei 2024-12-27 14:25:16 +08:00
parent 470dcf001c
commit c65fb9718e
4 changed files with 224 additions and 31 deletions

View File

@ -62,7 +62,7 @@ code:
highlightjs: highlightjs:
# 在链接中挑选 style 填入 # 在链接中挑选 style 填入
# Select a style in the link # Select a style in the link
# See: https://highlightjs.org/static/demo/ # See: https://highlightjs.org/demo/
style: "github gist" style: "github gist"
style_dark: "dark" style_dark: "dark"
@ -83,7 +83,7 @@ fun_features:
# 为 subtitle 添加打字机效果 # 为 subtitle 添加打字机效果
# Typing animation for subtitle # Typing animation for subtitle
typing: typing:
enable: true enable: false
# 打印速度,数字越大越慢 # 打印速度,数字越大越慢
# Typing speed, the larger the number, the slower # Typing speed, the larger the number, the slower
@ -91,7 +91,7 @@ fun_features:
# 游标字符 # 游标字符
# Cursor character # Cursor character
cursorChar: "光锥之内,就是命运" cursorChar: "_"
# 是否循环播放效果 # 是否循环播放效果
# If true, loop animation # If true, loop animation
@ -109,8 +109,10 @@ fun_features:
element: h1,h2,h3,h4,h5,h6 element: h1,h2,h3,h4,h5,h6
# Options: left | right # Options: left | right
placement: left placement: left
# Options: hover | always | touch
# Options: hover | always
visible: hover visible: hover
# Options: § | # | ❡ # Options: § | # | ❡
icon: "" icon: ""
@ -128,7 +130,7 @@ fun_features:
dark_mode: dark_mode:
enable: true enable: true
# 默认的选项(当用户手动切换后则不再按照默认模式),选择 `auto` 会优先遵循 prefers-color-scheme其次按用户本地时间 18 点到次日 6 点之间进入暗色模式 # 默认的选项(当用户手动切换后则不再按照默认模式),选择 `auto` 会优先遵循 prefers-color-scheme其次按用户本地时间 18 点到次日 6 点之间进入暗色模式
# Default option (when the visitor switches manually, the default mode is no longer followed), choosing `auto` will give priority to prefers-color-scheme, and then enter the dark mode from 18:00 to 6:00 in the visitors local time # Default option (when the visitor switches manually, the default mode is no longer followed), choosing `auto` will give priority to prefers-color-scheme, and then enter the dark mode from 18:00 to 6:00 in the visitor's local time
# Options: auto | light | dark # Options: auto | light | dark
default: auto default: auto
@ -154,7 +156,7 @@ color:
navbar_text_color_dark: "#d0d0d0" navbar_text_color_dark: "#d0d0d0"
# 副标题字体色 # 副标题字体色
# Color of navigation bar text # Color of subtitle text
subtitle_color: "#fff" subtitle_color: "#fff"
subtitle_color_dark: "#d0d0d0" subtitle_color_dark: "#d0d0d0"
@ -265,16 +267,6 @@ web_analytics: # 网页访问统计
sid: sid:
cid: cid:
# 51.la 站点统计 ID
# 51.la analytics
# See: https://www.51.la/user/site/index
woyaola:
# 友盟/cnzz 站点统计 web_id
# cnzz analytics
# See: https://web.umeng.com/main.php?c=site&a=show
cnzz:
# LeanCloud 计数统计,可用于 PV UV 展示,如果 `web_analytics: enable` 没有开启PV UV 展示只会查询不会增加 # LeanCloud 计数统计,可用于 PV UV 展示,如果 `web_analytics: enable` 没有开启PV UV 展示只会查询不会增加
# LeanCloud count statistics, which can be used for PV UV display. If `web_analytics: enable` is false, PV UV display will only query and not increase # LeanCloud count statistics, which can be used for PV UV display. If `web_analytics: enable` is false, PV UV display will only query and not increase
leancloud: leancloud:
@ -290,6 +282,40 @@ web_analytics: # 网页访问统计
# If true, ignore localhost & 127.0.0.1 # If true, ignore localhost & 127.0.0.1
ignore_local: false ignore_local: false
# Umami Analytics仅支持自部署。如果要展示 PV UV 需要填写所有配置项,否则只填写 `src` 和 `website_id` 即可
# Umami Analytics, only Self-host support. If you want to display PV UV need to set all config items, otherwise only set 'src' and 'website_id'
# See: https://umami.is/docs
umami:
# umami js 文件地址,需要在 umami 后台创建站点后获取
# umami js file url, get after create website in umami
src: "https://umami.mmeiblog.cn/script.js"
# umami 的 website id需要在 umami 后台创建站点后获取
# umami website id, get after create website in umami
website_id: "f41c8851-4c0f-49e4-9dc4-0d1f227dbba5"
# 如果你只想统计特定的域名可以填入此字段,多个域名通过逗号分隔,这可以避免统计 localhost。
# If you only want to tracker to specific domains you can fill in this field, multiple domain names are separated by commas, which can avoid tracker localhost
domains:
# 用于统计 PV UV 的开始时间,格式为 "YYYY-MM-DD"
# statistics on the start time, the format is "YYYY-MM-DD"
start_time: 2023-07-12
# 新建一个 umami viewOnly 用户,然后通过 login api 获取该用户 token
# create an umami viewOnly user, and then get user token through the login api
token:
# 填写 umami 部署的服务器地址,如 "https://umami.example.com"
# server url of umami deployment, such as "https://umami.example.com"
api_server: "https://umami.mmeiblog.cn"
# Canonical 用于向 Google 搜索指定规范网址,开启前确保 hexo _config.yml 中配置 `url: http://yourdomain.com`
# Canonical, to specify a canonical URL for Google Search, need to set up `url: http://yourdomain.com` in hexo _config.yml
# See: https://support.google.com/webmasters/answer/139066
canonical:
enable: false
# 对页面中的图片和评论插件进行懒加载处理,可见范围外的元素不会提前加载 # 对页面中的图片和评论插件进行懒加载处理,可见范围外的元素不会提前加载
# Lazy loading of images and comment plugin on the page # Lazy loading of images and comment plugin on the page
lazyload: lazyload:
@ -447,9 +473,9 @@ footer:
statistics: statistics:
enable: false enable: false
# 统计数据来源,使用 leancloud 需要设置 `web_analytics: leancloud` 中的参数;使用 busuanzi 不需要额外设置,但是有时不稳定,另外本地运行时 busuanzi 显示统计数据很大属于正常现象,部署后会正常 # 统计数据来源,使用 leancloud, umami 需要设置 `web_analytics` 中对应的参数;使用 busuanzi 不需要额外设置,但是有时不稳定,另外本地运行时 busuanzi 显示统计数据很大属于正常现象,部署后会正常
# Data source. If use leancloud, you need to set the parameter in `web_analytics: leancloud` # Data source. If use leancloud, umami, you need to set the parameter in `web_analytics`
# Options: busuanzi | leancloud # Options: busuanzi | leancloud | umami
source: "busuanzi" source: "busuanzi"
# 国内大陆服务器的备案信息 # 国内大陆服务器的备案信息
@ -457,13 +483,13 @@ footer:
beian: beian:
enable: false enable: false
# ICP证号 # ICP证号
icp_text: icp_text: 京ICP证123456号
# 公安备案号不填则只显示ICP # 公安备案号不填则只显示ICP
police_text: police_text: 京公网安备12345678号
# 公安备案的编号用于URL跳转查询 # 公安备案的编号用于URL跳转查询
police_code: police_code: 12345678
# 公安备案的图片. 为空时不显示备案图片 # 公安备案的图片. 为空时不显示备案图片
police_icon: police_icon: /img/police_beian.png
#--------------------------- #---------------------------
@ -480,7 +506,7 @@ index:
# Available: 0 - 100 # Available: 0 - 100
banner_img_height: 100 banner_img_height: 100
# 头图黑色蒙版的不透明度available: 0 - 1.0 1 是完全不透明 # 头图黑色蒙版的不透明度available: 0 - 1.01 是完全不透明
# Opacity of the banner mask, 1.0 is completely opaque # Opacity of the banner mask, 1.0 is completely opaque
# Available: 0 - 1.0 # Available: 0 - 1.0
banner_mask_alpha: 0.3 banner_mask_alpha: 0.3
@ -592,7 +618,7 @@ post:
enable: false enable: false
# 统计数据来源 # 统计数据来源
# Data Source # Data Source
# Options: busuanzi | leancloud # Options: busuanzi | leancloud | umami
source: "busuanzi" source: "busuanzi"
# 在文章开头显示文章更新时间,该时间默认是 md 文件更新时间,可通过 front-matter 中 `updated` 手动指定(和 date 一样格式) # 在文章开头显示文章更新时间,该时间默认是 md 文件更新时间,可通过 front-matter 中 `updated` 手动指定(和 date 一样格式)
@ -1114,7 +1140,7 @@ static_prefix:
internal_css: /css internal_css: /css
internal_img: /img internal_img: /img
anchor: https://lib.baomitu.com/anchor-js/4.3.1/ anchor: https://lib.baomitu.com/anchor-js/5.0.0/
github_markdown: https://lib.baomitu.com/github-markdown-css/4.0.0/ github_markdown: https://lib.baomitu.com/github-markdown-css/4.0.0/
@ -1144,7 +1170,7 @@ static_prefix:
valine: https://lib.baomitu.com/valine/1.5.1/ valine: https://lib.baomitu.com/valine/1.5.1/
waline: https://cdn.staticfile.org/waline/2.15.5/ waline: https://registry.npmmirror.com/@waline/client/2.15.8/files/dist/
gitalk: https://lib.baomitu.com/gitalk/1.8.0/ gitalk: https://lib.baomitu.com/gitalk/1.8.0/
@ -1155,3 +1181,5 @@ static_prefix:
discuss: https://lib.baomitu.com/discuss/1.2.1/ discuss: https://lib.baomitu.com/discuss/1.2.1/
hint: https://lib.baomitu.com/hint.css/2.7.0/ hint: https://lib.baomitu.com/hint.css/2.7.0/
moment: https://lib.baomitu.com/moment.js/2.29.4/

View File

@ -1,4 +1,5 @@
hexo.extend.injector.register('head_begin', '<script defer src="https://umami.mmeiblog.cn/script.js" data-website-id="f41c8851-4c0f-49e4-9dc4-0d1f227dbba5"></script>', 'default'); hexo.extend.injector.register('body_end', '<script src="/js/snowflake.js"></script>', 'default');
// hexo.extend.injector.register('body_end', '<script src="/js/china-lantern.js"></script>', 'default');
// 预先连接的域名 // 预先连接的域名
hexo.extend.injector.register('head_begin', '<link rel="preconnect" href="https://api.mmeiblog.cn"><link rel="preconnect" href="https://img.mmeiblog.cn"><link rel="preconnect" href="https://img.su-mei.cn"><link rel="preconnect" href="https://lib.baomitu.com">', 'default'); hexo.extend.injector.register('head_begin', '<link rel="preconnect" href="https://api.mmeiblog.cn"><link rel="preconnect" href="https://img.mmeiblog.cn"><link rel="preconnect" href="https://lib.baomitu.com">', 'default');
hexo.extend.injector.register('head_begin', '<link rel="preconnect" href="https://q1.qlogo.cn">', 'about'); hexo.extend.injector.register('head_begin', '<link rel="preconnect" href="https://q1.qlogo.cn">', 'about');

View File

@ -0,0 +1,37 @@
(function (factory) {
typeof define === 'function' && define.amd ? define(factory) :
factory();
}((function () { 'use strict';
function styleInject(css, ref) {
if ( ref === void 0 ) ref = {};
var insertAt = ref.insertAt;
if (!css || typeof document === 'undefined') { return; }
var head = document.head || document.getElementsByTagName('head')[0];
var style = document.createElement('style');
style.type = 'text/css';
if (insertAt === 'top') {
if (head.firstChild) {
head.insertBefore(style, head.firstChild);
} else {
head.appendChild(style);
}
} else {
head.appendChild(style);
}
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
}
var css_248z = "@charset \"UTF-8\";.lantern__warpper{position:fixed;top:12px;left:40px;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:999}.lantern__warpper.lantern__secondary{left:calc(100% - 130px)}.lantern__warpper.lantern__secondary .lantern__box{-webkit-animation-duration:3s;animation-duration:3s}.lantern__box{position:relative;display:inline-block;width:90px;height:70px;background:rgba(216,0,15,.8);border-radius:50% 50%;animation:lantern-swing 3s ease-in-out infinite alternate-reverse;-webkit-transform-origin:50% -70px;-ms-transform-origin:50% -70px;transform-origin:50% -70px;-webkit-box-shadow:-5px 5px 50px 4px #fa6c00;box-shadow:-5px 5px 50px 4px #fa6c00}.lantern__box:after,.lantern__box:before{content:\"\";position:absolute;height:8px;width:45px;left:50%;border:1px solid #dc8f03;background:-webkit-gradient(linear,left top,right top,from(#dc8f03),color-stop(orange),color-stop(#dc8f03),color-stop(orange),to(#dc8f03));background:-o-linear-gradient(left,#dc8f03,orange,#dc8f03,orange,#dc8f03);background:linear-gradient(90deg,#dc8f03,orange,#dc8f03,orange,#dc8f03)}.lantern__box:before{top:0;border-radius:5px 5px 0 0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.lantern__box:after{bottom:0;border-radius:0 0 5px 5px;-webkit-transform:translate(-50%,50%);-ms-transform:translate(-50%,50%);transform:translate(-50%,50%)}.lantern__line{position:absolute;width:2px;height:12px;top:0;left:50%;-webkit-transform:translate(-50%,-100%);-ms-transform:translate(-50%,-100%);transform:translate(-50%,-100%);background:#dc8f03}.lantern__circle{width:80%;-webkit-box-sizing:border-box;box-sizing:border-box}.lantern__circle,.lantern__circle .lantern__ellipse{height:100%;margin:0 auto;border-radius:50%;border:2px solid #dc8f03}.lantern__circle .lantern__ellipse{width:50%}.lantern__circle .lantern__text{font-family: 华文行楷 ,Microsoft YaHei,sans-serif;font-size:24.3px;color:#dc8f03;font-weight:700;line-height:66px;text-align:center}.lantern__tail{position:relative;width:4px;height:12px;margin:0 auto;animation:lantern-swing 4s ease-in-out infinite alternate-reverse;background:orange;border-radius:0 0 5px 5px}.lantern__tail .lantern__junction{position:absolute;top:0;left:50%;width:8px;height:8px;-webkit-transform:translate(-50%,8.4px);-ms-transform:translate(-50%,8.4px);transform:translate(-50%,8.4px);background:#e69603;border-radius:50%}.lantern__tail .lantern__rect{position:absolute;top:0;left:50%;-webkit-transform:translate(-50%,10.8px);-ms-transform:translate(-50%,10.8px);transform:translate(-50%,10.8px);width:8px;height:24px;background:orange;border-radius:5px 5px 0 5px}@-webkit-keyframes lantern-swing{0%{-webkit-transform:rotate(-8deg);transform:rotate(-8deg)}to{-webkit-transform:rotate(8deg);transform:rotate(8deg)}}@keyframes lantern-swing{0%{-webkit-transform:rotate(-8deg);transform:rotate(-8deg)}to{-webkit-transform:rotate(8deg);transform:rotate(8deg)}}@media (max-width:460px){.lantern__warpper{top:8px;left:30px}.lantern__warpper.lantern__secondary{left:calc(100% - 80px)}.lantern__box{width:50px;height:40px;-webkit-transform-origin:50% -40px;-ms-transform-origin:50% -40px;transform-origin:50% -40px;-webkit-box-shadow:-5px 5px 50px -1px #fa6c00;box-shadow:-5px 5px 50px -1px #fa6c00}.lantern__box:after,.lantern__box:before{height:4px;width:25px}.lantern__line{width:2px;height:8px}.lantern__circle .lantern__text{font-size:13.5px;line-height:38px}.lantern__tail{width:4px;height:8px}.lantern__tail .lantern__junction{width:8px;height:8px;-webkit-transform:translate(-50%,5.6px);-ms-transform:translate(-50%,5.6px);transform:translate(-50%,5.6px)}.lantern__tail .lantern__rect{-webkit-transform:translate(-50%,7.2px);-ms-transform:translate(-50%,7.2px);transform:translate(-50%,7.2px);width:8px;height:16px}}";
styleInject(css_248z);
var content = '<div class="lantern__warpper"><div class="lantern__box"><div class="lantern__line"></div><div class="lantern__circle"><div class="lantern__ellipse"><div class="lantern__text"> 小 </div></div></div><div class="lantern__tail"><div class="lantern__rect"></div><div class="lantern__junction"></div></div></div></div><div class="lantern__warpper lantern__secondary"><div class="lantern__box"><div class="lantern__line"></div><div class="lantern__circle"><div class="lantern__ellipse"><div class="lantern__text"> 年 </div></div></div><div class="lantern__tail"><div class="lantern__rect"></div><div class="lantern__junction"></div></div></div></div>';
function createElement() {
var div = document.createElement('div');
div.className = 'j-china-lantern';
div.innerHTML = content;
document.body.appendChild(div);
}
createElement();
})));

127
source/js/snowflake.js Normal file
View File

@ -0,0 +1,127 @@
/* 控制下雪 */
function snowFall(snow) {
/* 可配置属性 */
snow = snow || {};
this.maxFlake = snow.maxFlake || 150; /* 最多片数 */
this.flakeSize = snow.flakeSize || 10; /* 雪花形状 */
this.fallSpeed = snow.fallSpeed || 1; /* 坠落速度 */
}
/* 兼容写法 */
requestAnimationFrame = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame ||
function(callback) { setTimeout(callback, 1000 / 60); };
cancelAnimationFrame = window.cancelAnimationFrame ||
window.mozCancelAnimationFrame ||
window.webkitCancelAnimationFrame ||
window.msCancelAnimationFrame ||
window.oCancelAnimationFrame;
/* 开始下雪 */
snowFall.prototype.start = function(){
/* 创建画布 */
snowCanvas.apply(this);
/* 创建雪花形状 */
createFlakes.apply(this);
/* 画雪 */
drawSnow.apply(this)
}
/* 创建画布 */
function snowCanvas() {
/* 添加Dom结点 */
var snowcanvas = document.createElement("canvas");
snowcanvas.id = "snowfall";
snowcanvas.width = document.body.offsetWidth;
snowcanvas.height = window.innerHeight;
snowcanvas.setAttribute("style", "position:fixed; top: 0; left: 0; z-index: 9999; pointer-events: none;");
document.getElementsByTagName("body")[0].appendChild(snowcanvas);
this.canvas = snowcanvas;
this.ctx = snowcanvas.getContext("2d");
/* 窗口大小改变的处理 */
window.onresize = function() {
// snowcanvas.width = document.body.offsetWidth;
/* snowcanvas.height = window.innerHeight */
}
}
/* 雪运动对象 */
function flakeMove(canvasWidth, canvasHeight, flakeSize, fallSpeed) {
this.x = Math.floor(Math.random() * canvasWidth); /* x坐标 */
this.y = Math.floor(Math.random() * canvasHeight); /* y坐标 */
this.size = Math.random() * flakeSize + 2; /* 形状 */
this.maxSize = flakeSize; /* 最大形状 */
this.speed = Math.random() * 1 + fallSpeed; /* 坠落速度 */
this.fallSpeed = fallSpeed; /* 坠落速度 */
this.velY = this.speed; /* Y方向速度 */
this.velX = 0; /* X方向速度 */
this.stepSize = Math.random() / 30; /* 步长 */
this.step = 0 /* 步数 */
}
flakeMove.prototype.update = function() {
var x = this.x,
y = this.y;
/* 左右摆动(余弦) */
this.velX *= 0.98;
if (this.velY <= this.speed) {
this.velY = this.speed
}
this.velX += Math.cos(this.step += .05) * this.stepSize;
this.y += this.velY;
this.x += this.velX;
/* 飞出边界的处理 */
if (this.x >= canvas.width || this.x <= 0 || this.y >= canvas.height || this.y <= 0) {
this.reset(canvas.width, canvas.height)
}
};
/* 飞出边界-放置最顶端继续坠落 */
flakeMove.prototype.reset = function(width, height) {
this.x = Math.floor(Math.random() * width);
this.y = 0;
this.size = Math.random() * this.maxSize + 2;
this.speed = Math.random() * 1 + this.fallSpeed;
this.velY = this.speed;
this.velX = 0;
};
// 渲染雪花-随机形状(此处可修改雪花颜色!!!)
flakeMove.prototype.render = function(ctx) {
var snowFlake = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.size);
snowFlake.addColorStop(0, "rgba(255, 255, 255, 0.9)"); /* 此处是雪花颜色,默认是白色 */
snowFlake.addColorStop(.5, "rgba(255, 255, 255, 0.5)"); /* 若要改为其他颜色,请自行查 */
snowFlake.addColorStop(1, "rgba(255, 255, 255, 0)"); /* 找16进制的RGB 颜色代码。 */
ctx.save();
ctx.fillStyle = snowFlake;
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fill();
ctx.restore();
};
/* 创建雪花-定义形状 */
function createFlakes() {
var maxFlake = this.maxFlake,
flakes = this.flakes = [],
canvas = this.canvas;
for (var i = 0; i < maxFlake; i++) {
flakes.push(new flakeMove(canvas.width, canvas.height, this.flakeSize, this.fallSpeed))
}
}
/* 画雪 */
function drawSnow() {
var maxFlake = this.maxFlake,
flakes = this.flakes;
ctx = this.ctx, canvas = this.canvas, that = this;
/* 清空雪花 */
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (var e = 0; e < maxFlake; e++) {
flakes[e].update();
flakes[e].render(ctx);
}
/* 一帧一帧的画 */
this.loop = requestAnimationFrame(function() {
drawSnow.apply(that);
});
}
/* 调用及控制方法 */
var snow = new snowFall({maxFlake:200});
snow.start();