Мы покажем, как сделать прелоадер в виде анимации с появлением на экране во время загрузки. Такой способ показывает пользователю, что процесс загрузки идет. Это может быть анимированный элемент, который предварительно загружается перед отображением основного содержимого сайта.
На заметку! Прелоадеры (Preloader) представляют собой ключевые элементы пользовательского интерфейса, которые информируют посетителей о том, что сайт не испытывает сбоев, а находится в процессе обработки данных.
Этот метод обеспечивает быстрое создание эффективного прелоадера, который значительно улучшит пользовательский опыт во время загрузки страницы.
Шаг 1. В файле HTML создаются два div/a — контейнер для прелоадера и сам индикатор загрузки.
<div id="myPreloader" class="wrap-myLoader">
<div class="myLoader"></div>
</div>
Шаг 2. Настройка стилей для блока-обертки прелоадера:
.wrap-myLoader {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: #fff;
z-index: 51;
transition: 1s all;
opacity: 1;
visibility: visible;
}
Шаг 3. Для стилизации самого Prealoader мы центрируем его, задаем ширину и высоту, окрашиваем стороны в белый цвет, а одну сторону — в зеленый. С помощью свойства border-radius мы превращаем квадрат в круг. Также создаем класс .done, который мы добавим к обертке прелоадера после полной загрузки всех элементов, чтобы скрыть индикатор загрузки.
.myLoader {
position: absolute;
left: 49%;
top: 49%;
transform: translate(-50%, -50%);
width: 40px;
height: 40px;
border: 6px solid #65a9ee;
border-top-color: #0C3C6C;
border-radius: 50%;
animation: 1s myAnim linear infinite;
}
.cansel {
opacity: 0;
visibility: hidden;
}
Шаг 4. Определим ключевые кадры анимации.
@keyframes myAnim {
from {
transform: translate(-50%, -50%) rotate(0deg);
}
to {
transform: translate(-50%, -50%) rotate(360deg);
}
}
Шаг 5. Устанавливаем параметры анимации: продолжительность — 1 секунда (то есть, от начального до конечного состояния круг будет пройден за 1 секунду), скорость анимации — равномерная, повторение анимации — бесконечное.
animation: 1s myAnim linear infinite;
Весь код на CSS:
.wrap-myLoader {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: #fff;
z-index: 51;
transition: 1s all;
opacity: 1;
visibility: visible;
}
.myLoader {
position: absolute;
left: 49%;
top: 49%;
transform: translate(-50%, -50%);
width: 40px;
height: 40px;
border: 6px solid #65a9ee;
border-top-color: #0C3C6C;
border-radius: 50%;
animation: 1s myAnim linear infinite;
}
.cansel {
opacity: 0;
visibility: hidden;
}
@keyframes myAnim {
from {
transform: translate(-50%, -50%) rotate(0deg);
}
to {
transform: translate(-50%, -50%) rotate(360deg);
}
}
JavaScript-код: после того, как страница полностью загрузится, класс done будет добавлен к элементу с идентификатором myPreloader, что скроет прелоадер. Также устанавливаем задержку в миллисекундах перед скрытием (например, полсекунды).
document.body.onload = function() {
setTimeout(function() {
var preloader = document.getElementById("myPreloader");
if (!preloader.classList.contains("cansel")) {
preloader.classList.add("cansel");
}
}, 499)
};
Следуя этим простым шагам, вы сможете создать эффективный индикатор загрузки для вашего веб-сайта, используя только CSS без использования списков или других сложных инструментов.
Нажмите чтобы посмотреть демоОбратите внимание! Существуют разные методы применения принципов CSS. Например для создания плавных анимаций и эффектов на веб-сайте. Рекомендуем статью — «Анимация появления блока с помощью CSS».
<div class="load_dotted"></div>
<style>
.load_dotted {
width: 15px;
aspect-ratio: 1;
border-radius: 50%;
animation: dotted 1s infinite linear alternate;
}
@keyframes dotted {
0% {box-shadow: 20px 0 #0C3C6C, -20px 0 #7dbeff;background: #0C3C6C }
33% {box-shadow: 20px 0 #0C3C6C, -20px 0 #7dbeff;background: #7dbeff}
66% {box-shadow: 20px 0 #7dbeff,-20px 0 #0C3C6C; background: #7dbeff}
100%{box-shadow: 20px 0 #7dbeff,-20px 0 #0C3C6C; background: #0C3C6C }
}
</style>
<div class="load_hoop"></div>
<style>
.load_hoop {
width: 50px;
aspect-ratio: 1;
border-radius: 50%;
border: 8px solid #0000;
border-right-color: #0080ff97;
position: relative;
animation: hoop 1s infinite linear;
}
.load_hoop:before,
.load_hoop:after {
content: "";
position: absolute;
inset: -8px;
border-radius: 50%;
border: inherit;
animation: inherit;
animation-duration: 2s;
}
.load_hoop:after {
animation-duration: 4s;
}
@keyframes hoop {
100% {transform: rotate(1turn)}
}
</style>
<div class="load_jump"></div>
<style>
.load_jump {
width: 30px;
aspect-ratio: 1;
display: grid;
transform: translateY(100%);
}
.load_jump::before,
.load_jump::after {
content: "";
grid-area: 1/1;
border-radius: 50%;
transform-origin: bottom;
position: relative;
}
.load_jump::before {
background: radial-gradient(at 30% 30%,#0000,#000a) #65a9ee;
transform: scaleY(0.65);
top: 0;
animation: jump-1, jump-2;
animation-duration: 2s;
animation-timing-function: cubic-bezier(0,400,1,400),ease;
animation-iteration-count: infinite;
}
.load_jump::after {
background: #ccc;
filter: blur(8px);
transform: scaleY(0.3) translate(0px,0px);
left: 0;
animation: jump-3 2s cubic-bezier(0,400,1,400) infinite;
}
@keyframes jump-1 {
100% {top:-0.2px}
}
@keyframes jump-2 {
4%,96% {transform: scaleY(1)}
}
@keyframes jump-3 {
100% {transform: scaleY(0.3) translate(0.1px,-0.1px)}
}
</style>
<div class="load_pulse"></div>
<style>
.load_pulse {
width: 20px;
aspect-ratio: 1;
border-radius: 50%;
background: #0C3C6C;
box-shadow: 0 0 0 0 #0004;
animation: pulse 1s infinite;
}
@keyframes pulse {
100% {box-shadow: 0 0 0 30px #0000}
}
</style>
<div class="load_square"></div>
<style>
.load_square {
width: 60px;
aspect-ratio: 1;
display: grid;
grid: 50%/50%;
color: #357cc4;
--_g: no-repeat linear-gradient(currentColor 0 0);
background: var(--_g),var(--_g),var(--_g);
background-size: 50.1% 50.1%;
animation:
square-0 1.5s infinite steps(1) alternate,
square-0-0 3s infinite steps(1);
}
.load_square::before {
content: "";
background: currentColor;
transform: perspective(150px) rotateY(0deg) rotateX(0deg);
transform-origin: bottom right;
animation: square-1 1.5s infinite linear alternate;
}
@keyframes square-0 {
0% {background-position: 0 100%,100% 100%,100% 0}
33% {background-position: 100% 100%,100% 100%,100% 0}
66% {background-position: 100% 0 ,100% 0 ,100% 0}
}
@keyframes square-0-0 {
0% {transform: scaleX(1) rotate(0deg)}
50% {transform: scaleX(-1) rotate(-90deg)}
}
@keyframes square-1 {
16.5%{transform:perspective(150px) rotateX(-90deg) rotateY(0deg) rotateX(0deg);filter:grayscale(0.8)}
33% {transform:perspective(150px) rotateX(-180deg) rotateY(0deg) rotateX(0deg)}
66% {transform:perspective(150px) rotateX(-180deg) rotateY(-180deg) rotateX(0deg)}
100% {transform:perspective(150px) rotateX(-180deg) rotateY(-180deg) rotateX(-180deg);filter:grayscale(0.8)}
}
</style>
<div class="load_merger"></div>
<style>
.load_merger {
width: 120px;
height: 60px;
padding: 10px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
background: #fff;
filter: blur(5px) contrast(10) hue-rotate(60deg);
mix-blend-mode: darken;
}
.load_merger:before,
.load_merger:after {
content: "";
width: 40px;
border-radius: 50%;
background: #419ffc;
animation: merger 1s infinite alternate;
}
.load_merger:after {
--s:-1;
}
@keyframes merger{
90%,100% {transform: translate(calc(var(--s,1)*30px))}
}
</style>
Добавить комментарий