每个子元素都有延迟的CSS动画


71

我试图通过将动画应用于每个子元素来创建级联效果。我想知道是否有比这更好的方法:

.myClass img:nth-child(1){
    -webkit-animation: myAnimation 0.9s linear forwards;
}
.myClass img:nth-child(2){
    -webkit-animation: myAnimation 0.9s linear 0.1s forwards;
}
.myClass img:nth-child(3){
    -webkit-animation: myAnimation 0.9s linear 0.2s forwards;
}
.myClass img:nth-child(4){
    -webkit-animation: myAnimation 0.9s linear 0.3s forwards;
}
.myClass img:nth-child(5){
    -webkit-animation: myAnimation 0.9s linear 0.4s forwards;
}

依此类推...因此,基本上,我希望每个孩子都有一个动画开始,但要有一个延迟。感谢您的输入!

另外:也许我没有正确解释我所关注的问题:无论我有多少孩子,这都是关于如何做到这一点的。如何执行此操作而不必写下每个孩子的属性……例如,当我不知道会有多少个孩子时。


使用某些js元素选择器(诸如dojo.query或jquery之类)并在for循环中应用样式怎么办?那就是我想到的唯一一件事……

是的,我想这是为每个孩子做的唯一方法,而不必为每个孩子写下一堂课。我以为可能会有一些新的CSS3属性使之成为可能,但我想我将不得不等待变量的引入……谢谢!
塞卡(Seka)

4
因此,您是否追求CSS动画的某种增量属性?像-webkit-animation-increment什么?那绝对是有用的,很好的问题。
CherryFlavourPez

完全是@ Ed-M!我只是在看那个递增的属性,如果可以在任何CSS属性定义中使用类似这样的变量,而不仅仅是“内容”一个变量,那将非常好……
Seka

Answers:


63

您想要的是动画延迟属性。

@keyframes FadeIn { 
  0% {
    opacity: 0;
    transform: scale(.1);
  }

  85% {
    opacity: 1;
    transform: scale(1.05);
  }
  100% {
    transform: scale(1);
  }
}

.myClass img {
  float: left;
  margin: 20px;
  animation: FadeIn 1s linear;
  animation-fill-mode: both;
}

.myClass img:nth-child(1) { animation-delay: .5s }
.myClass img:nth-child(2) { animation-delay: 1s }
.myClass img:nth-child(3) { animation-delay: 1.5s }
.myClass img:nth-child(4) { animation-delay: 2s }
<div class="myClass">
    <img src="http://placehold.it/200x150" />
    <img src="http://placehold.it/200x150" />
    <img src="http://placehold.it/200x150" />
    <img src="http://placehold.it/200x150" />
</div>

诸如Less.jsSass之类的CSS预处理器可以减少重复次数,但是如果您要使用未知数量的子元素或需要对大量子元素进行动画处理,那么JavaScript将是最佳选择。


@dreamster:旧的Fiddle使用-webkit前缀(Chrome仍支持该前缀)。你要在不带前缀的版本添加(或使用类似autoprexfixer(github.com/postcss/autoprefixer如果你想要这个工作)。
CherryFlavourPez

59

这是一种使用for循环的scss方法。

@for $i from 1 through 10 {
    .myClass img:nth-child(#{$i}n) {
        animation-delay: #{$i * 0.5}s;
    }
}

1
很棒@robshearing但我无法做到100,它无法正常工作
Saravanan Nandhan

10条记录$ {{i}}的值应从0(零)开始后,您能帮忙吗?
Saravanan Nandhan

22

在[希望不久]将来时attrcalc充分支持,我们就可以做到这一点没有JavaScript。

HTML:

<ul class="something">
    <li data-animation-offset="1.0">asdf</li>
    <li data-animation-offset="1.3">asdf</li>
    <li data-animation-offset="1.1">asdf</li>
    <li data-animation-offset="1.2">asdf</li>
</ul>

CSS:

.something > li
{
    animation: myAnimation 1s ease calc(0.5s * attr(data-animation-offset number 1));
}

这将产生一种效果,其中每个列表项都以看起来似乎是随机的顺序进行动画处理。


18
TBH我希望这样的事情.myClass li:nth-child(n) { transition-delay: calc(n*0.2s); }会非常方便。
Felype

1
我的意思是说我希望w3可以在将来的nth-child函数中使用变量来实现,因此我们可以说transition-delay,例如child(n)0.5+(n*<somePrimeNumber> % 1.5)并不是一个奇妙的公式,但是对于可能添加的li数量,它看起来都是随机的。我的抱怨是必须为每个列表项创建多个CSS选择,然后每当我得到一个比CSS更大的列表时都必须对其进行扩展,SCSS和LESS上有随机函数,但是问题很多,因此,使用纯CSS会让我沮丧。
Felype

我的观点是:CSS应该涵盖所有视觉效果,这就是它所要求的,但是有时我们不能满足使用JS来实现预期图形效果的需求。是的,它看起来是随机的,但是在运行了几次动画之后,您的眼睛将开始预测它,并且不再看起来是随机的。
Felype

用户可能不会注意到。就像电影的吹牛一样-很少有人注意到他们。虽然感觉到伪随机性。
史蒂文·瓦雄

20

您还可以使用CSS中的transition-delay属性,并使用JS或JQuery为每个子元素分配不同的延迟。(假设s是启动延迟,以秒为单位)

$(".myClass img").each(function(index){
     $(this).css({
          'transition-delay' : s*(1+index) + 's'
     });
 });

因此,孩子将具有过渡延迟,例如1 * s,2 * s,3 * s .....等。现在,要创建实际的动画效果,只需设置所需的过渡,然后将按顺序对子级进行动画处理。奇迹般有效 !


我认为从性能角度来看,这是此页面上的最佳解决方案,因为它仍然允许动画本身通过CSS完全完成。此外,它还防止文件膨胀和不必要的模糊性。
eleven59

9

如果您有很多项目(例如:我的分页表中有超过1000个项目,并且希望在加载页面时对每行进行延迟动画处理),则可以使用jQuery解决此问题并避免CSS文件的大小增加。动画延迟会动态增加。

$.each($('.myClass'), function(i, el){
    $(el).css({'opacity':0});
    setTimeout(function(){
       $(el).animate({
        'opacity':1.0
       }, 450);
    },500 + ( i * 500 ));

});​

编辑: 这是我调整为与animate.css一起使用的相同代码(在使用https://gist.github.com/1438179之前安装其他插件)

$.each($(".myClass"), function(i, el){
    $(el).css("opacity","0");
    setTimeout(function(){
       $(el).animateCSS("fadeIn","400");
    },500 + ( i * 500 ));

});

其中“ fadeIn”是动画类型,“ 400”(动画执行时间),“ 500”(延迟),用于动画页面上的每个元素。


4
我认为这个答案与要求的精神背道而驰,即通过CSS动画与JavaScript / jQuery动画进行交互的一种方式。
肖恩·奥伊梅特

3

像这样:

.myClass img {
    -webkit-animation: myAnimation 0.9s linear forwards;
}

.myClass img:nth-child(1){
    -webkit-animation-delay: 0.1s;
}

.myClass img:nth-child(2){
    -webkit-animation-delay: 0.2s;
}

[...etc...]

1
嗨,感谢您的简化:)实际上,我实际上更关心正在进行的级联,即增加0.1秒的延迟,而不是简化类本身。但是,当然,这是写下来的更好的方法,谢谢!
Seka,

哦,好,我的坏。好吧,您可以使用Javascript完成此操作,并为每个循环执行一次。但我不推荐...
peduarte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.