Паралакс-скроллинг веб-сайта на чистом CSS

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

Параллакс почти всегда обрабатывается с помощью JavaScript и, чаще всего, этот процесс сопровождается очень не производительными методами с нарушениями события scroll, изменениями DOM-модели непосредственно в заголовке и запуском не нужных перекомпоновки и раскраски.

Все это происходит не синхронно с рендерингом, вызывает выпадение кадров и «заикание» прокрутки. Лучшее решение для использования паралакс - эффекта - requestAnimationFrame, который полностью изменяет принцип работы – но как нам полностью избавиться от использования JavaScript?

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

Вы также можете комбинировать эффект с другими функциями CSS, такими как media queries или supports – кому респонсивный паралакс?

Демо-режим

Теория

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

<div class="parallax">   <div class="parallax__group">     <div class="parallax__layer parallax__layer--back">       ...     </div>     <div class="parallax__layer parallax__layer--base">       ...     </div>   </div>   <div class="parallax__group">     ...   </div> </div>

И некоторые базовые детали стиля:

.parallax {   perspective: 1px;   height: 100vh;   overflow-x: hidden;   overflow-y: auto; } .parallax__layer {   position: absolute;   top: 0;   right: 0;   bottom: 0;   left: 0; } .parallax__layer--base {   transform: translateZ(0); } .parallax__layer--back {   transform: translateZ(-1px); }

Класс parallax это то место, где происходит чудо. Свойства элемента height и perspective зафиксируют перспективу в центре, создавая начальную точку в 3D-области просмотра.

Свойство overflow-y: auto позволит скролить контент в обычном режиме, но теперь элементы-потомки будут отображаться относительно фиксированной перспективы. Это ключ к созданию паралакс-эффекта.

Далее класс parallax__layer. Как предполагает имя, он определяет слой содержимого, к которому будет применен эффект. Элемент извлекается из потока контента и настраивается для заполнения пространства контейнера.

И, наконец, у нас есть классы модификаторов - parallax__layer--base и parallax__layer--back. Они используются для определения скорости прокрутки элемента параллакса, переводя его вдоль оси Z (перемещение дальше или ближе относительно области просмотра).

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

Демо-режим

Коррекция глубины

Так как эффект параллакса создан при помощи 3D-преобразования, перемещение элемента вдоль оси Z имеет побочный эффект - его размеры меняются в зависимости от того, как мы передвигаем его ближе или дальше от области просмотра.

Чтобы избежать этого, мы применим трансформацию элемента с помощью метода scale(), чтобы он отображался в оригинальном размере:

.parallax__layer--back {   transform: translateZ(-1px) scale(2); }

Коэффициент масштабирования может быть рассчитан с помощью формулы 1 + (translateZ * -1) / perspective). Для примера, если perspective области просмотра равен 1px и мы перемещаем элемент на - 2px вдоль оси Z коэффициент масштабирования будет равен scale(3):

.parallax__layer--deep {   transform: translateZ(-2px) scale(3); }

Демо-режим с коррекцией глубины

Управление скоростью слоя

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

Элементы с отрицательными значениями по оси Z будут прокручиваться медленнее, чем элементы, которые имеют положительные значения. Чем дальше значение находится от 0, тем более выражен паралакс - эффект (например translateZ(-10px) будет скролится медленнее, чем translateZ(-1px)).

Создание различных разделов страницы параллакса

Предыдущие примеры продемонстрировали основные приемы, используя очень простой контент, но большинство сайтов разбиты на отдельные части, в которых мы можем применять различные эффекты. Вот как мы сделаем это.

Во-первых, нам нужен элемент parallax__group, чтобы сгруппировать элементы в группы:

<div class="parallax">   <div class="parallax__group">     <div class="parallax__layer parallax__layer--back">       ...     </div>     <div class="parallax__layer parallax__layer--base">       ...     </div>   </div>   <div class="parallax__group">     ...   </div> </div>

Вот код CSS для элемента группы:

.parallax__group {   position: relative;   height: 100vh;   transform-style: preserve-3d; }

В этом примере, я хочу, чтобы каждая группа заполняла область просмотра. Устанавливаем значение height: 100vh. Однако при необходимости произвольные значения могут быть установлены для каждой группы.

Свойство transform-style: preserve-3d предотвращает сплющивание браузером, а элементы parallax__layer и position: relative используются, чтобы потомки элемента parallax__layer позиционировались относительно элементов группы.

Одно важное правило, которым стоит руководствоваться при группировке элементов - мы не можем обрезать содержимое группы. Установка overflow: hidden для parallax__group будет блокировать эффект.

Необрезанное содержимое приведет к ошибке переполнения элементов-потомков, потому нам нужно позаботиться о значениях z-index для группы, чтобы обеспечить правильное отображение/скрытие контента при прокрутке документа.

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

.parallax__group {     transform: translate3d(700px, 0, -800px) rotateY(30deg); }

Посмотрите на следующий пример и обратите внимание на опцию отладки!

Демо-режим

Поддержка браузерами

  • Firefox, Safari, Opera и Chrome поддерживают этот эффект;
  • В Firefox все работает, но в настоящее время существует незначительная проблема с выравниванием;
  • Internet Explorer еще не поддерживает preserve-3d (появление поддержки вскоре ожидается), потому паралакс - эффект не поддерживается. Для этого браузера вам придется создать контент без данного эффекта. Но, прогресс не стоит на месте! Дерзайте!

РедакцияПеревод статьи «Pure CSS parallax scrolling websites»