
Тег <progress> часто используется для отображения состояния загрузки, выполнения задач или прогресса обработки данных. По умолчанию браузеры применяют к нему собственные стили, которые отличаются в зависимости от движка. Чтобы добиться единообразного внешнего вида, необходимо переопределить встроенные стили с помощью CSS.
Для начала стоит задать базовые параметры: ширину, высоту, фон и границы. Например, свойство appearance: none; отключает стандартное оформление, что позволяет использовать кастомные цвета и анимации. После этого можно оформить фон через background, а заливку прогресса – с помощью псевдоэлементов ::-webkit-progress-value и ::-moz-progress-bar.
При создании кастомного дизайна полезно учитывать адаптивность. Используйте относительные единицы измерения (%, em, vw) и плавные переходы через transition. Для отображения динамического прогресса можно добавить анимацию, меняющую ширину заливки по мере увеличения значения атрибута value. Это создаёт визуальную связь между действием пользователя и результатом.
Важно также протестировать стили в разных браузерах. Safari, Firefox и Chrome по-разному интерпретируют внутренние элементы прогресс-бара. Чтобы избежать искажений, стоит использовать комбинацию кроссбраузерных селекторов и fallback-стилей. Такой подход гарантирует корректное отображение кастомного прогресс-бара на большинстве устройств.
Как изменить цвет заполнения прогресс-бара

Цвет заполнения тега <progress> задаётся через псевдоэлементы, так как сам элемент имеет встроенный стиль, зависящий от браузера. Для корректного отображения рекомендуется использовать разные селекторы под каждую платформу.
-
Chrome, Edge, Safari: применяются псевдоэлементы
::-webkit-progress-valueи::-webkit-progress-bar.progress::-webkit-progress-value { background-color: #4caf50; } progress::-webkit-progress-bar { background-color: #e0e0e0; } -
Firefox: используется
::-moz-progress-bar.progress::-moz-progress-bar { background-color: #4caf50; }
Если требуется задать градиент или нестандартный цветовой переход, можно использовать CSS-свойство background-image:
progress::-webkit-progress-value {
background-image: linear-gradient(to right, #4caf50, #8bc34a);
}
Для адаптации под тёмную тему удобно применять переменные:
:root {
--progress-fill: #4caf50;
--progress-bg: #2c2c2c;
}
progress::-webkit-progress-value {
background-color: var(--progress-fill);
}
progress::-webkit-progress-bar {
background-color: var(--progress-bg);
}
При необходимости можно добавить рамку, скругление и высоту, чтобы элемент выглядел единообразно во всех браузерах:
progress {
width: 100%;
height: 16px;
border-radius: 8px;
overflow: hidden;
}
Как задать фон и границы для тега progress

По умолчанию <progress> имеет нативный стиль, зависящий от браузера. Чтобы задать собственный фон и границы, необходимо сбросить стандартное оформление и применить нужные свойства через псевдоэлементы.
Минимальный пример настройки:
progress {
-webkit-appearance: none;
appearance: none;
width: 300px;
height: 20px;
border: 2px solid #444;
background-color: #f0f0f0;
border-radius: 6px;
overflow: hidden;
}
progress::-webkit-progress-bar {
background-color: #f0f0f0;
}
progress::-webkit-progress-value {
background-color: #4caf50;
}
progress::-moz-progress-bar {
background-color: #4caf50;
}
Для создания сложного фона можно использовать градиенты:
progress::-webkit-progress-value {
background: linear-gradient(90deg, #66bb6a, #388e3c);
}
Основные параметры для настройки:
| Свойство | Назначение | Пример значения |
|---|---|---|
background-color |
Цвет фона полосы | #f0f0f0 |
border |
Толщина, стиль и цвет рамки | 2px solid #444 |
border-radius |
Скругление углов | 6px |
overflow |
Обрезка содержимого по границе | hidden |
Чтобы стили применялись одинаково в разных браузерах, обязательно использовать -webkit-appearance: none; и дублировать оформление для ::-webkit-progress-value и ::-moz-progress-bar.
Как управлять высотой и шириной индикатора

По умолчанию тег <progress> имеет фиксированные размеры, которые зависят от браузера. Чтобы задать собственные значения, необходимо переопределить стили с помощью CSS.
Ширина изменяется через свойство width. Например, progress { width: 300px; } задаст индикатор длиной 300 пикселей. Для адаптивного оформления можно использовать относительные единицы: width: 100%; – индикатор растянется по ширине родительского контейнера.
Высота управляется свойством height. Например, progress { height: 20px; } увеличит толщину полосы. При этом важно учитывать оформление псевдоэлементов, поскольку в некоторых браузерах толщина визуальной части не изменяется без переопределения стилей ::-webkit-progress-bar и ::-webkit-progress-value.
Чтобы визуально сохранить пропорции при изменении высоты, следует корректировать внутренние отступы и радиусы скругления. Пример: progress { height: 16px; border-radius: 8px; } и ::-webkit-progress-value { border-radius: 8px; }.
Если используется тёмная или светлая тема, размеры лучше задавать в относительных единицах (em или rem), чтобы индикатор масштабировался вместе со шрифтом. Например: progress { height: 1rem; width: 15rem; }.
Как стилизовать прогресс-бар с помощью псевдоэлементов

Псевдоэлементы ::before и ::after позволяют создать кастомный прогресс-бар без использования дополнительных HTML-элементов. Такой подход удобен, когда нужно задать уникальный стиль индикатора при сохранении стандартного тега <progress>.
Сначала следует убрать стандартный вид элемента:
progress {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 20px;
background: transparent;
position: relative;
}
Далее можно использовать ::before для оформления фона и ::after для заливки:
progress::before {
content: "";
position: absolute;
inset: 0;
border-radius: 4px;
background: #e0e0e0;
}
progress::after {
content: "";
position: absolute;
inset: 0;
border-radius: 4px;
background: linear-gradient(90deg, #4caf50 var(--value), transparent 0);
}
Чтобы динамически изменять ширину заливки, можно использовать CSS-переменную:
progress[value] {
--value: calc(var(--val, 0) * 1%);
}
progress[value]::after {
background: linear-gradient(90deg, #4caf50 var(--value), transparent 0);
}
Значение --val можно задавать через inline-стиль, синхронизируя его с атрибутом value:
<progress value="70" max="100" style="--val:70"></progress>
Такой метод позволяет создавать адаптивные и гибкие прогресс-бары, настраивая цвета, анимацию и форму заливки без вмешательства в разметку.
Как добавить анимацию заполнения прогресса
Для создания плавного эффекта заполнения используйте свойство transition или анимацию с помощью @keyframes. Пример с transition позволяет изменять значение атрибута value с постепенным ростом ширины индикатора.
Пример:
<progress id="bar" max="100" value="0"></progress>
<style>
progress {
width: 300px;
height: 20px;
appearance: none;
}
progress::-webkit-progress-bar {
background-color: #eee;
border-radius: 10px;
}
progress::-webkit-progress-value {
background-color: #4caf50;
border-radius: 10px;
transition: width 2s linear;
}
</style>
<script>
const bar = document.getElementById('bar');
let value = 0;
const timer = setInterval(() => {
if (value < 100) {
value += 10;
bar.value = value;
} else {
clearInterval(timer);
}
}, 500);
</script>
Если требуется зацикленная анимация без изменения атрибута value, используйте псевдоэлемент и @keyframes:
<div class="progress-wrap">
<div class="progress-line"></div>
</div>
<style>
.progress-wrap {
width: 300px;
height: 20px;
background: #eee;
border-radius: 10px;
overflow: hidden;
}
.progress-line {
height: 100%;
background: #4caf50;
width: 0;
animation: fill 3s forwards;
}
@keyframes fill {
from { width: 0; }
to { width: 100%; }
}
</style>
Такой подход позволяет управлять скоростью, направлением и типом анимации, а также комбинировать эффекты для разных состояний прогресс-бара.
Как оформить разные состояния прогресса

Тег <progress> поддерживает псевдоклассы и атрибуты, позволяющие менять оформление в зависимости от состояния загрузки или выполнения задачи. Основные подходы:
- Использование атрибута
value: при динамическом изменении значения можно менять цвет или ширину индикатора через селекторprogress[value]и вложенный::-webkit-progress-value. - Псевдоклассы состояния:
:indeterminateиспользуется для неопределённого прогресса. Для него применяют анимацию заполнения, например, градиентное движение по полосе. - Разные цвета для диапазонов значений: с помощью селекторов CSS можно задавать стили для интервалов, например:
- 0–25% – красный;
- 26–75% – оранжевый;
- 76–100% – зелёный.
Это достигается через JavaScript, меняющий класс или напрямую стиль
style.backgroundв зависимости отvalue. - Текстовое сопровождение состояния: можно использовать
<span>рядом с<progress>, чтобы отображать значение в процентах или сообщение «Загрузка…», обновляя его черезprogress.value.
Примеры CSS для разных состояний:
progress::-webkit-progress-value {
transition: background 0.3s;
}
progress.low::-webkit-progress-value { background: #e74c3c; } /* 0–25% /
progress.medium::-webkit-progress-value { background: #f39c12; } / 26–75% /
progress.high::-webkit-progress-value { background: #27ae60; } / 76–100% */
progress:indeterminate::-webkit-progress-value {
animation: move 1s linear infinite;
background: linear-gradient(90deg, #3498db 25%, #ecf0f1 25%, #ecf0f1 50%, #3498db 50%);
}
@keyframes move {
0% { background-position: 0 0; }
100% { background-position: 100% 0; }
}
Использование таких приёмов позволяет визуально отличать состояния прогресса и обеспечивать понятную обратную связь пользователю. Цвета и анимации стоит подбирать с учётом контрастности и доступности для людей с нарушениями зрения.
Как применить градиенты и тени к прогресс-бару

Для создания градиентного эффекта на <progress> используется свойство background или linear-gradient для псевдоэлементов ::-webkit-progress-value и ::-moz-progress-bar. Например, чтобы задать горизонтальный переход от синего к зелёному, применяется:
background: linear-gradient(to right, #1e90ff, #32cd32);
Для разных браузеров важно отдельно прописывать стили: ::-webkit-progress-bar для Chrome и Safari и ::-moz-progress-bar для Firefox. Это позволяет управлять не только цветом заполнения, но и визуальной структурой всего элемента.
Тени добавляются через box-shadow. Для объёмного эффекта на полосе прогресса используется комбинация внутренней и внешней тени, например:
box-shadow: inset 0 2px 4px rgba(0,0,0,0.3), 0 2px 6px rgba(0,0,0,0.2);
Внутренняя тень подчёркивает глубину заполнения, внешняя создаёт лёгкий объём на фоне. Для плавного визуального эффекта градиент и тень можно комбинировать с border-radius, чтобы закруглить углы и улучшить читаемость прогресса.
Для динамического изменения цветов на основе значения value прогресс-бара можно использовать CSS-переменные. Например, задавая градиент через var(--progress-color), можно менять оттенок полосы при достижении определённого процента.
Важно учитывать контраст градиента и тени с фоном. При тёмном фоне выбирают светлые оттенки для градиента и мягкую тень, на светлом фоне – более насыщенные цвета и глубокую тень, чтобы заполнение было визуально различимо.
Как адаптировать стили под разные браузеры
Для Chrome, Safari и Edge на Chromium используйте ::-webkit-progress-bar для фона и ::-webkit-progress-value для полосы прогресса. Через них можно задавать цвет, градиенты и скругления углов.
В Firefox применяется ::-moz-progress-bar. Свойства WebKit, такие как градиенты или тени, не работают, поэтому необходимо создавать отдельные стили для цвета, фонового рисунка и закруглений.
IE и старые версии Edge ограничены встроенным отображением. Цвет задается через стандартный background-color, а размеры контролируются напрямую у тега progress. Полная кастомизация невозможна без замены на сторонние элементы.
Для кроссбраузерной совместимости сначала задайте базовый стиль для тега progress – ширину, высоту и фон. Затем добавляйте стили для движков через соответствующие псевдоэлементы, чтобы сохранить единый вид.
Проверяйте отображение в разных браузерах. Различия возникают в толщине полосы, скруглениях и интервалах. Используйте фиксированные единицы, такие как px, и fallback-цвета для случаев, когда псевдоэлементы не поддерживаются.
Вопрос-ответ:
Можно ли изменить цвет полосы прогресса в теге progress?
Да, это возможно с помощью CSS. Для большинства браузеров можно использовать псевдоэлементы ::-webkit-progress-bar для фоновой части и ::-webkit-progress-value для самой заполненной полосы. Например, чтобы сделать полосу синей на сером фоне, можно написать: progress::-webkit-progress-bar { background: #ccc; } progress::-webkit-progress-value { background: #00f; }.
Как сделать закруглённые края у прогресс-бара?
Для закругления углов используют свойство border-radius. Оно применяется как к самому элементу progress, так и к его псевдоэлементам. В Chrome и других браузерах на движке WebKit обычно задают: progress::-webkit-progress-bar { border-radius: 8px; } progress::-webkit-progress-value { border-radius: 8px; } Это создаёт аккуратный визуальный эффект.
Можно ли анимировать изменение значения прогресс-бара?
Да, CSS-анимации позволяют сделать плавное изменение заполнения. Например, можно задать transition для псевдоэлемента ::-webkit-progress-value: progress::-webkit-progress-value { transition: width 0.5s ease; } Тогда при изменении атрибута value полоска будет расширяться плавно.
Поддерживают ли все браузеры стилизацию тега progress?
Нет, разные браузеры обрабатывают progress по-своему. В WebKit-браузерах (Chrome, Safari) работают ::-webkit-progress-bar и ::-webkit-progress-value, в Firefox используют ::-moz-progress-bar. Старые версии браузеров могут игнорировать стили и показывать стандартный вид.
Можно ли добавить тень или градиент к полосе прогресса?
Да, можно применять background с градиентами и тени через box-shadow на псевдоэлементах. Например: progress::-webkit-progress-value { background: linear-gradient(to right, #4caf50, #8bc34a); box-shadow: inset 0 1px 2px rgba(0,0,0,0.3); } Такой подход делает визуализацию более объёмной и привлекательной.
Можно ли изменить цвет полосы прогресса в теге
Да, цвет полосы можно изменить с помощью CSS-псевдоэлементов. Например, для Chrome и Safari используется ::-webkit-progress-value, а для Firefox — ::-moz-progress-bar. С помощью этих селекторов можно задавать любые свойства цвета, градиента или тени, чтобы сделать прогресс-бар более заметным или подходящим под дизайн сайта.
Как сделать прогресс-бар с закругленными краями и разным фоном для пустой и заполненной части?
Чтобы создать такой эффект, применяют псевдоэлементы и свойства border-radius и background. Например, у самого тега
