Вращающийся лоадер
В этой демонстрации разберём, как создать лоадер.
Лоадер будет состоять из двенадцати «лепестков», которые выстроены вокруг центральной точки.
Добавим разметку.
Создадим правило для элемента с классом .loader
и определим размеры лоадера.
Для рисования лепестков используем псевдоэлемент ::after
. Определим размеры. Немного скруглим углы. Добавим position: absolute
. А для элемента .loader
добавим position: relative
.
Поворачивать лепестки будем за счёт трансформации rotate
. С помощью CSS-свойства transform-origin
зададим для элемента .loader__stick
определим точку вращения, чтобы оно происходило вокруг центра лоадера. Сразу добавим нулевой угол поворота для первого лепестка.
Каждый последующий лепесток будет поворачиваться на 30 градусов (360 / 12 = 30). Так для второго лепестка — transform: rotate(30deg)
. Для третьего — transform: rotate(60deg)
.
Добавим поворот для остальных лепестков.
Создадим анимацию spinner
, которая будет менять прозрачность.
Добавим анимацию spinner
для элемента с классом .loader__stick
. Время установим равным 1.2s
. Повторять анимацию будем бесконечно.
Так мы имитируем исчезновение лепестков.
Сейчас лепестки исчезают и появляются одновременно. Заставим их делать это последовательно. Для этого зададим каждому элементу задержку анимации с разницей в 0.1 секунды (элементов 12, а вся анимация длится 1.2 секунды).
Сначала зададим animation-delay
со значением 0s
последнему лепестку, затем animation-delay
со значением -0.1s
предпоследнему.
Аналогично добавим animation-delay
для остальных лепестков.
Теперь избавимся от батареи правил loader__stick:nth-child
. Добавим в разметку каждого элемента атрибут style
с переменной --i
.
Зададим трансформацию поворота через формулу calc(30deg * var(--i))
. То есть каждый элемент поворачивается на дополнительные 30 градусов.
Свойства transform: rotate(x)
в отдельных правилах удалим. Ничего не сломалось.
Зададим задержку анимации с помощью формулы calc(var(--i) * 0.1s - 1.2s)
. То есть задержка каждого элемента изменяется на 0.1
относительно предыдущего. От -1.1s
у первого элемента, до 0s
у последнего.
Можно удалить оставшуюся батарею с :nth-child
. Ничего не сломалось.
Лоадер готов.