Для реализации анимации блоков, как вы описали, вам потребуется создать кастомное поведение, используя JavaScript, чтобы обрабатывать видимость блоков и применять задержки при анимации. Вот один из возможных подходов, используя Intersection Observer API и CSS-анимации.
### 1. Структура HTML
У вас должны быть блоки, которые вы хотите анимировать:
```html
<div class="animated-block">Block 1</div>
<div class="animated-block">Block 2</div>
<div class="animated-block">Block 3</div>
<!-- и так далее -->
```
### 2. Стили CSS
Определите стиль для анимации. Например:
```css
.animated-block {
opacity: 0;
transform: translateY(20px); /* Начальная позиция */
transition: opacity 0.5s ease, transform 0.5s ease;
}
.animated-block.animate {
opacity: 1;
transform: translateY(0); /* Конечная позиция */
}
```
### 3. JavaScript для управления анимацией
Теперь используйте Intersection Observer для отслеживания видимости блоков:
```javascript
const blocks = document.querySelectorAll('.animated-block');
let delay = 0;
const options = {
root: null,
rootMargin: '0px',
threshold: 0.1 // 10% видимости
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Удаляем старую задержку и применяем новую
entry.target.style.transitionDelay = `${delay}s`;
entry.target.classList.add('animate');
// Увеличиваем задержку для следующего блока, если он виден
delay += 0.3; // Пример: задержка в 300 мс
} else {
// Если блок выходит из видимости, сбрасываем задержку
delay = 0;
}
});
}, options);
// Наблюдаем за каждым блоком
blocks.forEach(block => {
observer.observe(block);
});
```
### 4. Альтернативная обработка для мобильных устройств
Если вы хотите, чтобы анимация была мгновенной на мобильных устройствах, можно добавить проверку ширины экрана:
```javascript
if (window.innerWidth <= 768) { // Или другое значение в пикселях для мобильных устройств
delay = 0; // Отключаем задержку
}
```
### 5. Итоговая логика
Теперь, если блоки будут одновременно видимы, они будут появляться с заданной задержкой. Если один из блоков станет невидимым, задержка для других блоков сбрасывается, что позволяет;
- Последовательно анимировать их появление.
- Избегать задержки анимации для блоков, которые не видны.
Вы также можете настроить параметры `threshold` и `rootMargin` в зависимости от ваших потребностей для более точного отслеживания видимости блоков.
Этот подход даст вам гибкость и контроль над анимацией блоков в зависимости от их видимости в области просмотра.