diff --git a/blog.config.js b/blog.config.js index 7bb1d440..653d3fe3 100644 --- a/blog.config.js +++ b/blog.config.js @@ -69,6 +69,9 @@ const BLOG = { // 樱花飘落特效 SAKURA: process.env.NEXT_PUBLIC_SAKURA || false, // 开关 + // 星空雨特效 黑夜模式才会生效 + STARRY_SKY: process.env.NEXT_PUBLIC_STARRY_SKY || false, // 开关 + // 悬浮挂件 WIDGET_PET: process.env.NEXT_PUBLIC_WIDGET_PET || true, // 是否显示宠物挂件 WIDGET_PET_LINK: 'https://cdn.jsdelivr.net/npm/live2d-widget-model-wanko@1.0.5/assets/wanko.model.json', // 挂件模型地址 @see https://github.com/xiazeyu/live2d-widget-models diff --git a/components/StarrySky.js b/components/StarrySky.js new file mode 100644 index 00000000..045dd533 --- /dev/null +++ b/components/StarrySky.js @@ -0,0 +1,133 @@ +/* eslint-disable */ +/** + * https://codepen.io/juliangarnier/pen/gmOwJX + * custom by hexo-theme-yun @YunYouJun + */ +import React from 'react' + +export const StarrySky = () => { + React.useEffect(() => { + dark() + }, []) + return ( +
+ +
+ ) +} + +/** + * 创建星空雨 + * @param config + */ +function dark() { + window.requestAnimationFrame = + window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + window.msRequestAnimationFrame + var n, + e, + i, + h, + t = 0.05, + s = document.getElementById('starry-sky-vixcity'), + o = !0, + a = '180,184,240', + r = '226,225,142', + d = '226,225,224', + c = [] + function f() { + ;(n = window.innerWidth), + (e = window.innerHeight), + (i = 0.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(0.2, 1 - 0.4 * (this.comet + 1 - 1))), + (this.do = l(5e-4, 0.002) + 0.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].className == 'dark' && u(), + window.requestAnimationFrame(t) + })() +} diff --git a/pages/_app.js b/pages/_app.js index 0f196386..099b8514 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -26,6 +26,7 @@ import { DebugPanel } from '@/components/DebugPanel' import { ThemeSwitch } from '@/components/ThemeSwitch' import { Fireworks } from '@/components/Fireworks' import { Sakura } from '@/components/Sakura' +import { StarrySky } from '@/components/StarrySky' import MusicPlayer from '@/components/MusicPlayer' const Ackee = dynamic(() => import('@/components/Ackee'), { ssr: false }) @@ -50,6 +51,7 @@ const MyApp = ({ Component, pageProps }) => { {BLOG.FACEBOOK_APP_ID && BLOG.FACEBOOK_PAGE_ID && } {JSON.parse(BLOG.FIREWORKS) && } {JSON.parse(BLOG.SAKURA) && } + {JSON.parse(BLOG.STARRY_SKY) && } {JSON.parse(BLOG.MUSIC_PLAYER) && } diff --git a/themes/matery/components/ArticleInfo.js b/themes/matery/components/ArticleInfo.js index 666a0b0c..da62ac81 100644 --- a/themes/matery/components/ArticleInfo.js +++ b/themes/matery/components/ArticleInfo.js @@ -29,7 +29,7 @@ export const ArticleInfo = (props) => { passHref className="cursor-pointer whitespace-nowrap"> - 发布日期:{date} + 发布日期:{date}