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, оригинал можно найти здесь.

Понравился пост? Подпишитесь на RSS ленту или Twitter.
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 votes, average: 5,00 из 5)
Loading ... Loading ...
Теги: , , ,

Похожие записи

6 Комментариев на «CSS3 индикаторы загрузки (прогрес бары)»

  • Павел
    31 Июль, 2011, 20:35

    Хм… забавно, а где/для чего это применить можно?

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    Это вполне может служить заменой спиннерам (такие картинки с лучами, часто серого цвета, которые крутятся при загрузке веб-контента или выполнения какой-либо операции).

    Чем это лучше? Тем, что видно сам прогресс выполнения запроса.

    Thumb up 0 Thumb down 0

    Ответить

  • Павел
    31 Июль, 2011, 22:30

    Для флеш понятно, а для…
    Пример конкретно можно посмотреть?

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    Да не. Флеш это флеш. Я имею ввиду конкретное использование в web. Сайты построенные на ajax. Тот же самый вкнтакте или фейсбук ваш когда грузит модуль или еще что выдает горизонтальные индикаторы загрузок.

    Thumb up 0 Thumb down 0

    Ответить

    Павел Ответил:

    :))) ни в контактах ни в буках не состою…
    Но теперь понял, как про ajax речь зашла. Видел подобное у cms-ки CS-cart.

    Thumb up 0 Thumb down 0

    Ответить

    makecode Ответил:

    Тоже не состою, но привел их в пример, т.к. они популярны и все поймут о чем речь)

    Thumb up 0 Thumb down 0

    Ответить

Оставить комментарий