Анимация элементов в HTML с помощью CSS и JS используя плагин WOW.js

21.08.2018

UPD – код для анимации обновлен, из-за обновления структуры Animate.css

Используем библиотеку WOW.js документация здесь.

Подключаем анимацию с помощью WOW.js

1. Подключаем библиотеку анимаций Animate.css
(можно подключить любую другую библиотеку для анимации, и указать ее в опциях WOW.js)

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />

2. Подключаем и активируем WOW.js

<script src="https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js"></script>
<script>
    new WOW().init();
</script>

Анимируем элементы на странице

Добавляем элементу класс .wow – элемент будет невидимым, пока пользователь не проскролит страницу до него (в настройках WOW.js можно изменить имя класса, чтобы избежать конфликтов).

<div class="wow">
  Content to Reveal Here
</div>

UPD Для того, чтобы не было мигания элементов на первом экране, которое происходит, когда сайт большой и скрипты прогружаются на доли секунды позже HTML, то есть анимация подключается после того, как уже отобразилась страница, и сначала скрывает элемент а потом его анимирует, то нужно для анимируемых элементов задать правило visibility: hidden;

Можно задать его для отдельных классов или сразу для всех анимируемых элементов, которые имеют общий класс .wow:

.wow {
    visibility: hidden;
}

Выберите стиль анимации в Animate.css, затем добавьте класс CSS в анимируемый элемент HTML

<div class="wow animate__animated animate__fadeInUp">
  Content to Reveal Here
</div>

UPD В версии 3.7.0 Animate.css достаточно было добавить класс с названием анимации, например fadeInUp, то начиная с версии 4.0.0 необходимо указывать animate__animated animate__fadeInUp или можно только название анимации animate__fadeInUp, но тогда в параметрах скрипта обязательно нужно изменить дефолтный класс анимации animateClass: 'animated' на 'animate__animated'.

Доступные опции

data-wow-duration: Изменение продолжительности анимации
data-wow-delay: Задержка перед запуском анимации
data-wow-offset: Расстояние до начала анимации (связанное с нижней частью браузера)
data-wow-iteration: Количество повторений анимации

<section class="wow animate__animated animate__slideInLeft" data-wow-duration="2s" data-wow-delay="5s"></section>
<section class="wow animate__animated animate__slideInRight" data-wow-offset="10"  data-wow-iteration="10"></section>

UPD параметры анимации не обязательно добавлять в HTML, их можно прописать в CSS для анимируемых элементов, например:

.item-animated {
    animation-duration: 2s;
    animation-delay: 5s;
    animation-iteration-count: 10;
}

Например, такие правила, чтобы анимируемые элементы в одном ряду плавно появились друг за другом, а не одной пачкой:

.item:first-child {
    animation-delay: 0.1s;
}
.item:nth-child(2) {
    animation-delay: 0.2s;
}
.item:nth-child(3) {
    animation-delay: 0.3s;
}

Настройка параметров

boxClass: Имя класса, которое показывает скрытый блок при прокрутке страницы пользователем.
animateClass: Имя класса, которое запускает анимацию CSS (animated по умолчанию для библиотеки animate.css версии 3.0 и animate__animated по умолчанию для библиотеки animate.css версии 4.0+)
offset: Расстояние между нижней частью окна просмотра браузера и верхней частью скрытого окна. Когда пользователь прокручивает страницу и достигает этого расстояния, открывается появляется анимированный блок.
mobile: Включение/Отключение WOW.js для мобильных устройств (лично я рекомендую всегда отключать анимацию для мобильных).
live: следить за новыми элементами WOW на странице.

wow = new WOW({
    boxClass:     'wow',      // default
    animateClass: 'animated', // default
    offset:       0,          // default
    mobile:       true,       // default
    live:         true        // default
});
wow.init();

UPD Для animate.css версии 4.0+ animateClass должен быть animate__animated:

animateClass: animate__animated;

Пример работы библиотеки WOW.js для анимации HTML-элементов:

0

UPD Большой апдейт – унифицируем код для анимации

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

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

Строим примитивный пример для познания.

HTML. Все классы примитивны и не являются обязательными, задача – понять логику анимации.

<div class="row row-1">
    <div class="col"></div>
    <div class="col"></div>
    <div class="col"></div>
    <div class="col"></div>
</div>

CSS. Пример правил для анимированных элементов, классы могут быть любые

.col {
    visibility: hidden; /* for animated elements */
}
.col:first-child {
    animation-delay: 0.1s;
}
.col:nth-child(2) {
    animation-delay: 0.2s;
}
.col:nth-child(3) {
    animation-delay: 0.3s;
}
.col:nth-child(4) {
    animation-delay: 0.4s;
}

visibility: hidden; – обязательно для элементов, которые будут анимироваться

animation-delay – с шагом в 0.1s чтобы элементы в одном ряду появились плавно с небольшой задержкой.

Пример миксина для SCSS, если вы знаете, что элементов не более 12

@mixin animation-delay {
    @for $i from 1 through 12 {
        &:nth-child(#{$i}) {
            animation-delay: calc(0.1s * (#{$i} - 1));
        }
    }
}

Использование миксина

.col {
    @include animation-delay;
}

В сгенерированном CSS мы получим правила для 12 дочерних элементов с задержкой анимации с шагом в 0.1s.

JS – запускаем анимацию

Подключаем jQuery для того, чтобы запустить скрипт после загрузки страницы:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

Подключаем либу wow.min.js

<script src="https://cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js"></script>

Код скрипта:

(function () {
    // make any elements animated by class 
    $('.row-1 .col').addClass('wow animate__animated animate__fadeInUp');
    $('.row-2 .col').addClass('wow animate__animated animate__zoomIn');
    $('.row-3 .col').addClass('wow animate__animated animate__fadeInRight');

    // activate wow.js
    new WOW().init();
})();

Можно чуть улучшить скрипт – убрать из DOM class animate__animated, но указать его в параметрах WOW:

(function () {
    // make any elements animated by class
    $('.row-1 .col').addClass('wow animate__fadeInUp');
    $('.row-2 .col').addClass('wow animate__zoomIn');
    $('.row-3 .col').addClass('wow animate__fadeInRight');

    // activate wow.js
    wow = new WOW({
        animateClass: 'animate__animated',
    });
    wow.init();
})();

Скрипт wow.min.js добавляет класс animate__animated к элементам, которые мы анимируем и потом после анимации убирает его.

Пример анимации с помощью WOW.js + Animate.css для HTML-элементов:

0

Рекомендую к прочтению:

Оставить комментарий