#javascript #css-animations
Вопрос:
Итак, у меня есть такая структура, где каждый дочерний элемент div(.cc-запись-анимация-цвет) внутри контейнера cc-запись-анимация-оболочка имеет другой цветной фон, поэтому у меня есть анимация класса, которая вызывает ключевой кадр, и я хотел бы прикрепить этот класс к дочернему элементу div (.cc-запись-анимация-цвет), но не одновременно, так что сверху вниз, возможно, с задержкой в одну секунду.
lt;div class="entry-animation"gt; lt;div class="cc-entry-animation-wrapper"gt; lt;div class="cc-entry-animation-colour green-3"gt;lt;/divgt; lt;div class="cc-entry-animation-colour green-2"gt;lt;/divgt; lt;div class="cc-entry-animation-colour green-1"gt;lt;/divgt; lt;div class="cc-entry-animation-colour blue-3"gt;lt;/divgt; lt;div class="cc-entry-animation-colour blue-2"gt;lt;/divgt; lt;div class="cc-entry-animation-colour blue-1"gt;lt;/divgt; lt;div class="cc-entry-animation-colour violet-3"gt;lt;/divgt; lt;div class="cc-entry-animation-colour violet-2"gt;lt;/divgt; lt;div class="cc-entry-animation-colour violet-1"gt;lt;/divgt; lt;div class="cc-entry-animation-colour red-3"gt;lt;/divgt; lt;div class="cc-entry-animation-colour red-2"gt;lt;/divgt; lt;div class="cc-entry-animation-colour red-1"gt;lt;/divgt; lt;div class="cc-entry-animation-colour orange-3"gt;lt;/divgt; lt;div class="cc-entry-animation-colour orange-2"gt;lt;/divgt; lt;div class="cc-entry-animation-colour orange-1"gt;lt;/divgt; lt;div class="cc-entry-animation-colour yellow-3"gt;lt;/divgt; lt;div class="cc-entry-animation-colour yellow-2"gt;lt;/divgt; lt;div class="cc-entry-animation-colour yellow-1"gt;lt;/divgt; lt;/divgt; lt;/divgt;
Так вот как выглядит этот класс:
.animate-fan{ animation:abanico 2s infinite; } @keyframes abanico { from { transform: translate3d(0px, 0px, 0px) scale3d(1, 1, 1) rotateX(0deg) rotateY(0deg) rotateZ(-90deg) skew(0deg, 0deg); transform-style: preserve-3d; } to { transform: translate3d(0px, 0px, 0px) scale3d(1, 1, 1) rotateX(0deg) rotateY(0deg) rotateZ(90deg) skew(0deg, 0deg); transform-style: preserve-3d; } }
Я также уже пытался добиться этого с помощью чистого css, поэтому я применял ту же анимацию к другому классу div, но с задержкой, см. Пример ниже.
.cc-entry-animation-colour.yellow-1 { /*more attributes here that I am omiting*/ animation:abanico 2s infinite; } .cc-entry-animation-colour.yellow-2 { /*more attributes here that I am omiting*/ animation:abanico 2s infinite; animation-delay:1s; } .cc-entry-animation-colour.yellow-3 { /*more attributes here that I am omiting*/ animation:abanico 2s infinite; animation-delay:2s; } ...etc
Но не сработало должным образом, почему-то игнорируется моя задержка в некоторых, и я вижу, что по какой-то причине анимируются только первые 3 дива. Поэтому я пытаюсь добиться своего рода «эффекта вентилятора», поворачивая дивы под углом 90 градусов один за другим.
Ответ №1:
Я не думаю, что это лучшая практика, но я предлагаю вам поступить так, как показано ниже на моем примере :
- Получите всех детей, используя
children
свойствоquerySelectorAll
результата - Для каждого ребенка применяйте стиль
animationDelay
(вам нужно увеличить его на одну секунду, чтобы вы могли использоватьindex
его для правильного применения)
window.addEventListener('load', function() { const childs = [...document.querySelectorAll('cc-entry-animation-wrapper').children]; childs.forEach(function(child, index) { child.style.animationDelay = `${index}s`; } });
Или вы можете создать какой-нибудь класс, содержащий вашу задержку :
lt;stylegt; .delay-0 { animation-delay: 0s; } .delay-1 { animation-delay: 1s; } .delay-2 { animation-delay: 2s; } .delay-3 { animation-delay: 3s; } lt;/stylegt; lt;!-- ... --gt; lt;div class="cc-entry-animation-colour yellow-1 delay-0"gt;lt;/divgt;
он может работать динамически, играя с classList
помощью javascript и статически, как в моем примере.