Gar*_*ani 13 javascript css random loops css-animations
我有一个元素,在CSS自定义属性的帮助下,用CSS和JS随机动画,方法如下:
var myElement = document.querySelector('#my-element');
function setProperty(number) {
myElement.style.setProperty('--animation-name', 'vibrate-' + number);
}
function changeAnimation() {
var number = Math.floor(Math.random() * 3) + 1;
setProperty(number);
/* restart the animation */
var clone = myElement.cloneNode(true);
myElement.parentNode.replaceChild(clone, myElement);
}
myElement.addEventListener('animationend', changeAnimation, false);
Run Code Online (Sandbox Code Playgroud)
#my-element {
width: 50px;
height: 50px;
background: #333;
}
:root {
--animation-name: vibrate-1;
}
#my-element {
animation: 3.3s 1 alternate var(--animation-name);
}
@keyframes vibrate-1 {
0% {
opacity: 0;
transform: scale(0.95);
}
50% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(0.9);
}
}
@keyframes vibrate-2 {
0% {
opacity: 0;
transform: scale(0.5);
}
50% {
opacity: 1;
transform: scale(0.9);
}
100% {
opacity: 0;
transform: scale(0.5);
}
}
@keyframes vibrate-3 {
0% {
opacity: 0;
transform: scale(0.3);
}
50% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(0.8);
}
}
Run Code Online (Sandbox Code Playgroud)
<div id="my-element"></div>
Run Code Online (Sandbox Code Playgroud)
背后的想法是有一组动画,每个动画的结尾随机切换到另一个.(对于最终的不透明度,总是为0,以形成一个平滑的不可见开关.)
现在,令人惊讶的是,上面的代码运行得很好,除了它只执行一次然后停止.
我现在有JS循环技术,但我不知道如何在这个工作流程中准确地实现它们.
有人能帮我吗?
使用克隆元素替换元素时,应重新分配animationend
事件侦听器:
var clone = myElement.cloneNode(true);
clone.addEventListener('animationend', changeAnimation, false);
myElement.parentNode.replaceChild(clone, myElement);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,JavaScript中的变量不能包含-
,所以my-element
应该是myElement
.
另一个简单的想法是依靠animationiteration
并使动画运行,infinite
然后你不再需要克隆元素.您只需在每次迭代时更改动画名称,您将获得所需的效果:
var myElement = document.querySelector('#my-element');
function setProperty(number) {
myElement.style.setProperty('--animation-name', 'vibrate-' + number);
}
function changeAnimation() {
var number = Math.floor(Math.random() * 3) + 1;
setProperty(number);
}
myElement.addEventListener('animationiteration', changeAnimation, false);
Run Code Online (Sandbox Code Playgroud)
#my-element {
width: 50px;
height: 50px;
background: #333;
}
#my-element {
animation: 3.3s alternate infinite var(--animation-name,vibrate-1);
}
@keyframes vibrate-1 {
0% {
opacity: 0;
transform: scale(0.95);
}
50% {
opacity: 1;
transform: scale(1);
background:green;
}
100% {
opacity: 0;
transform: scale(0.9);
}
}
@keyframes vibrate-2 {
0% {
opacity: 0;
transform: scale(0.5);
}
50% {
opacity: 1;
transform: scale(0.9);
background:red;
}
100% {
opacity: 0;
transform: scale(0.5);
}
}
@keyframes vibrate-3 {
0% {
opacity: 0;
transform: scale(0.3);
}
50% {
opacity: 1;
transform: scale(1);
background:blue;
}
100% {
opacity: 0;
transform: scale(0.8);
}
}
Run Code Online (Sandbox Code Playgroud)
<div id="my-element"></div>
Run Code Online (Sandbox Code Playgroud)
另一种方法是简单地保留一个动画并调整比例值(或任何其他值),您将获得更好的随机行为.
var myElement = document.querySelector('#my-element');
function changeAnimation() {
var n1 = Math.random();
myElement.style.setProperty('--s1',n1);
var n2 = Math.random();
myElement.style.setProperty('--s2',n2);
var c1 = Math.floor(Math.random()*255);
myElement.style.setProperty('--c1',c1);
var c2 = Math.floor(Math.random()*255);
myElement.style.setProperty('--c2',c2);
}
myElement.addEventListener('animationiteration', changeAnimation, false);
Run Code Online (Sandbox Code Playgroud)
#my-element {
width: 50px;
height: 50px;
background: #333;
}
#my-element {
animation: 3.3s alternate infinite vibrate;
}
@keyframes vibrate {
0% {
opacity: 0;
transform: scale(var(--s1,0.95));
}
50% {
opacity: 1;
transform: scale(1);
background:rgb(255,var(--c1,0),var(--c2,0));
}
100% {
opacity: 0;
transform: scale(var(--s2,0.9));
}
}
Run Code Online (Sandbox Code Playgroud)
<div id="my-element"></div>
Run Code Online (Sandbox Code Playgroud)