Parallax - это техника, при использовании которой элементы на заднем плане при прокрутке движутся медленнее, чем на переднем. Данный эффект дает ощущение глубины пространства и достигается использованием оси z, направленной “вглубь” экрана.
Довольно часто параллакс реализуется с помощью javascript, но данное решение приводит ко многим проблемам. В их числе привязка к событию scroll, из-за чего браузер вынужден постоянно обновлять страницу, что сильно затормаживает работу сайта и приводит к сбоям на мобильных устройствах. Также возможны проблемы с поддержкой кода отдельными браузерами.
Использование CSS в данном случае решает эти проблемы, делая эффект плавнее и менее ресурсозатратным, что положительно сказывается на скорости отрисовки.
Простой parallax
Свойство background-attachment: fixed является простейшим способом создания parallax-эффекта. Оно применяется к той секции, фоновое изображение которой мы хотим зафиксировать. В итоге при скролле контент будет прокручиваться, а фон останется на месте.
HTML
<body>
<section class="parallax">
<p class="parallax__text">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
</section>
<section class="static"></section>
</body>
Начнем с html-разметки. Создадим контейнер и два элемента внутри, расположенные на разном расстоянии от экрана.
HTML
<div class="parallax">
<p class="parallax__elem parallax__elem_1">Этот элемент находится ближе</p>
<p class="parallax__elem parallax__elem_2">А этот дальше</p>
</div>
Высота контейнера с классом .parallax равна высоте экрана, дочерние элементы относительно него абсолютно позиционированы и имеют верхний и нижний отступ в 70vh.
Свойство perspective задает глубину просмотра, значение шкалы оси z. От него мы будем отталкиваться при задавании расстояния между элементами.
У первого элемента значение смещения по оси Z равно нулю. Он никак не меняет свою скорость при прокрутке страницы.
У второго элемента смещение в -1px. Он находится дальше, выглядит меньше и движется при прокрутке медленнее.
Для того, чтобы второй элемент приобрел стандартный размер, увеличим его, задав большее значение scale:
Третий элемент находится в два раза дальше, чем второй.
Фон с использованием parallax
Чаще всего параллакс используется в отдельных частях страницы. Создадим новую разметку с тремя секциями и плавно скользящим фоном.
HTML
<body class="main-page">
<section class="parallax-section parallax-section_1">
<div class="content">
<p class="text">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
</div>
</section>
<section class="parallax-section parallax-section_2">
<div class="content">
<p class="text">Distinctio nisi eius omnis, error perspiciatis officiis sapiente?</p>
</div>
</section>
<section class="parallax-section parallax-section_3">
<div class="content">
<p class="text">Nulla quibusdam, tempora nam laudantium, omnis quae id?</p>
</div>
</section>
</body>
Поскольку теперь присутствуют несколько секций с параллакс-эффектом, назначаем свойства .parallax-контейнера из предыдущего примера на body с классом main-page:
Каждая секция по ширине и высоте теперь равна размерам экрана. Свойство overflow: hidden не дает возможности содержимому разных секций перекрыть друг друга.
Добавим для секций псевдоэлементы, которые будут выполнять роль фона:
Отрицательный z-index "подкладывает" псевдоэлемент под контент. translateZ(-150px) в три раза превышает размер перспективы, замедляя прокрутку фона. Чем больше разница между ними, тем медленнее прокручивается элемент. Scale(4) найден по формуле, приведенной выше: 150/50 + 1. Таким образом, фон сохраняет первоначальный размер и качество.