Стилизация <progress> для Firefox

Стилизация <progress> для Firefox работает следующим образом. Стиль самой шкалы задаётся через селектор progress, а шкала значений с помощью псевдоэлемента ::-moz-progress-bar (рис. 1).

Рис. 1. Шкала прогресса

В примере 1 показано изменение цвета фона самой шкалы и значения у <progress> для браузера Firefox.

Пример 1. Цвет фона шкалы прогресса

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>progress</title> <style> progress { width: 100%; /* Ширина */ height: 10px; /* Высота */ background-color: #dfe4f4; /* Цвет фона шкалы */ border: 0; /* Убираем рамку */ border-radius: 5px; /* Радиус скругления */ } progress::-moz-progress-bar { background-color: #232c6f; /* Цвет фона значения */ border-radius: 5px; /* Радиус скругления */ } </style> </head> <body> <progress value="70" max="100"></progress> </body> </html>

Результат данного примера показан на рис. 2.

Рис. 2. Шкала прогресса в Firefox

Пользовательский <progress>

К сожалению, возможности по стилизации <progress> для Firefox практически исчерпаны данным примером. Firefox для <progress> не поддерживает псевдоэлементы ::before и ::after, а также множество других полезных для вёрстки штук, вроде анимации. Поэтому, если нужна шкала прогресса с выводом значения, то мы вообще отказываемся от элемента <progress>, заменяя его набором <div>.

<div class="progress-bar" role="progressbar" aria-valuenow="70" aria-valumax="100" style="--w:70">
 <div class="progress-value">70%</div>
</div>

Разумеется, при необходимости какие-то элементы отсюда убираются или, наоборот, добавляются — к примеру, заголовок и описание.

Чтобы браузеры понимали, что перед ними всё та же шкала прогресса, пишем атрибут role со значением progressbar и атрибуты aria-valuenow и aria-valumax, значения которых дублируют атрибуты value и max элемента <progress>.

К <div> также добавляется атрибут style с нашей переменной --w. Мы ей воспользуемся для вычисления некоторых размеров и положений, как это показано в примере 2.

Пример 2. Пользовательская шкала прогресса

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>progress</title> <style> .progress-bar { width: 100%; /* Ширина */ height: 10px; /* Высота */ background-color: #e5e5e5; /* Цвет фона */ position: relative; /* Относительное позиционирование */ margin-top: 3rem; /* Расстояние сверху */ } .progress-bar::before { content: ''; /* Псевдоэлемент */ position: absolute; /* Абсолютное позиционирование */ height: 100%; width: 100%; /* Занимает весь размер */ transform-origin: 0; /* Трансформируется от левого края */ transform: scaleX(calc(var(--w) / 100)); /* Ширина значения */ background-color: #fd0b58; /* Цвет фона */ } .progress-bar::after { content: attr(aria-valuenow) '%'; /* Выводим значение атрибута */ position: absolute; /* Абсолютное позиционирование */ bottom: 15px; /* Положение снизу */ left: calc(var(--w) * 1%); /* Ширина в процентах */ transform: translateX(-50%); /* Смещаем влево на половину размера */ background-color: #e5e5e5; /* Цвет фона */ padding: 5px 10px 12px; /* Расстояние от текста до края */ /* Делаем указатель снизу */ clip-path: polygon(40% 80%, 0 80%, 0 0, 100% 0, 100% 80%, 60% 80%, 50% 100%); } </style> </head> <body> <div class="progress-bar" role="progressbar" aria-valuenow="70" aria-valuemax="100" style="--w:70"></div> </body> </html>

Результат данного примера показан на рис. 3.

Рис. 3. Пользовательская шкала прогресса

Поскольку здесь мы не используем специфических для каждого браузера псевдоэлементов, шкала прогресса будет выглядеть одинаково во всех браузерах.

Итоги

  • В Firefox стилизация шкалы прогресса делается через селектор progress.
  • За изменение стиля шкалы значения в Firefox отвечает псевдоэлемент ::-moz-progress-bar.
  • Firefox для элемента <progress> не поддерживает псевдоэлементы ::before и ::after и для их работы заменяем <progress> на <div> со следующими атрибутами:
    • role="progressbar" — браузер понимает что это шкала прогресса;
    • aria-valuenow="70" — текущее значение прогресса, вместо 70 пишем своё число;
    • aria-valuemax="100" — максимальное значение.

Перейти к заданиям

Автор: Влад Мержевич
Последнее изменение: 21.06.2025

Измените вид следующего элемента <progress>:

<progress value="70" max="100"></progress>

Чтобы шкала прогресса выглядела одинаково в браузерах Chrome и Firefox, как показано на рис. 1.

Рис. 1

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>progress</title> <style> progress { --c: #0dd062; width: 100%; height: 42px; border: 2px solid #4b4b4b; padding: 4px; background-color: #fff; box-sizing: border-box; } progress::-webkit-progress-bar { background-color: #fff; } progress::-webkit-progress-value { background-image: repeating-linear-gradient( to right, var(--c), var(--c) 30px, #fff 30px, #fff 35px); } progress::-moz-progress-bar { background-image: repeating-linear-gradient( to right, var(--c), var(--c) 30px, #fff 30px, #fff 35px); } </style> </head> <body> <progress value="70" max="100"></progress> </body> </html>

Измените вид следующего элемента <progress>:

<progress value="70" max="100"></progress>

Чтобы цвет шкалы выглядел одинаково в браузерах Chrome и Firefox, как показано на рис. 1.

Рис. 1

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>progress</title> <style> progress { --c: #ab56a7; width: 100%; height: 30px; border: 5px solid var(--c); border-radius: 15px; background-color: var(--c); box-sizing: border-box; } progress::-webkit-progress-bar { background-color: var(--c); } progress::-webkit-progress-value { background-color: #fff; border-radius: 15px; } progress::-moz-progress-bar { background-color: #fff; border-radius: 15px; } </style> </head> <body> <progress value="70" max="100"></progress> </body> </html>

Используя приведённый код HTML, добавьте к нему стили, чтобы получить результат, показанный на рис. 1. Веб-страница должна выглядеть одинаково в браузерах Chrome и Firefox.

<div class="progress-bar">
 <div class="progress-row">
  <div class="progress-loading">Данные загружаются…</div>
  <div class="progress-percent">50%</div>
 </div>
 <progress value="50" max="100"></progress>
 <div class="progress-mb">30Мб из 60Мб</div>
</div>

Рис. 1

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>progress</title> <style> .progress-bar { --c1: #ebebeb; --c2: #2acb70; font-family: Arial, Helvetica, sans-serif; } progress { width: 100%; height: 10px; background-color: var(--c1); border: 0; border-radius: 5px; margin: 1rem 0; } progress::-moz-progress-bar { background-color: var(--c2); } progress::-webkit-progress-bar { background-color: var(--c1); border-radius: 5px; } progress::-webkit-progress-value { background-color: var(--c2); border-radius: 5px; } .progress-row { display: flex; justify-content: space-between; } .progress-mb { color: #7a7a7a; } </style> </head> <body> <div class="progress-bar"> <div class="progress-row"> <div class="progress-loading">Данные загружаются…</div> <div class="progress-percent">50%</div> </div> <progress value="50" max="100"></progress> <div class="progress-mb">30Мб из 60Мб</div> </div> </body> </html>