Круговой индикатор процесса на CSS
Что будем делать?
Такие индикаторы загрузки вы наверняка встречали, особенно на Flash сайтах. Это сектор круга, который становится все больше и больше, пока не превратиться в завершенный круг.
На первый взгляд задача кажется простой: делаем круг, вращаем его и скрываем часть за маской. Но на деле все оказывается несколько сложнее. CSS не подготовлен для решения таких задач, даже при использовании препроцессоров наподобие SASS & Compass. Мы всегда боремся, когда приходится делать различные формы, а особенно при определении стилей и анимации для них. Большая часть рабочего времени уходит на то. чтобы получить что-то работающее, а в жертву приносится семантичность кода и его поддержка.
Зачем делаем?
Наиболее вероятное использование таких элементов - таймеры. Но данную концепцию можно использовать, чтобы сделать круговую диаграмму на одном CSS.
Хотя есть несколько изумительных инструментов для управления круговыми диаграммами (в основном, на JavaScript), мы тем не менее сделаем такой элемент только на CSS и даже анимируем его с помощью нескольких трюков.
Семантичность кода будет так себе! Но сопровождение можно сделать достаточно удобным.
HTML
Нам нужно 3 разных элемента:
- spinner: половинка круга, которая будет вращаться;
- mask: данный элемент скрывает вращающийся круг в ходе первых 50% анимации;
- filler: данный элемент заполняет круг в ходе последних 50% анимации.
И все три элемента должны иметь одного родителя для абсолютного позиционирования:
<div class="wrapper"> <div class="spinner pie"></div> <div class="filler pie"></div> <div class="mask"></div> </div>
Так как spinner и filler являются двумя половинками одного круга, то мы будем использовать для них класс .pie
.
CSS
Чтобы сохранить код урока четким и понятным, префиксы производителей браузеров опущены.
Родительский элемент получает размеры и абсолютное позиционирование контекста для таймера:
.wrapper { width: 250px; height: 250px; position: relative; background: white; }
Важно, чтобы ширина и высота были равны, чтобы получить круг и все работало.
Элементы "spinner" и "filler" используют данный код CSS:
.pie { width: 50%; height: 100%; position: absolute; background: #08C; border: 10px solid rgba(0,0,0,0.4); }
Они имеют ширину равную 50% родительского элемента, так они являются двумя частями одного круга, а их высота равна высоте родительского элемента. Также мы определяем для них одинаковый цвет и рамку.
Элемент "spinner"
.spinner { border-radius: 125px 0 0 125px; z-index: 200; border-right: none; animation: rota 10s linear infinite; }
Делаем его полукругом с помощью свойства border-radius на верхнем левом и нижнем левом углах. Также определяем положительное значение для z-index
, чтобы разместить его поверх заполняющего элемента, но ниже маски.
Затем добавляем animation
длительностью 10 секунд. Об анимации мы поговорим позже.
Элемент "filler"
.filler { border-radius: 0 125px 125px 0; z-index: 100; border-left: none; animation: fill 10s steps(1, end) infinite; left: 50%; opacity: 0; }
Для данного элемента устанавливаем border-radius
и z-index
, удаляем border-left
, и делаем анимацию длительностью 10секунд. Для данного элемента animation-timing-function
не получает значения linear
, но будет steps(1, end)
. Это значит, что animation
будет выполняться мгновенно.
Так как заполняющий элемент не должен быть видимым в ходе первой половины анимации, его непрозрачность будет 0, а положение - 50% ширины родительского элемента.
Элемент "mask"
.mask { width: 50%; height: 100%; position: absolute; z-index: 300; opacity: 1; background: inherit; animation: mask 10s steps(1, end) infinite; }
Маска присутствует с начала анимации, поэтому ее непрозрачность имеет значение 1, а фон наследуется от родительского элемента (чтобы она была невидима). Чтобы закрывать вращающийся элемент, она будет иметь те же размеры, а свойство z-index устанавливается в значение 300.
Кадры анимации
@keyframes rota { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes fill { 0% { opacity: 0; } 50%, 100% { opacity: 1; } } @keyframes mask { 0% { opacity: 1; } 50%, 100% { opacity: 0; } }
Первая анимация (rota
) используется для элемента spinner. Он постепенно вращается от 0 до 360 градусов за 10 секунд.
Вторая анимация (fill
) используется для элемента filler. Он немедленно изменяет непрозрачность с 0 до 1 по истечении 5 секунд.
Последняя анимация (mask
) используется для элемента mask. Он немедленно изменяет непрозрачность с 1 до 0 по истечении 5 секунд.
Анимация имеет следующий вид:
- T0 - элемент spinner слева, скрыт маской . Элемент filler скрыт.
- T1 - элемент spinner начинает вращаться по часовой стрелке и медленно появляется из-за маски.
- T2 - элемент spinnerr повернут на угол 360/10*2 = 72° продолжает вращаться.
- T3 - элемент spinner повернут на угол 360/10*3 = 108° продолжает вращаться.
- T4 - элемент spinner повернут на угол 360/10*4 = 144° продолжает вращаться.
- T5 - элемент spinner повернут на угол 360/10*5 = 180° продолжает вращаться. В данный момент элемент filler мгновенно становится видимым, а маска скрывается.
- T6 - элемент spinner повернут на угол 360/10*6 = 216° продолжает вращаться.
- T7 - элемент spinner повернут на угол 360/10*7 = 252° продолжает вращаться.
- T8 -элемент spinner повернут на угол 360/10*8 = 288° продолжает вращаться.
- T9 - элемент spinner повернут на угол 360/10*9 = 324° продолжает вращаться.
- T10 - элемент spinner повернут на угол 360°. Вернулись к точке старта. Сбрасываем анимацию. Маска появляется, а заполняющий элемент скрывается.
Бонус
Несколько дополнительных трюков.
Пауза при наведении курсора
.wrapper:hover .filler, .wrapper:hover .spinner, .wrapper:hover .mask { animation-play-state: paused; }
С помощью данного кода вы можете остановить всю анимацию при наведении курсора на родительский элемент.
Вставляем содержание
Благодаря свойству z-index
мы можем легко добавить какое-нибудь содержание в элемент spinner и заставить его вращаться. Попробуйте следующий код :
.spinner:after { content: ""; position: absolute; width: 10px; height: 10px; border-radius: 50%; top: 10px; right: 10px; background: #fff; border: 1px solid rgba(0,0,0,0.4); box-shadow: inset 0 0 3px rgba(0,0,0,0.2); }
Препроцессор или переменные CSS
В текущий момент код очень не просто поддерживать. Но если мы используем переменные (в препроцессоре или ожидаемые внутренние переменные CSS), все может стать существенно проще. Например, можно добавить переменные для управления длительностью вместо того, чтобы исправлять код в 3 определениях анимаций.
Если хочется улучшить сопровождаемость кода без использования препроцессоров, можно создать класс с одним управлением длительностью анимаций и добавлять его к 3 дочерним элементам. Например так :
.animation-duration { animation-duration: 10s; }
<div class="wrapper"> <div class="spinner pie animation-duration"></div> <div class="filler pie animation-duration"></div> <div class="mask animation-duration"></div> </div>
Недостатки
Данная техника имеет ряд недостатков:
- Не поддерживаются градиенты.
- Не поддерживаются тени.
- Нет адаптивности. Если изменяется размер родительского элемента, то все будет нормально, кроме радиуса закругления рамки. Его придется менять вручную.
- Нет семантичности (4 элемента для одной анимации).
Поддержка браузеров
Так как мы используем анимации CSS, то поддержка в браузерах достаточно скудная:
- Internet Explorer 10
- Firefox 12+
- Chrome
- Safari 5+
- Opera 12+
- iOS Safari 3+
- Android 2+
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/1NVGot9Vb0Q/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей Индийская пословица |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.