Menu
Coddy logo textTech

Анимация элементов при прокрутке

Часть раздела JavaScript in Action путешествия по HTML на Coddy — урок 19 из 27.

Иногда мы хотим, чтобы элементы анимировались (появлялись с затуханием, выезжали, масштабировались и т. д.), когда они попадают в область видимости при прокрутке.
Это часто делается путем проверки того, виден ли элемент на экране, с последующим добавлением класса, который запускает CSS-анимацию или переход.

Сначала давайте создадим простой HTML-элемент:

<div class="animate-on-scroll">This element will animate when scrolled into view</div>

Затем добавьте CSS для анимации:

.animate-on-scroll {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.animate-on-scroll.visible {
  opacity: 1;
  transform: translateY(0);
}

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

function checkScroll() {
  const elements = document.querySelectorAll('.animate-on-scroll');
  
  elements.forEach(element => {
    // Получаем положение элемента относительно области просмотра
    const position = element.getBoundingClientRect();
    
    // Если элемент находится в области просмотра
    if(position.top < window.innerHeight) {
      element.classList.add('visible');
    }
  });
}

// Запуск при прокрутке
window.addEventListener('scroll', checkScroll);

// Запуск один раз при загрузке страницы
checkScroll();

Когда элемент с классом animate-on-scroll входит в область видимости, скрипт добавляет класс visible, запуская анимацию.

challenge icon

Задание

Легко

Внутри цикла создайте if statement.

  1. Условие должно проверять: если top position элемента меньше, чем window.innerHeight - 50.
  2. Если условие истинно, используйте .classList.add("active"), чтобы добавить класс active к этому элементу.

Таким образом, всякий раз, когда элемент попадает в область видимости (в пределах 50px от нижней границы экрана), он будет плавно появляться.

Попробуйте сами

<!DOCTYPE html>
<html>
<head>
  <title>Scroll Animation Example</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <h1>Discover the Beauty of Nature</h1>
    <p>Scroll down to reveal the magic</p>
  </header>

  <div class="container">
    <div class="fade-in card">
      <h2>Mountains</h2>
      <p>Standing tall and timeless, mountains remind us of strength and stability.</p>
    </div>

    <div class="fade-in card">
      <h2>Forests</h2>
      <p>Forests are the lungs of our planet, offering peace and endless green beauty.</p>
    </div>

    <div class="fade-in card">
      <h2>Rivers</h2>
      <p>Calm or powerful, rivers flow endlessly, connecting life along their paths.</p>
    </div>

    <div class="fade-in card">
      <h2>Deserts</h2>
      <p>Silent and vast, deserts teach us resilience and the value of every drop of water.</p>
    </div>

    <div class="fade-in card">
      <h2>Oceans</h2>
      <p>The oceans cover most of our Earth, a mysterious world full of wonder and life.</p>
    </div>
  </div>

  <script src="script.js"></script>
</body>
</html>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела JavaScript in Action