我制作了这个简洁的灰色爆炸效果。 它没什么特别的,特别是与 CodePen 上惊人的创造力 相比,但我认为我可以记录其中发生的一些事情,以供学习参考。
它是 SVG
SVG 有 <line x1 y1 x2 y2>
,所以我想用它来实现这种爆炸效果应该很容易。 x1 y1 始终是中间,而 x2 y2 是随机生成的。 由于使用的是 viewBox="0 0 100 100"
,因此放置线条的心算非常容易。 你甚至可能更喜欢 -50 -50 100 100
,这样坐标 0 0
就位于中间。
随机数
const getRandomInt = (min, max) => {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
};
有一个这样的函数来生成艺术品真是太好了。 我不仅用它来定位线条,还用它来设置灰色线条的宽度和不透明度。
我使用过这个函数很多次,它让我觉得原生 JavaScript 应该有一个这样的数学辅助函数,它非常清晰易懂。
使用模板文字生成 HTML 太容易了
对我来说,这非常易读
let newLines;
for (let i = 0; i < NUM_LINES; i++) {
newLines += `
<line
x1="50"
y1="50"
x2="${getRandomInt(10, 90)}"
y2="${getRandomInt(10, 90)}"
stroke="rgba(0, 0, 0, 0.${getRandomInt(0, 25)})"
stroke-linecap="round"
stroke-width="${getRandomInt(1, 2)}"
/>`;
}
svg.insertAdjacentHTML("afterbegin", newLines);
点击重新生成互动形式
如果有一个单独的函数来启动绘制艺术品,点击重新生成就像
doArt();
window.addEventListener("click", doArt);
圆角
我发现使用 stroke-linecap="round"
更加令人愉悦。 很高兴我们可以在 SVG 中对线条末端进行圆角处理。
线条的坐标不会移动——它只是一个 CSS 变换
我只是将它放在线条上
line {
transform-origin: center;
animation: do 4s infinite alternate;
}
line:nth-child(6n) {
animation-delay: -1s;
}
line:nth-child(6n + 1) {
animation-delay: -2s;
}
line:nth-child(6n + 2) {
animation-delay: -3s;
}
line:nth-child(6n + 3) {
animation-delay: -4s;
}
line:nth-child(6n + 4) {
animation-delay: -5s;
}
@keyframes do {
100% {
transform: scale(0.69);
}
}
看起来线条只是在变长或变短,但实际上是整个线条在使用 scale()
缩小。 你几乎注意不到线条的变细,因为它们比宽度长得多。
注意负动画延迟。 这样做是为了交错动画,使它们看起来有点随机,但仍然在同一时间开始。
很棒的文章!
这里是不是打错了字?
“你甚至可能更喜欢 -50 -50 100 100,这样坐标 0 0 就位于中间。”
我想应该是“ -50 -50 50 50”。
不,
-50 -50 100 100
绝对是正确的。viewBox
的 4 个值是x_offset y_offset width height
(其中偏移量是左上角的坐标),你希望width
和height
都为100
。我更喜欢这种将
0 0
放在中间的方法,因为它意味着不需要设置x1
和y1
属性。 如果它们没有设置,它们默认就是0
。 这也消除了设置transform-origin
的需要,因为默认的0 0
是在这种情况下我们需要的。而且由于反正都在使用 SCSS,我会在循环中生成延迟。 对于选择器和延迟来说,这都是一个线性函数
不过,缩放有一个让我感到困扰的地方。 缩放也会缩放末端的圆角,所以它最终会被挤压,不再是圆形。 所以我可能会用不同的方法来处理它。
我推荐另一个选项:
shape-rendering="geometricPrecision"
,<circle>
、<ellipse>
、<line>
、<path>
、<polygon>
、<polyline>
和<rect>
元素将更加平滑,更多信息请访问 -> shape-rendering负动画延迟真是让我印象深刻。 我不敢相信我从未想过这种方法。 太棒的技巧了!