Merge pull request #683 from Vixcity/dev

黑夜模式下添加星空雨特效
This commit is contained in:
tangly1024
2023-01-07 22:07:53 +08:00
committed by GitHub
4 changed files with 139 additions and 1 deletions

View File

@@ -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

133
components/StarrySky.js Normal file
View File

@@ -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 (
<div className="relative">
<canvas id="starry-sky-vixcity" className="fixed"></canvas>
</div>
)
}
/**
* 创建星空雨
* @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)
})()
}

View File

@@ -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 && <Messenger />}
{JSON.parse(BLOG.FIREWORKS) && <Fireworks />}
{JSON.parse(BLOG.SAKURA) && <Sakura />}
{JSON.parse(BLOG.STARRY_SKY) && <StarrySky />}
{JSON.parse(BLOG.MUSIC_PLAYER) && <MusicPlayer />}
</>

View File

@@ -29,7 +29,7 @@ export const ArticleInfo = (props) => {
passHref
className="cursor-pointer whitespace-nowrap">
<i className='far fa-calendar-minus fa-fw'/>发布日期:{date}
<i className='far fa-calendar-minus fa-fw'/> 发布日期:{date}
</Link>
<span className='whitespace-nowrap'>