📗Parallax

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>

CSS

.parallax {
    height: 80vh;
    background: url(https://www.desktopbackground.org/download/3840x2160/2010/06/01/26317_download-wallpapers-3840x2400-marmalade-sugar-candy-backgrounds_3840x2400_h.jpg) center/cover no-repeat;
    background-attachment: fixed;
}

.static {
    height: 80vh;
}

.parallax__text {
    font-size: 42px;
    padding-top: 200px;
    text-align: center;
}

Результат:

parallax

Открыть пример на Codepen

Создание сложного parallax-эффекта с помощью CSS

Начнем с html-разметки. Создадим контейнер и два элемента внутри, расположенные на разном расстоянии от экрана.

HTML

<div class="parallax">
    <p class="parallax__elem parallax__elem_1">Этот элемент находится ближе</p>
    <p class="parallax__elem parallax__elem_2">А этот дальше</p>
</div>

CSS

.parallax {
    position: relative;
    height: 100vh;
    overflow-x: hidden;
    overflow-y: auto;
    perspective: 1px;
}

.parallax__elem {
    position: absolute;
    width: 100%;
    top: 0;
    left: 0;
    text-align: center;
    font-size: 30px;
    padding: 70vh 0;
}

.parallax__elem_1 {
    transform: translateZ(0);
}

.parallax__elem_2 {
    transform: translateZ(-1px);
}

Результат:

parallax

Разберемся, что здесь происходит.

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

Свойство perspective задает глубину просмотра, значение шкалы оси z. От него мы будем отталкиваться при задавании расстояния между элементами.

У первого элемента значение смещения по оси Z равно нулю. Он никак не меняет свою скорость при прокрутке страницы.

У второго элемента смещение в -1px. Он находится дальше, выглядит меньше и движется при прокрутке медленнее.

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

.parallax__elem_2 {
    transform: translateZ(-1px) scale(2);
}
parallax2

Примечание:

Формула для подсчета необходимого значения scale: 1 + (translateZ * -1) / perspective

Добавим третий элемент:

HTML

<div class="parallax">
    <p class="parallax__elem parallax__elem_1">Этот текст ближе</p>
    <p class="parallax__elem parallax__elem_2">А этот дальше</p>
    <p class="parallax__elem parallax__elem_3">Совсем далеко</p>
</div>

CSS

.parallax {
    position: relative;
    height: 100vh;
    overflow-x: hidden;
    overflow-y: auto;
    perspective: 1px;
}

.parallax__elem {
    position: absolute;
    width: 100%;
    top: 0;
    left: 0;
    text-align: center;
    font-size: 30px;
    padding: 70vh 0;
}

.parallax__elem_1 {
    transform: translateZ(0);
}

.parallax__elem_2 {
    transform: translateZ(-1px);
}

.parallax__elem_3 {
    transform: translateZ(-2px);
}

Третий элемент находится в два раза дальше, чем второй.

parallax3

Открыть пример на CodePen

Фон с использованием 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:

CSS

html {
    overflow: hidden;
}

.main-page {
    height: 100vh;
    overflow-x: hidden;
    overflow-y: auto;
    perspective: 50px;
}

Перейдем к секциям:

.parallax-section {
    position: relative;
    width: 100%;
    height: 100vh;
    overflow: hidden;
}

Каждая секция по ширине и высоте теперь равна размерам экрана. Свойство overflow: hidden не дает возможности содержимому разных секций перекрыть друг друга.

Добавим для секций псевдоэлементы, которые будут выполнять роль фона:

.parallax-section::before {
    content: '';
    position: absolute;
    width: 100vw;
    height: 100vh;
    top: 0;
    left: 0;
    z-index: -1;
    transform: translateZ(-150px) scale(4);
    background: center/cover no-repeat;
}

.parallax-section_1::before {
    background-image: url(https://www.desktopbackground.org/download/3840x2160/2010/06/01/26317_download-wallpapers-3840x2400-marmalade-sugar-candy-backgrounds_3840x2400_h.jpg);
}

.parallax-section_2::before {
    background-image: url(https://i.imgur.com/uYcPZ7i.jpg);
}

.parallax-section_3::before {
    background-image: url(http://www.aljanh.net/data/archive/img/968925867.jpeg);
}

Отрицательный z-index "подкладывает" псевдоэлемент под контент. translateZ(-150px) в три раза превышает размер перспективы, замедляя прокрутку фона. Чем больше разница между ними, тем медленнее прокручивается элемент. Scale(4) найден по формуле, приведенной выше: 150/50 + 1. Таким образом, фон сохраняет первоначальный размер и качество.

Оформление контента внутри секций:

.content {
    margin: 0 auto;
    width: 50vw;
    padding: 50px;
    background-color: rgba(255, 255, 255, 0.6);
    margin-top: 220px;
}

.text {
    font: 700 40px sans-serif;
    color: #555;
    line-height: 1.2;
}

Результат:

parallax-4

Открыть пример на CodePen

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

Уменьшим среднюю секцию и добавим вокруг неё две обычных:

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="static"></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="static"></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>

CSS

.parallax-section_2 {
    height: 80vh;
}

.static {
    height: 300px;
}

Напоследок приведем в движение контент внутри подвижных секций и немного отдалим его от экрана:

.content {
    position: absolute;
    left: 25%;
    transform: translateZ(-25px) scale(1.2);
}

Результат:

parallax5

Открыть пример на CodePen

Поддерживаемость браузерами

Parallax на CSS поддерживается всеми популярными браузерами (Chrome, Safari, Opera, Firefox), кроме Internet Explorer.

Last updated