CSS3 индикаторы загрузки (прогрес бары)

Рассмотрим как сделать такой индикатор на CSS. Он выполнен на чистом CSS3, а мы знаем, что пока не все свойства CSS3 поддерживаются популярными браузерами, так например выглядит наш индикатор в Opera 11, которая поддерживает не все свойства нужные нам:

Как видите в браузерах, которые не полностью поддерживают CSS3 пример работает, пусть не полностью, со всеми эффектами, зато упрощенно и понятно.
HTML основа
Код будет состоять из двух элментов DIV, один из которых будет оберткой с классом meter, а другой (внутри него) собственно показателем процесса загрузки.
<div class="meter"> <span style="width: 25%"></span> </div>
CSS оформление
Мы создадим класс meter для обертки нашего бара. Для обертки мы не указываем ширину, поэтому она будет растягиваться на всю ширину его родителя. Ширину можно указать любую, мы укажем ее в 20px. Также сделаем закругленные углы и внутреннюю тень.
.meter {
height: 20px; /* Можно любую */
position: relative;
background: #555;
-moz-border-radius: 25px;
-webkit-border-radius: 25px;
border-radius: 25px;
padding: 10px;
-webkit-box-shadow: inset 0 -1px 1px rgba(255,255,255,0.3);
-moz-box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3);
box-shadow : inset 0 -1px 1px rgba(255,255,255,0.3);
}
А это наш прогресс бар, мы сделаем ему высоту в 100%, чтобы он растянулся во всю высоту родителя. Добавим кучу CSS3 для придания вида как на картинке.
.meter > span {
display: block;
height: 100%;
-webkit-border-top-right-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-moz-border-radius-topright: 8px;
-moz-border-radius-bottomright: 8px;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
-webkit-border-top-left-radius: 20px;
-webkit-border-bottom-left-radius: 20px;
-moz-border-radius-topleft: 20px;
-moz-border-radius-bottomleft: 20px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
background-color: rgb(43,194,83);
background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0, rgb(43,194,83)),
color-stop(1, rgb(84,240,84))
);
background-image: -moz-linear-gradient(
center bottom,
rgb(43,194,83) 37%,
rgb(84,240,84) 69%
);
-webkit-box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
-moz-box-shadow:
inset 0 2px 9px rgba(255,255,255,0.3),
inset 0 -2px 6px rgba(0,0,0,0.4);
position: relative;
overflow: hidden;
}
Это была основная тема оформления.
Дополнительные темы оформления
Добавим оранжевую и красную темы для бара.
.orange > span {
background-color: #f1a165;
background-image: -moz-linear-gradient(top, #f1a165, #f36d0a);
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f1a165),color-stop(1, #f36d0a));
background-image: -webkit-linear-gradient(#f1a165, #f36d0a);
}
.red > span {
background-color: #f0a3a3;
background-image: -moz-linear-gradient(top, #f0a3a3, #f42323);
background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f0a3a3),color-stop(1, #f42323));
background-image: -webkit-linear-gradient(#f0a3a3, #f42323);
}
Как конфетка
На западе, на Рождество можно есть такие конфетки полосатые (ну вы поняли). В таком вот стиле и оформим наши прогресс бары. Полосы лучше всего сделать с помощью псевдоэлементов, чем и займемся.
.meter > span:after {
content: "";
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
background-image:
-webkit-gradient(linear, 0 0, 100% 100%,
color-stop(.25, rgba(255, 255, 255, .2)),
color-stop(.25, transparent), color-stop(.5, transparent),
color-stop(.5, rgba(255, 255, 255, .2)),
color-stop(.75, rgba(255, 255, 255, .2)),
color-stop(.75, transparent), to(transparent)
);
background-image:
-moz-linear-gradient(
-45deg,
rgba(255, 255, 255, .2) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, .2) 50%,
rgba(255, 255, 255, .2) 75%,
transparent 75%,
transparent
);
z-index: 1;
-webkit-background-size: 50px 50px;
-moz-background-size: 50px 50px;
-webkit-animation: move 2s linear infinite;
-webkit-border-top-right-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-moz-border-radius-topright: 8px;
-moz-border-radius-bottomright: 8px;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
-webkit-border-top-left-radius: 20px;
-webkit-border-bottom-left-radius: 20px;
-moz-border-radius-topleft: 20px;
-moz-border-radius-bottomleft: 20px;
border-top-left-radius: 20px;
border-bottom-left-radius: 20px;
overflow: hidden;
}
Впервые эта идея пришла .
Анимируем конфетку
Только Firefox 4 и браузеры на движке webkit могут анимировать псевдоэлементы. Что ж, искусство требует жертв. Создадим дополнительный класс animate.
<div> <span style="width: 50%"><span></span></span> </div>
Оболочка будет точно такой же как псевдоэлемент, поэтому используем те же значения
.meter > span:after, .animate > span > span {...
И избегаем дублирования
.animate > span:after {
display: none;
}
Будем двигать фон, меняя его размер
@-webkit-keyframes move {
0% {
background-position: 0 0;
}
100% {
background-position: 50px 50px;
}
}
И вызываем эту анимацию
.meter > span:after, .animate > span > span {
-webkit-animation: move 2s linear infinite;
}
Анимация во всю ширину
К сожалению нельзя сделать анимацию на auto или на настоящую ширину объекта, чтобы она шла от абсолютного нуля. Т.е. вот так.
@-webkit-animation expandWidth {
0% { width: 0; }
100% { width: auto; }
}
Поэтому придется применить немного jQuery
$(".meter > span").each(function() {
$(this).data("origWidth", $(this).width())
.width(0).animate({
width: $(this).data("origWidth")
}, 1200);
});
Ну вот и все.
.
.
А что HTML5?
HTML5 имеет элементы <progress> и <meter>, но вид они имеют системный, то есть тот вид прогрессбара, который используется в операционной системе. Вот так, например, выглядит бар в Mac OS.

Отключить стиль по-умолчанию можно так
progress {
-webkit-appearance: none;
}
А изменить индикатор внутри так
progress::-webkit-progress-bar-value {
-webkit-appearance: none;
background: orangered;
}
Это перевод и небольшая адаптация статьи с сайта CSS-Tricks, оригинал можно найти .

6 Комментариев на «CSS3 индикаторы загрузки (прогрес бары)»
Хм… забавно, а где/для чего это применить можно?
Ответить
makecode Ответил:
Июль 31st, 2011 at 21:12
Это вполне может служить заменой спиннерам (такие картинки с лучами, часто серого цвета, которые крутятся при загрузке веб-контента или выполнения какой-либо операции).
Чем это лучше? Тем, что видно сам прогресс выполнения запроса.
Ответить
Для флеш понятно, а для…
Пример конкретно можно посмотреть?
Ответить
makecode Ответил:
Июль 31st, 2011 at 22:43
Да не. Флеш это флеш. Я имею ввиду конкретное использование в web. Сайты построенные на ajax. Тот же самый вкнтакте или фейсбук ваш когда грузит модуль или еще что выдает горизонтальные индикаторы загрузок.
Ответить
Павел Ответил:
Июль 31st, 2011 at 22:59
:))) ни в контактах ни в буках не состою…
Но теперь понял, как про ajax речь зашла. Видел подобное у cms-ки CS-cart.
Ответить
makecode Ответил:
Август 1st, 2011 at 10:46
Тоже не состою, но привел их в пример, т.к. они популярны и все поймут о чем речь)
Ответить