封面《サノバウィッチ》

前言

因为看到了 ciallo.cc 的网站,看了眼源码比较简单,但是因为里面有几个 deprecated 的 html 标签,而且只有美咕噜的语音,所以我就自己写了一个,这里记录一下。

分析

简单来说 ciallo.cc 的网站实现就是简单的采用 marquee 标签来做一个滚动效果,采用 font 标签来做滚动内容。但是这两个标签在 mdn 上都是标记为 deprecated 的,虽然现在看所有浏览器都是支持,但是保不准哪天就哪个浏览器不支持了。所以采用 css 来重新实现一遍。

实现

ciallo 滚动弹幕

采用 css 实现一个,主要为做一个简单的滚动动画,设置为无限期运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.ciallo {
margin: 0%;
padding-left: 100%;
white-space: nowrap;
animation: ciallo-animate 15s linear infinite;
}
@keyframes ciallo-animate {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(-115%, 0);
}
}

字体跳跃动画

一个字体跳跃,参考 stackoverflow 的实现,不过那个一个个写 nth-child,我这还是用 react 来做一个任意长度的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import React from 'react';
import './index.css';

const Jumper = ({ text = "Ciallo~(∠・ω< )⌒★", dur = 1.0 }) => {
const n = text.length;

return (
<div className='box'>
{[...text].map((item, index) => <span key={index} style={{ animationDelay: `${dur * index / n}s` }}>{item}</span>)}
</div>
)
}

export default Jumper;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.box {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
height: 100vh;
width: 100vw;
display: flex;
justify-content: center;
align-items: center;
}
.box span {
z-index: 1;
position: relative;
top: 20px;
font-size: 5rem;
display: inline-block;
animation: bounce 0.3s ease infinite alternate;
}

@keyframes bounce {
0% {
transform: translate3d(0, 0, 0);
text-shadow: rgba(255, 255, 255, 0.4) 0 0 0.05em;
}
100% {
transform: translate3d(0, -0.5em, 0);
text-shadow: rgba(255, 255, 255, 0.4) 0 1em 0.35em;
}
}

点击浮动弹幕

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
const audioList = [meguru]
let audioIndex = 0;

const randomColor = () => {
const r = Math.floor(Math.random() * 256)
const g = Math.floor(Math.random() * 256)
const b = Math.floor(Math.random() * 256)
return `rgb(${r},${g},${b})`
}

const cialloAppend = (event) => {
const x = event.pageX;
const y = event.pageY;
const span = document.createElement('span')
span.innerHTML = 'Ciallo~(∠・ω< )⌒★';
span.style.cssText = `position: absolute; left: ${x}px; top: ${y - 20}px; color: ${randomColor()}; bold;`;
document.body.appendChild(span);
const animation = span.animate({
"top": `${y - 180}px`,
"opacity": 0
}, {
duration: 1500,
});
new Audio(audioList[audioIndex]).play();
audioIndex = (audioIndex + 1) % audioList.length;
animation.onfinish = () => {
span.remove();
}
}

useEffect(() => {
document.body.addEventListener('click', cialloAppend)

return () => {
document.body.removeEventListener('click', cialloAppend)
}
})

完整效果

网址在 https://ciallo.qianxu.run

codesandbox 如下

完整代码见 https://github.com/qxdn/ciallo

后记

整体来说实现很简单,花费不到半天时间。另外后续需要拆包找到更多 ciallo 语音集合。

参考文献

marquee

font