Эффект предзагрузки страницы

Эффект предзагрузки страницы

От автора: Данная обучающая статья о том, как воссоздать эффект предзагрузки страницы, увиденный на сайте Fontface Ninja. Мы собираемся использовать CSS анимацию, 3D трансформации и SVG.

скачать исходникидемо

Сегодня мы хотим показать вам, как создать очень простой эффект предзагрузки страницы с помощью CSS анимации, SVG и JavaScript. Для сайтов, на которых очень важно, чтобы сначала загрузились все или только часть файлов, такого рода предзагрузочные заставки могут стать креативным способом скрасить утомительное ожидание посетителя сайта. Идея для данной обучающей статьи возникла благодаря красивому эффекту предзагрузки страницы, увиденному на сайте Fontface Ninja. Изначально, на первом плане появляются логотип и элемент загрузки в виде окружности. Когда анимирование загрузчика завершается, т.е. файлы страницы загружены, вся «шапка» поднимается наверх, а элементы страницы тем временем появляются, также с использованием анимации. И последний штрих – это логотип, скользящий наверх и меняющий при этом свой цвет.

В этой обучающей статье мы воссоздадим эффект, увиденный на сайте Fontface Ninja, внеся небольшие поправки, а во втором демо-примере будут использоваться чуточку другие эффекты. Для создания логотипа и элемента загрузки в виде окружности мы будем использовать встроенный SVG, чтобы иметь возможность стилизовать его с помощью CSS. Мы создадим небольшой скрипт для анимирования нашего SVG элемента загрузки. Анимационными эффектами на странице мы будем управлять с помощью классов, которые добавим к основному контейнеру.

Пожалуйста, обратите внимание на то, что мы будем использовать CSS анимацию и CSS 3D трансформации, так что они будут работать только в тех браузерах, которые их поддерживают.

Итак, давайте начнем!

Разметка

Давайте обернем элемент header и основную часть контента в контейнер. Мы должны помнить о том, что нам нужно контролировать все, что происходит с исходным видом страницы и контентом с классами. Поэтому мы будем использовать основной контейнер в качестве контрольного элемента. Мы зададим ему класс и идентификатор (ID) ip-container.

Исходный вид страницы состоит из элемента header, который включает в себя логотип и элемент загрузки. Оба они являются SVG элементами. Причем логотип является более сложным элементом, чем загрузчик, поэтому мы потом приведем координаты его пути, т.к. он действительно очень длинный. Как видите, мы устанавливаем значения для некоторых атрибутов SVG элемента, например, для ширины и высоты, для viewBox и preserveAspectRatio. Для атрибута preserveAspectRatio значение выглядит как xMidYMin meet, что означает, что мы принудительно используем универсальное масштабирование, чтобы графика полностью помещалась в родительский контейнер, была отцентрирована по оси X и поднята наверх. Для того чтобы логотип был доступным, мы добавляем заголовок, описание и необходимый ARIA атрибут – aria-labelledby.

Основному контенту задан класс ip-main. Позже мы будем применять анимацию к его дочерним элементам, заголовку, блоку с контентом и вложенным боксам:

Давайте теперь применять стили.

CSS

Обратите внимание на то, что в CSS не содержится никаких вендорных префиксов, но вы найдете их в исходниках.

Первым делом мы подключим некоторые шрифты, которые мы будем использовать для «рыбного» текста и для иконок в боксах. Иконки, использующиеся в демо-примерах, взяты из набора Feather icon, и мы создали иконочный шрифт с помощью сервиса Icomoon App. Для «рыбного» текста используется шрифт Blokk, который классно подходит для создания эскизов и макетов.

Мы хотим, чтобы элемент header с самого начала полностью заполнял все окно просмотра, поэтому давайте зададим ему 100% для ширины и высоты, а также установим для свойства position значение fixed:

Давайте обнулим отступы у заголовка логотипа:

И для логотипа и для загрузчика мы установим абсолютное позиционирование и растянем их на всю ширину окна просмотра:

Вместо того, чтобы просто взять элемент с логотипом и спозиционировать его посередине элемента header, нам нужно помнить о следующем: нам нужно, чтобы SVG логотип был сам по себе отзывчивым, т.е. мы можем и не знать о его размерах, но мы хотим при этом поместить его сверху основного контента с помощью 3D трансформаций, после того как пройдет загрузка. В основном, из-за того, что мы не знаем размера нашего логотипа, мы не знаем, насколько нам придется его переместить, чтобы он оказался в верхней части контента (при процентных перемещениях отталкиваются от самого элемента, а не от его родителя). Но мы точно знаем и можем работать с одним конкретным значением: высота окна просмотра. Поэтому давайте просто зададим для логотипа значение 100% по высоте и переместим его на 25%, чтобы SVG логотип оставался посередине страницы:

Мы позиционируем загрузчик внизу окна просмотра:

SVG элементы, которым мы назначили класс ip-inner, будут отображаться как блочные элементы, и мы отцентрируем их по горизонтали с помощью значения auto для свойства margin:

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

Поскольку мы встроили наш SVG логотип, мы можем прямо здесь же задать заливку пути:

И то же самое для загрузчика:

Первый путь имеет серую заливку:

И второй путь будем иметь постепенный переход, который мы будем контролировать с помощью нашего JS. Но здесь мы установим значение для перехода stroke-dashoffset:

А теперь мы добавим стили к контенту страницы, который обернут в блок div с классом ip-main:

Размер заголовка будет задан в единицах vw, чтобы сделать его отзывчивым:

Давайте добавим изображение с браузером:

И некоторые «рыбные» боксы:

У каждого бокса будет иконка:

Теперь мы должны прописать всю анимацию, которая будет происходить. Как уже упоминалось ранее, мы будем контролировать запуск анимации с помощью добавления классов к основному контейнеру. Исходная анимация элемента header будет состоять в том, что все дочерние элементы будут двигаться снизу вверх:

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

На данном этапе нужно запомнить, что мы будем анимировать процесс загрузки окружности с помощью JS. Поэтому нам понадобится еще одно «состояние», на которое мы сможем переключиться после завершения загрузки. Мы дадим контейнеру класс loaded и применим следующую анимацию:

Логотип перемещается вниз на 100% (помните, наш логотип занимает 100% высоты окна просмотра, поэтому это заставит его перемещаться вдоль всей высоты экрана), плюс еще немного для создания отступа, а затем мы его чуть-чуть уменьшим. Вместе с перемещением изменится и цвет SVG заливки. Элемент загрузки перемещается вверх, уменьшается и исчезает. Элемент header, находящийся в фиксированном положении, тоже должен быть поднят наверх:

Давайте теперь позаботимся об элементах контента. Здесь вы можете применить множество креативных эффектов. Конечно, это полностью зависит от того, какой контент размещен на странице. В нашем случае нам нужно, чтобы элементы появлялись, двигаясь снизу вверх:

Небольшая задержка для боксов в внутри области с браузером позволит создать дополнительный изящный эффект. Чтобы избежать проблем со скроллингом и пустыми промежутками внизу страницы, нам нужно изменить позиционирование элемента header с фиксированного на абсолютное. Это мы можем проконтролировать путем добавления класса к элементу body (или любому другому родителю), после завершения всей анимации. С помощью этого класса мы переключаем позиционирование:

Если использование JavaScript недоступно, мы показываем состояние после завершения анимации. Это можно сделать, задав для элемента header относительное позиционирование и соответственно изменив размеры логотипа:

И последний, но не менее важный, момент – мы должны позаботиться о большом заголовке и боксах на маленьких экранах:

Вот и все стилевое оформление.

JavaScript

JavaScript код состоит из двух частей. Мы отделим общий функционал по обработке загрузочного элемента от всего остального. Давайте назовем этот скрипт pathLoader.js, поскольку он анимирует именно путь элемента.

Нам бы хотелось иметь возможность установить параметр stroke-dashoffset, чтобы анимировать заливку пути. Сначала этот параметр и stroke-dasharray устанавливаются для длины пути (getTotalLength()). Мы рисуем путь, устанавливая для dash offset нижнее значение вплоть до нуля, когда путь полностью нарисован. Это реализуется благодаря вызову функции setProgress с параметром для значения. Также может оказаться полезным альтернативный параметр, если мы хотим исполнить некоторый код, когда значение уже установлено и переход завершен.

Метод setProgressFn используется здесь, чтобы найти возможный путь взаимодействия с загрузчиком. К примеру, в нашем демо-примере не происходит предзагрузки, но мы имитируем загрузочную анимацию, устанавливая случайное значение от 0 до 1 через набор временных промежутков:

Далее, давайте поместим оставшийся JS код в main.js. Сначала мы инициализируем и кэшируем некоторые переменные:

Мы начинаем исходную анимацию (появление логотипа и загрузчика) с добавления загрузочного класса к основному контейнеру. После завершения анимации для загрузочного SVG элемента мы используем «фальшивую» загрузочную анимацию, как объяснялось ранее. Обратите внимание на то, что пока выполняется анимация, мы не позволяем использовать скроллинг на странице.

И снова мы будем имитировать процесс загрузки чего-либо, передавая нужную функцию для setProgressFn. Как только анимация завершится, мы заменяем класс loading на класс loaded, который запустит основную анимацию для элемента header и контента. После того, как это будет выполнено, мы добавляем к элементу body класс layout-switch и разрешаем скроллинг:

Вот и все, все сделано! Мы надеемся, что вам понравилась данная обучающая статья, и она была для вас полезной и вдохновляющей!

Автор: Mary Lou

Источник: //tympanus.net/

Редакция: Команда webformyself.

Метки: , ,

Похожие статьи:

Комментарии Вконтакте: