【发布时间】:2018-06-30 19:41:31
【问题描述】:
我有几个相同类型的元素,我希望它们共享相同的 css 动画,但我希望它们在不同的时间开始/结束动画。
Codepen for the following code
html:
<div class="container">
<div class="box hidden"></div>
</div>
<div class="container">
<div class="box hidden"></div>
</div>
<div class="container">
<div class="box hidden"></div>
</div>
CSS:
.container {
width: 100px;
height: 100px;
margin-bottom: 20px;
}
.box {
width: 100%;
height: 100%;
}
.box.hidden {
visibility: hidden;
}
.box {
animation: growIn 1s;
animation-timing-function: cubic-bezier(.46,.13,.99,.83);
transition: all .2s cubic-bezier(0.215, 0.61, 0.355, 1);
}
.container:first-child .box {
background-color: green;
}
.container:nth-child(2) .box {
background-color: orange;
}
.container:nth-child(3) .box {
background-color: red;
}
@keyframes growIn {
from {
transform: scale(0);
}
to {
transform: scale(1);
}
}
box 元素一开始是隐藏的,然后使用 javascript 我从不同的框中删除了这个类名,但在不同的时间:
const boxes = document.querySelectorAll(".box");
boxes.forEach(box => {
setTimeout(() => box.classList.remove("hidden"), Math.random() * 1000);
});
发生的情况是所有 3 个框同时结束动画。动画确实在不同的时间开始,但都一起结束。
为什么会这样?
如果我这样做但添加一个类名而不是删除它(为了使动画开始),那么它的行为就像我想要的那样。
有任何想法吗?谢谢。
【问题讨论】:
-
因为
animation: growIn 1s;他们都需要 1 秒来制作相同的动画。 jQuery 只控制它们何时开始,但对动画中的 1 秒持续时间没有影响。 -
@SirExotic 这里没有涉及
jQuery,是的,它们都有 1 秒的动画持续时间,但我希望第二个动画在每个项目开始时开始,而不是在第一个开始时开始。 -
抱歉,Javascript*。用于“取消隐藏”框的 Javascript 代码与您的动画同时运行,因此即使您的动画仍在等待您的 Javascript“取消隐藏”框,您的动画也已经开始了。这就是为什么您会看到一些框的大小已经大于 0。
-
@SirExotic 为什么框 2 的动画在
hidden类名被删除之前开始?为什么框1的动画会影响它?这就是我不明白的。 -
将你的动画持续时间更改为
5s和 JS 中的 5000,你会看到更好。
标签: css css-animations delay