gpt4 book ai didi

css - 爆炸粒子 : Animating with CSS

转载 作者:行者123 更新时间:2023-12-04 20:28:34 25 4
gpt4 key购买 nike

我想模拟粒子爆炸,从屏幕中心到边缘(在 CSS 中,我保证不会将其用于恶意目的)

这是一个视觉效果,所以你知道我在说什么:

之前:

BEFORE

之后:

AFTER

我试过使用以下 HTML/CSS/JS,但它不起作用(点仍然在屏幕中间):

HTML 是这样的:

<div id="animated"></div>

CSS:

// SCSS
#animated {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;

.particle {
position: absolute;
left: 50%;
top: 50%;
width: 10px;
height: 10px;
transition: transform 1s ease-in-out;

&.on {
transform: translate(-30vw, -30vh);
}

&::after {
position: absolute;
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background: red;
}
}
}

和 Javascript:

document.addEventListener('DOMContentLoaded', onLoad);

function onLoad() {
// animate
for(var i = 0; i < 360; i+=5) {
const particle = createParticle(animated, i);
}
}

function createParticle(parentElem, rotation) {
const particle = document.createElement('div');
particle.style.transform = `rotate(${rotation}deg)`;
particle.classList.add('particle');
particle.classList.add('on'); // turn on
parentElem.appendChild(particle);

return particle;
}

这是 CodePen 的链接:https://codepen.io/floatingrock/pen/KKpxpvJ

最佳答案

这里有一个 CSS 变量的想法,它很容易用很少的代码进行调整。

全屏运行以获得更好的结果:

document.addEventListener('DOMContentLoaded', onLoad);

function onLoad() {
let parentElem = document.querySelector('.container');
for (var i = 0; i < 360; i += 10) {
const particle = document.createElement('div');
particle.style = `--r:${i}deg`;
parentElem.appendChild(particle);
}
}
.container {
width: 20px;
height: 20px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

.container>div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background: red;
transform: rotate(var(--r, 0deg)) translate(0);
animation: splash 1s infinite alternate 1s;
}

@keyframes splash {
to {
transform: rotate(var(--r, 0deg)) translate(44vmin);
}
}
<div class="container">
</div>

你可以考虑另一种动画的不同延迟:

document.addEventListener('DOMContentLoaded', onLoad);

function onLoad() {
let parentElem = document.querySelector('.container');
for (var i = 0; i < 360; i += 10) {
const particle = document.createElement('div');
particle.style = `--r:${i}deg;--d:${(i/360)}s`;
parentElem.appendChild(particle);
}
}
.container {
width: 20px;
height: 20px;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

.container>div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background: red;
transform: rotate(var(--r, 0deg)) translate(0);
animation: splash 1s infinite alternate var(--d,0s);
}

@keyframes splash {
to {
transform: rotate(var(--r, 0deg)) translate(44vmin);
}
}
<div class="container">
</div>


我们仍然可以用更少的 CSS 优化代码:

document.addEventListener('DOMContentLoaded', onLoad);

function onLoad() {
let parentElem = document.querySelector('.container');
for (var i = 0; i < 360; i += 10) {
const particle = document.createElement('div');
particle.style = `--r:${i}deg`;
parentElem.appendChild(particle);
}
}
.container > div {
position: fixed;
top: 50%;
left: 50%;
width: 20px;
height: 20px;
border-radius: 50%;
background: red;
transform:translate(-50%, -50%) rotate(var(--r, 0deg)) translate(0);
animation: splash 1s infinite alternate 1s;
}

@keyframes splash {
to {
transform:translate(-50%, -50%) rotate(var(--r, 0deg)) translate(calc(50vmin - 10px));
}
}


/* Irrelevant styles */
html {
height:100%;
border:1px solid blue; /* screen border*/
box-sizing:border-box;
background:linear-gradient(green,green) center/10px 10px no-repeat; /* the center of the screen */
}
body {
margin:0;
}
<div class="container">
</div>

转换的顺序很重要。相关:Why does order of transforms matter? rotate/scale doesn't give the same result as scale/rotate

关于css - 爆炸粒子 : Animating with CSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60797220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com