CSS-анимация с задержкой для каждого дочернего элемента
Я пытаюсь создать каскадный эффект, применяя анимацию к каждому дочернему элементу. Мне было интересно, есть ли лучший способ сделать это, чем это:
.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;
}
и так далее...
Поэтому в основном, я хотел бы, чтобы анимация начиналась для каждого ребенка, но с задержкой.
Спасибо за любой вклад!
Дополнение: Возможно, я не правильно объяснил, в чем моя забота: о том, как это сделать, независимо от того, сколько у меня детей. Как это сделать, не записывая свойства для каждого ребенка... например, когда я не знаю, сколько детей будет там.
Ответы
Ответ 1
Что вы хотите, это свойство animation delay.
@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>
Ответ 2
В будущем [надеюсь, ближе], когда attr
и calc
будут полностью поддерживаться, мы сможем выполнить это без 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));
}
Это создаст эффект, при котором каждый элемент списка будет анимироваться в том, что будет выглядеть случайным образом.
Ответ 3
Если у вас много элементов (например: у меня есть разбитая таблица с числом > 1000 элементов и хотите, чтобы каждая строка была анимирована с задержкой при загрузке страницы), вы можете использовать jQuery для решения этой проблемы и избежать появления css файла в размер. Динамическое увеличение задержки анимации.
$.each($('.myClass'), function(i, el){
$(el).css({'opacity':0});
setTimeout(function(){
$(el).animate({
'opacity':1.0
}, 450);
},500 + ( i * 500 ));
});
EDIT:
Вот тот же код, который я настроил для использования с 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
Вы также можете использовать свойство delay-delay в CSS и использовать JS или JQuery для назначения другой задержки для каждого дочернего элемента. (Предположим, что s - начальная задержка в секундах)
$(".myClass img").each(function(index){
$(this).css({
'transition-delay' : s*(1+index) + 's'
});
});
Таким образом, у детей будут задержки перехода, такие как 1 * s, 2 * s, 3 * s..... и так далее. Теперь для создания фактического эффекта анимации просто установите необходимый переход, и дети будут анимированы в последовательности. Работает как шарм!
Ответ 5
Вот так:
.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...]