CSS-анимация прокрутки — отличный способ оживить скучные и статичные сайты и предоставить читателю более интересный, уникальный и современный опыт.
В этом посте вы узнаете, как запускать CSS-анимацию при прокрутке.(Если вы ищете примеры, ознакомьтесь с нашим списком текстовых анимаций CSS)
И… кто знает? Может быть, в итоге вы создадите потрясающие сайты, подобные этим сайтам с анимацией прокрутки.
Анимация прокрутки — это любой вид анимации, происходящий, когда посетитель прокручивает вверх или вниз веб-сайт.Обычно анимация прокрутки запускается, когда элемент появляется в поле зрения, и ее можно применить практически к любому элементу, такому как текст, изображения и видео.
Наши глаза естественным образом притягиваются к движению, поэтому эта функция будет привлекать и удерживать посетителя. Добавление привлекательной анимации на ваш сайт выделит его на фоне остальных.
Любая CSS-анимация прокрутки обычно предполагает использование плагина или библиотеки, но мы собираемся показать вам, как добиться этого без них. Итак, давайте перейдем к делу.
Ванильный JavaScript, несмотря на его причудливое название, не является библиотекой, это просто старый JavaScript. Так что пусть вас не смущает «причудливое» название.
Перво-наперво, создайте веб-страницу. Просто простой макет с несколькими разделами.
<section class="container">
<h2>Caption</h2>
<div class="text-container">
<div class="text-box">
<h3>Section Text</h3>
<p>Random text</p>
</div>
<div class="text-box">
<h3>Section Text</h3>
<p>Random text</p>
</div>
<div class="text-box">
<h3>Section Text</h3>
<p>Random text</p>
</div>
</div>
</section>
Add style attributes to your page and use CSS to define the scroll animation style, Now you need the class, reveal
for the sections you are animating and a new class name, active
, for when it’s activated.
.reveal{
position: relative;
transform: translateY(150px);
opacity: 0;
transition: 2s all ease;
}
.reveal.active{
transform: translateY(0);
opacity: 1;
}
При этом reveal
элементы будут скрыты до тех active
пор, пока не будет добавлен класс. Атрибуты transform
и transition
определяют стиль анимации прокрутки, при этом разделы будут исчезать снизу и перемещаться вдоль оси y к вершине. Вы можете проверить это руководство по переходу CSS, если у вас есть какие-либо сомнения.
Нам понадобятся эти функции для присвоения нового имени класса при входе в область просмотра, и нам это нужно для запуска CSS-анимации при прокрутке.
элементы reveal
начинаются с нацеливания на все используемыеdocument.querySelectorAll()
.
function reveal() {
var reveals = document.querySelectorAll(".reveal")
Анимация прокрутки должна запускаться, когда она появляется в поле зрения, поэтому нам нужно определить положение элемента на странице, то есть расстояние элемента от верхней части окна просмотра.
getBoundingClientRect().top
дает нам это расстояние от верхней части окна просмотра и window.innerHeight
дает нам высоту окна просмотра.
С помощью этого мы можем задать условия, используяfor
;
for (var i = 0; i < reveals.length; i++) {
var windowHeight = window.innerHeight;
var elementTop = reveals[i].getBoundingClientRect().top;
var elementVisible = 150;
}
Переменная — windowHeight
это высота области просмотра, elementTop
это расстояние reveal
элемента от верхней части точки обзора или длина, которая была прокручена, и elementVisible
это высота, на которой элемент должен быть показан пользователю.
Вы можете определить, когда элемент прокрутил определенное количество пикселей на странице. Теперь определите функцию, которая отображает элементы, добавляя и удаляя active
класс. Для этого. используйте if
else
инструкции и . Они зададут условия для запуска анимации
if (elementTop < windowHeight - elementVisible) {
reveals[i].classList.add("active");
} else {
reveals[i].classList.remove("active");
}
Полная function
версия будет выглядеть так;
function reveal() {
var reveals = document.querySelectorAll(".reveal");
for (var i = 0; i < reveals.length; i++) {
var windowHeight = window.innerHeight;
var elementTop = reveals[i].getBoundingClientRect().top;
var elementVisible = 150;
if (elementTop < windowHeight - elementVisible) {
reveals[i].classList.add("active");
} else {
reveals[i].classList.remove("active");
}
}
}
Now we just pass it into an event listener to run it every time the visitor scrolls the page in any direction.
window.addEventListener("scroll", reveal);
// To check the scroll position on page load
reveal();
Вот и все! Вы достигли анимации прокрутки CSS.
See the Pen Simple Vanilla Js Scroll Animation by Álvaro (@alvarotrigo) on CodePen.
Но что, если вы хотите большего?Прямо сейчас каждый раздел имеет одинаковую равномерную анимацию. Давайте дадим каждому разделу свой стиль анимации прокрутки.
Сначала мы назначим классы в HTML, чтобы позже мы могли ссылаться на них в нашем CSS для создания нужной анимации.
Вот как мы это сделаем в нашем первом разделе:
<section class="container">
<h2>Caption</h2>
<div class="text-container reveal fade-bottom">
<div class="text-box">
<h3>Section Text</h3>
<p>Random text</p>
</div>
<div class="text-box">
<h3>Section Text</h3>
<p>Random text</p>
</div>
<div class="text-box">
<h3>Section Text</h3>
<p>Random text</p>
</div>
</div>
</section>
И то же самое относится к любым другим разделам, которые у нас есть в нашем HTML.
Затем в нашем CSS мы можем назначить им разные анимации, например:
.reveal {
position: relative;
opacity: 0;
}
.reveal.active {
opacity: 1;
}
.active.fade-bottom {
animation: fade-bottom 1s ease-in;
}
.active.fade-left {
animation: fade-left 1s ease-in;
}
.active.fade-right {
animation: fade-right 1s ease-in;
}
Определите анимации с помощью ключевых кадров. Атрибут transform
style может придать вашей странице динамический вид, и его можно добавить сюда. Еще один атрибут, который вы можете добавитьtransition
, — это время, необходимое для полной загрузки элемента, но единицы в атрибуте анимации дают тот же результат.
@keyframes fade-bottom {
0% {
transform: translateY(50px);
opacity: 0;
}
100% {
transform: translateY(0);
opacity: 1;
}
}
@keyframes fade-left {
0% {
transform: translateX(-100px);
opacity: 0;
}
100% {
transform: translateX(0);
opacity: 1;
}
}
@keyframes fade-right {
0% {
transform: translateX(100px);
opacity: 0;
}
100% {
transform: translateX(0);
opacity: 1;
}
}
Вы можете изменять transform
значения и animation
атрибуты для достижения большего разнообразия.
Вы можете анимировать отдельные блоки текста, позволяя каждому абзацу загружаться один за другим. Просто присвоите имя класса тому, что вы хотите, оформите и анимируйте с помощью CSS, добавьте немного ванильного Js и наблюдайте за волшебством.
Чтобы добавить еще один практический пример использования анимации при прокрутке, мы анимируем панель навигации на основе положения прокрутки страницы.
Мы можем использовать наш предыдущий пример и добавить к нему панель навигации. Давайте посмотрим, как это сделать.
Не стесняйтесь ознакомиться с тем, как создать липкую или фиксированную панель навигации, если вы хотите получить более подробную информацию.
Во-первых, HTML:
<nav>
<a href="#home" class="active">Home</a>
<a href="#about">About</a>
<a href="#services">Services</a>
<a href="#contact">Contact</a>
</nav>
a {
text-decoration: none;
}
ul {
list-style: none;
}
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1000;
background: #42455a;
padding: 20px;
text-align: center;
border-bottom: 1px solid #00c2cb;
}
header nav a {
padding: 10px 20px;
font-size: 2rem;
color: #e0ffff;
border-radius: 5px;
letter-spacing: 0.5px;
}
Затем вы добавляете стиль ссылки, когда анимация становитсяactive
, вы можете комбинировать это со hover
стилем, это ваш выбор;
header nav a:hover,
header nav a.active {
background: #00c2cb;
color: #42455a;
transition: 0.5s ease-out;
letter-spacing: 2px;
}
Сначала нацелитесь на все разделы и ссылки;
let section = document.querySelectorAll('section');
let menu = document.querySelectorAll('header nav a');
Как и в первом примере, вы хотите, чтобы панель навигации анимировалась при section
прокрутке в поле зрения, для этого создайте onscroll
событие и используйте forEach
для вызова функции. Для этого нам нужно объявить параметры и задать условие.
window.onscroll = () => {
section.forEach(i => {
let top = window.scrollY;
let offset = i.offsetTop - 150;
let height = i.offsetHeight;
let id = i.getAttribute('id');
top
является переменной дляscrollY
, которая представляет собой длину или количество пикселей, на которые прокручивается окно просмотра. offsetTop
это длина элемента от верхней части окна просмотра. offsetHeight
является длиной разделов и getAttribute()
возвращает значение атрибутов элементов, в данном случае, id
разделов.
Далее, условия для выполнения, чтобы ссылки появлялись active
при прокрутке страницы вниз. Раздел должен находиться внутри области просмотра, поэтому offset
он должен быть меньше длины, которую вы прокручиваете, а также длины от верхней части области просмотра, а длина раздела или элемента должна быть больше длины, которую вы прокрутили;
if (top >= offset && top < offset + height) {
menu.forEach(link => {
link.classList.remove('active');
document.querySelector('header nav a[href*=' + id + ']').classList.add('active');
Итак, теперь, когда вы переходите к новому разделу, условие выполняется, и active
атрибуты будут перемещены по следующей ссылке.
Соедините все это вместе, и это будет выглядеть так;
let section = document.querySelectorAll('section');
let menu = document.querySelectorAll('header nav a');
window.onscroll = () => {
section.forEach(i => {
let top = window.scrollY;
let offset = i.offsetTop - 150;
let height = i.offsetHeight;
let id = i.getAttribute('id');
if (top >= offset && top < offset + height) {
menu.forEach(link => {
link.classList.remove('active');
document.querySelector('header nav a[href*=' + id + ']')
.classList.add('active');
});
}
});
};
Вы можете добавить атрибут smoothscroll-behavior
, чтобы придать вашему сайту по-настоящему динамичный вид. Внесите изменения в animation
transform
атрибуты стиля и посмотрите, что получится. Добавьте atransition-delay
, чтобы сделать его еще более эффектным (проверьте, как настроить этот атрибут в этом руководстве по переходу CSS)
Эффект анимации прокрутки является популярной анимацией на современных веб-сайтах и придает им современный и более динамичный вид.
Your browser does not support the video tag.
Существует много других способов создания анимации при прокрутке, например, с использованием таких компонентов, как fullPage.js это позволит красиво сочетать анимацию и прокрутку. Fullpage работает, отображая полноэкранные разделы, когда посетитель прокручивает страницу, создавая совершенно уникальный и интересный пользовательский интерфейс.
И есть много других интересных анимаций, которые вы можете использовать при прокрутке. Просто выберите ту, которая соответствует вашим потребностям и создает наилучший опыт прокрутки для ваших посетителей и страницы.