Появление элементов при скролле

В этой статье мы рассмотрим, как можно сделать плавное появление элементов при прокрутке страницы.

Мы будем использовать css и немного нативного js, без использования сторонних библиотек. Пристегнитесь!

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

Анимация при скролле: создаем html

Все начинается с html. Давайте сделаем разметку.

<div class="wrap">
  <div class="element-big green"></div>
  <div class="element-animation">
    <span>Элемент, который появляется</span>
  </div>
  <div class="element-big red"></div>
</div>

Мы здесь создали два больших блока и между ними текст. Два больших блока нам нужны, чтобы получился скролл страницы.

Сейчас добавим css для них и вы все поймете.

Появление элементов при прокрутке страницы: добавляем начальный CSS

В CSS мы, во-первых, зададим большим блокам высоту, чтобы у нас на странице появился скролл. Это нужно только для демонстрации.

А во-вторых, сделаем так, что в начальном состоянии элемент (наш текст) не будет виден, в дальнейшем он будет появляться, когда пользователь доскроллит до него.

.green {
  background-color: green;
}
.red {
  background-color: red;;
}
/* Задаем высоту большим блокам, чтобы у нас на странице получится скролл */
.element-big  {
  width: 100%;
  height: 1200px;
}
.element-animation {
  margin: 2rem 0;
  font-size: 3rem;
  
  /* Скроем элемент в начальном состоянии */
  opacity: 0;
}

Теперь перейдем к JS — нам ведь нужно понимать, когда пользователь доскроллил до нужного элемента.

Появление контента при скроллинге: работаем с JS

Нам повезло, веб не стоит на месте и регулярно улучшается, делая нашу жизнь чуточку проще. Если раньше нам нужно было сильно повозиться, чтобы реализовать плавное появление элементов при скролле страницы, то теперь все стало намного понятнее.

Я не буду сильно углубляться, если хотите, можете почитать отдельно про Intersection Observer. С помощью этого мы можем отслеживать видимость элемента в условном «окне» пользователя. И благодаря этому мы можем делать не только анимацию, но и, например, отложенную загрузку, либо «бесконечный» скролл.

Но вернемся к нашей теме. Вставим в JS следующий код:

function onEntry(entry) {
  entry.forEach(change => {
    if (change.isIntersecting) {
      change.target.classList.add('element-show');
    }
  });
}
let options = { threshold: [0.5] };
let observer = new IntersectionObserver(onEntry, options);
let elements = document.querySelectorAll('.element-animation');
for (let elm of elements) {
  observer.observe(elm);
}

Здесь мы цепляемся за класс .element-animation и будем следить, доступен он на «экране» или нет. Обратите внимание, что вы можете использовать этот класс сразу к нескольким элементам.

Итак, когда пользователь доскроллил до класса .element-animation, то мы добавляем ему класс .element-show

Вот и все, что делает JS. Проверяет виден ли класс и если да, то добавляет к нему еще один класс.

А теперь зная это, давайте вернемся к CSS.

Появление элементов на сайте: заключительный шаг

У нас добавляется класс .element-show к классу .element-animation, когда до него доскроллил юзер. Давайте же сделаем его видимым. Для этого достаточно просто прописать в CSS следующее:

.element-animation.element-show {
  opacity: 1;
  transition: opacity 1s;
}

Bот и все, теперь наш блок будет видимым, когда до него доскроллит пользователь.

Если хотите, вы можете сделать так, чтобы элемент появлялся снизу:

.element-animation {
  margin: 2rem 0;
  font-size: 3rem;
  
  /* Скроем элемент в начальном состоянии */
  opacity: 0;
  transform: translateY(100%);
}
.element-animation.element-show {
  opacity: 1;
  transition: all 1s;
  transform: translateY(0%);
}

Ничего сложного. Вы можете экспериментировать, добавляя различные варианты к первоначальному состоянию, за затем меняя их на стандартные. Попробуйте, например, поиграться с transform: rotate(5deg).

See the Pen Появление элементов при прокрутке страницы by Pelegrin (@pelegrin2puk) on CodePen.

Видео