Полосатый прогресс-бар — классика интерфейсов. Рисовать каждую полосу отдельным стопом незачем: достаточно описать одну пару полос и попросить браузер повторять её до конца.
.progress__bar {
height: 100%;
background: repeating-linear-gradient(45deg, #339af0 0 10px, #74c0fc 0 20px);
}
Как работает повтор
У каждого вида градиента есть повторяющаяся версия с тем же синтаксисом:
- repeating-linear-gradient() — полосы;
- repeating-radial-gradient() — концентрические кольца;
- repeating-conic-gradient() — лучи, как у солнечных часов.
Браузер берёт отрезок от первой до последней позиции стопов и повторяет его, пока не заполнит блок (или полный оборот — у конического). В прогресс-баре этот отрезок — 20px: 10px тёмной полосы и 10px светлой.
Ловушка: забытый ноль
Длина повтора считается от первой позиции, а не от нуля. Пока первый стоп начинается с 0, это незаметно. Но стоит записать полосу в сокращённом виде, как в главе 1, — и узор поедет.
/* правильно: отрезок повтора 0–50%, три полосы по 1/6 */
.flag--ok {
background: repeating-linear-gradient(#000 0 16.67%, #fcdc04 0 33.33%, #d90000 0 50%);
}
/* сломано: отрезок повтора 16.67–50%, полосы смещены */
.flag--broken {
background: repeating-linear-gradient(#000 16.67%, #fcdc04 0 33.33%, #d90000 0 50%);
}
В обычном градиенте ноль у первого цвета можно опускать, в повторяющемся — нельзя. Если повторяющийся узор выглядит странно, первым делом стоит проверить именно это место.
Флаг Греции: полосы плюс крест
Девять полос, синий квадрат в углу и белый крест в нём. Полосы — это повторяющийся градиент с отрезком в 2/9 высоты. Крест — два слоя размером с квадрат, прижатые к левому верхнему углу.
.flag--greece {
--blue: #0d5eaf;
aspect-ratio: 3 / 2;
background:
linear-gradient(90deg, #0000 40%, #fff 0 60%, #0000 0) 0 0 / 37.037% 55.556% no-repeat,
linear-gradient(var(--blue) 40%, #fff 0 60%, var(--blue) 0) 0 0 / 37.037% 55.556% no-repeat,
repeating-linear-gradient(var(--blue) 0 calc(100% / 9), #fff 0 calc(200% / 9));
}
Квадрат занимает пять полос, то есть 5/9 высоты (55.556%). Чтобы он остался квадратом, его ширина должна быть той же длины: 5/9 высоты при флаге 3:2 — это 37,037% ширины. Внутри квадрата крест — полосы шириной в одну пятую, от 40% до 60%.
Синий цвет повторяется трижды, поэтому он вынесен в переменную. А в первом стопе повторяющегося слоя стоит тот самый ноль.
Флаг Уганды: два способа
Шесть полос — чёрная, жёлтая, красная и снова они же — плюс белый круг в центре. Эмблему с журавлём рисовать не будем: детальные изображения — работа для SVG, а не для градиентов.
.flag--uganda {
aspect-ratio: 3 / 2;
background:
radial-gradient(circle closest-side, #fff 33%, #0000 0),
repeating-linear-gradient(#000 0 16.67%, #fcdc04 0 33.33%, #d90000 0 50%);
}
То же самое получается и без повторяющегося градиента. Обычный градиент из трёх полос делаем высотой в половину флага, а дальше работает плиточный повтор из прошлой главы:
.flag--uganda {
aspect-ratio: 3 / 2;
background:
radial-gradient(circle closest-side, #fff 33%, #0000 0),
linear-gradient(#000 33.33%, #fcdc04 0 66.67%, #d90000 0) 0 0 / 100% 50%;
}
Результат на экране одинаковый. Какой вариант выбрать — дело вкуса: в CSS почти у любой картинки есть несколько верных решений.
Что запомнить
- repeating-*-градиенты повторяют отрезок от первой до последней позиции.
- В повторяющемся градиенте у первого цвета обязательно пишем начальную позицию, обычно 0.
- Тот же эффект часто даёт обычный градиент с background-size.