Как создать анимацию элемента при прокрутке страницы?

Как реализовать анимацию блока при прокрутке страницы? <br/> <br/> При этом необходимо зафиксировать блок до завершения анимации, поскольку на сайте расположены 10 блоков, и данный блок находится среди них. <br/> <br/>
  • 5 февраля 2025 г. 9:04
Ответы на вопрос 1
Для реализации анимации блока при прокрутке страницы вам понадобятся HTML, CSS и JavaScript. Ниже приведен простой пример, который иллюстрирует, как можно анимировать блок при прокрутке, фиксируя его до завершения анимации.

### HTML

```html
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="styles.css">
    <title>Анимация при прокрутке</title>
</head>
<body>
    <div class="container">
        <div class="block" id="animatedBlock">Я анимируюсь при прокрутке!</div>
        <div class="spacer"></div>
        <div class="block">Блок 1</div>
        <div class="spacer"></div>
        <div class="block">Блок 2</div>
        <div class="spacer"></div>
        <div class="block">Блок 3</div>
        <div class="spacer"></div>
        <div class="block">Блок 4</div>
        <div class="spacer"></div>
        <!-- Добавьте больше блоков по необходимости -->
    </div>
    <script src="script.js"></script>
</body>
</html>
```

### CSS (styles.css)

```css
body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
}

.container {
    width: 80%;
    margin: 0 auto;
}

.block {
    padding: 20px;
    background: lightblue;
    margin: 10px 0;
    transition: transform 0.5s ease-in-out;
}

.spacer {
    height: 400px; /* Для создания пространства для прокрутки */
}

.animated {
    transform: scale(1.2);
    background: lightcoral; /* Цвет при анимации */
}
```

### JavaScript (script.js)

```javascript
document.addEventListener('scroll', function () {
    const block = document.getElementById('animatedBlock');
    const rect = block.getBoundingClientRect();

    // Проверяем, виден ли блок на экране
    if (rect.top < window.innerHeight && rect.bottom >= 0) {
        // Добавляем класс для анимации
        block.classList.add('animated');
        
        // Блокируем дальнейшую анимацию, пока она не завершится
        block.style.pointerEvents = 'none';

        // Убираем класс анимации и восстанавливаем события после завершения анимации
        setTimeout(() => {
            block.classList.remove('animated');
            block.style.pointerEvents = 'all';
        }, 500); // Длительность анимации (в миллисекундах)
    }
});
```

### Пояснение

1. **HTML**: Создается структура страницы с блоками, один из которых будет анимироваться.

2. **CSS**: Визуальные стили блоков и определение анимации. Класс `.animated` определяет, как будет выглядеть блок во время анимации.

3. **JavaScript**: 
   - Мы добавляем обработчик события прокрутки. Для каждого скролла проверяем, виден ли `animatedBlock`.
   - Если он виден, добавляем класс `.animated`, который запускает анимацию. 
   - Чтобы избежать повторной анимации до завершения текущей, блокируем взаимодействие с помощью `pointerEvents`. После завершения анимации класс удаляется, и блок снова становится доступным для взаимодействия.

Такой способ позволит вам просто анимировать блок и ограничить возможность повторной анимации, пока предыдущая не завершилась. Вы можете настроить анимацию и длительность в зависимости от ваших потребностей.
Похожие вопросы