Как создать прелоадер для сайта

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

Что такое прелоадер и его основные задачи

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

Живые примеры прелоадеров вы сможете увидеть прямо на сайте автора в тексте статьи, нажимая на кнопки «Запустить прелоадер».

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

Основные задачи:

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

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

Прелоадер делает общение пользователя с веб-ресурсом более понятным. И в целом посетители довольно положительно реагируют на наличие этого элемента.

Какие проблемы могут возникнуть при отсутствии прелоадера?

Допустим, вы открываете страницу сайта и видите кнопку, на которую пытаетесь нажать, но js-скрипт, обрабатывающий эту кнопку, еще не загрузился. Таким образом, нажатие на кнопку не сработает.

Еще один пример: на сайте размещена форма, работающая с AJAX. Вы заполняете данные и отправляете, нажав на кнопку отправки формы. Пока запрос обрабатывается сервером, на лицевой части сайта не происходит никаких изменений — непонятно, отправилась ли форма или нет. Если добавить прелоадер, то сразу станет ясно, что форма отправлена и необходимо немного подождать результата.

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

Как сделать прелоадер для сайта

В создании прелоадера можно выделить три этапа:

  • подготовка анимационного изображения;
  • верстка покрывающего фона;
  • создание логики появления и исчезания с помощью определенных JavaScript-событий.

Сложность первого этапа зависит от выбора формата анимации для прелоадера. В этой статье разберем три формата:

  • GIF
  • SVG
  • CSS

Прелоадер с изображением формата GIF

Подготовка анимации GIF требует немного времени — ее можно просто найти и скачать на соответствующих сайтах, которых на просторах интернета множество. Например, на ресурсе https://loading.io/. Если вам не нужен прелоадер конкретного дизайна, такой метод будет вам подходящим. Еще одним преимуществом такого подхода является то, что GIF-анимация хорошо поддерживается старыми браузерами.

Для нашего примера возьмем следующую готовую GIF-анимацию:

Прелоадер круги

Теперь перейдем ко второму этапу — созданию покрывающего фона. HTML-структура будет очень простой. Она будет состоять из блока с классом и идентификатором, внутри этого блока с помощью тега img подключим файл прелоадера, указав путь к нему:

HTML:

<div class='demoPreloader' id='demoPreloader'>
    <img src='/path/to/preloader.gif' alt='preloader'>
</div>

Теперь сделаем стилизацию фона:

  • Зададим ему белый цвет с непрозрачностью 70% (background)
  • Установим позиционирование относительно всего экрана (position)
  • Растянем фон на весь экран, задав стопроцентную ширину и высоту от левого верхнего угла (top, left, width, height)
  • Сделаем фон самым верхним слоем по оси z на странице, чтобы он блокировал все содержимое. Для этого добавим свойство z-index с большим числом (число должно быть больше, чем у других элементов страницы)
  • Отцентрируем нашу GIF-анимацию с помощью flex.

CSS:

.demoPreloader {
    background: rgba(255, 255, 255, 0.7);
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 99999;
    display: flex;
    justify-content: center;
    align-items: center;
}

Верстка прелоадера готова. Последним этапом зададим логику появление и исчезания прелоадера посредством JavaScript. Если мы хотим, чтобы прелоадер работал при открытии страницы, мы будем использовать событие JS, которое наступает после полной загрузки страницы:

JavaScript:

window.onload = function() {
    // Спрячем прелоадер после загрузки страницы
    document.querySelector('#demoPreloader').style.display = 'none';
};

С помощью библиотеки jQuery это можно сделать проще и еще добавить скорость исчезновения:

jQuery(document).ready(function($) {
    // Прелоадер будет исчезать со скоростью полсекунды (500 мс)
    $('#demoPreloader').fadeOut(500);
});

Чтобы увидеть результат, нажмите на кнопку:

Несмотря на свою простоту и хорошую поддержку старых браузеров, готовые GIF-анимации для прелоадера уступают по своим преимуществам анимациям, созданным с помощью SVG и CSS. Далее рассмотрим эти два альтернативных способа подготовки анимационных изображений.

Прелоадер с изображением формата SVG

В отличие от анимации формата GIF, SVG имеет ряд преимуществ:

  • не требует дополнительного http-запроса (чем меньше запросов, тем лучше производительность сайта);
  • кастомизируема — можно изменять код SVG на свой вкус;
  • масштабируема — на высоких разрешениях экрана не будет выглядеть размытым.

Нарисуем несложную SVG-анимацию в виде трех двигающихся вверх-вниз прямоугольников разного цвета. HTML-код вместе с покрывающим фоном будет выглядеть так:

<div class='demoPreloader' id='demoPreloader'>
    <svg width='65px' height='50px' viewBox='0 0 65 50'>
        <rect x='0' y='0' width='15' height='40' fill='#1d0e0b'>
          <animate attributeName='y' values='0;10;0' dur='1s' repeatCount='indefinite' begin='0s'></animate>
        </rect>
        <rect x='25' y='0' width='15' height='40' fill='#774023'>
          <animate attributeName='y' values='0;10;0' dur='1s' repeatCount='indefinite' begin='0.2s'></animate>
        </rect>
        <rect x='50' y='0' width='15' height='40' fill='#d88c51'>
          <animate attributeName='y' values='0;10;0' dur='1s' repeatCount='indefinite' begin='0.4s'></animate>
        </rect>
    </svg>
</div>

Что мы сделали:

  • задали ширину, высоту тега svg помощью атрибутов width и height, а также размеры и расположения окна отображения, используя атрибут viewBox;
  • создали три вертикальных прямоугольника (тег rect), установив им ширину (width), высоту (height), координаты левого верхнего угла (x, y) и залив каждый прямоугольник отдельным цветом (fill);
  • добавили анимацию (тег animate) для прямоугольников (смещение по вертикали (attributeName='y') бесконечно (repeatCount='indefinite') со скоростью 1 секунда (dur='1s' ) от координаты 0 до 10 и обратно (values));
  • чтобы прямоугольники двигались по очереди, установили каждому из них разное время начала анимации (begin).

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

Мы только заменили GIF на SVG — изменения в CSS и JavaScript не требуются. Оцените результат, нажав на кнопку:

Прелоадер на CSS

Помимо двух вышеупомянутых вариантов, существует также возможность создавать анимацию прелоадера, используя CSS. Опишем пример такого прелоадера.

HTML:

<div class='demoPreloader' id='demoPreloader'>
    <div class='demoPreloaderDoubleRing'>
        <div class='demoPreloaderDoubleRing__inner'>
            <div></div>
            <div></div>
            <div>
                <div></div>
            </div>
            <div>
                <div></div>
            </div>
        </div>
    </div>
</div>

CSS:

.demoPreloaderDoubleRing {
    width: 150px;
    height: 150px;
    display: inline-block;
    overflow: hidden;
    background: none;
}

.demoPreloaderDoubleRing__inner div {
    box-sizing: border-box!important
}

.demoPreloaderDoubleRing__inner > div {
    position: absolute;
    width: 66px;
    height: 66px;
    top: 42px;
    left: 42px;
    border-radius: 50%;
    border-width: 6px;
    border-style: solid;
    border-color: #d88c51 transparent #d88c51 transparent;
    animation: demoPreloaderDoubleRing__inner 1s linear infinite;
}

.demoPreloaderDoubleRing__inner > div:nth-child(2),
.demoPreloaderDoubleRing__inner > div:nth-child(4) {
    width: 51px;
    height: 51px;
    top: 49.5px;
    left: 49.5px;
    animation: demoPreloaderDoubleRing__inner 1s linear infinite reverse;
}

.demoPreloaderDoubleRing__inner > div:nth-child(2) {
    border-color: transparent #4d695d transparent #4d695d
}

.demoPreloaderDoubleRing__inner > div:nth-child(3) {
    border-color: transparent
}

.demoPreloaderDoubleRing__inner > div:nth-child(3) div {
    position: absolute;
    width: 100%;
    height: 100%;
    transform: rotate(45deg);
}

.demoPreloaderDoubleRing__inner > div:nth-child(3) div:before,
.demoPreloaderDoubleRing__inner > div:nth-child(3) div:after {
    content: "";
    display: block;
    position: absolute;
    width: 6px;
    height: 6px;
    top: -6px;
    left: 24px;
    background: #d88c51;
    border-radius: 50%;
    box-shadow: 0 60px 0 0 #d88c51;
}

.demoPreloaderDoubleRing__inner > div:nth-child(3) div:after {
    left: -6px;
    top: 24px;
    box-shadow: 60px 0 0 0 #d88c51;
}

.demoPreloaderDoubleRing__inner > div:nth-child(4) {
    border-color: transparent;
}

.demoPreloaderDoubleRing__inner > div:nth-child(4) div {
    position: absolute;
    width: 100%;
    height: 100%;
    transform: rotate(45deg);
}

.demoPreloaderDoubleRing__inner > div:nth-child(4) div:before,
.demoPreloaderDoubleRing__inner > div:nth-child(4) div:after {
    content: "";
    display: block;
    position: absolute;
    width: 6px;
    height: 6px;
    top: -6px;
    left: 16.5px;
    background: #4d695d;
    border-radius: 50%;
    box-shadow: 0 45px 0 0 #4d695d;
}

.demoPreloaderDoubleRing__inner > div:nth-child(4) div:after {
    left: -6px;
    top: 16.5px;
    box-shadow: 45px 0 0 0 #4d695d;
}

.demoPreloaderDoubleRing__inner {
    width: 100%;
    height: 100%;
    position: relative;
    transform: translateZ(0) scale(1);
    backface-visibility: hidden;
    transform-origin: 0 0;
}

.demoPreloaderDoubleRing__inner div {
    box-sizing: content-box;
}

@keyframes demoPreloaderDoubleRing__inner {
    0% { transform: rotate(0) }
    100% { transform: rotate(360deg) }
}

Нажмите на кнопку, чтобы увидеть результат:

Таким образом, прелоадер можно создать различными способами. Вы можете использовать готовую анимацию из множества прелоадеров, доступных в интернете, либо проявить творческий потенциал и создать собственный уникальный прелоадер, используя SVG либо CSS. Но не забывайте о преимуществах и недостатках разных способов.

Оцените статью
DevReflex
Добавить комментарий