Тег meter в HTML: что это, low, high и optimum

Тег meter показывает шкалу: значение внутри известного диапазона, например заряд батареи, занятое место на диске или оценка за тест. Браузер рисует горизонтальную шкалу и красит её в зелёный, жёлтый или красный цвет в зависимости от зоны, в которую попало значение. Закрывающий тег </meter> нужен, пропускать его нельзя.

Тег появился в HTML5 и нужен для измерений. Для задачи, которая выполняется и имеет конец, подходит тег progress, а для значения, которое двигает сам пользователь, поле input с type="range".

HTML
<meter min="0" max="100" low="20" high="80" optimum="100" value="90"></meter>
Результат

Один тег с тремя уровнями заряда.

Тег meter в HTML: что это и когда нужен

Шкала показывает, где находится значение среди границ: насколько заряжена батарея, сколько места занято, какой балл получен. Это не ход работы, а показание: оно может и расти, и падать. Сам тег ничего не считает, значение меняет скрипт или автор страницы. Вычисленный display равен inline-block, поэтому шкала встаёт в строку рядом с текстом. Оба индикатора рядом показаны в уроке про индикаторы.

HTML
<label>Заряд
  <meter min="0" max="100" value="70"></meter>
</label>

Пример: meter и progress рядом

Результат

Показание, процесс и оценка рядом.

Атрибуты value, min и max: диапазон шкалы

Границы шкалы задают min и max, по умолчанию 0 и 1. Атрибут value показывает текущее значение между ними. Если max не указан, значение 0.3 означает 30%. Минимум менять можно, и это удобно для температуры от -20 до 40. Атрибут value обязателен: без него запись считается ошибкой при проверке, хотя браузер возьмёт ноль.

HTML
<meter min="-20" max="40" value="22"></meter>

Пример: как записать диапазон

Результат

Четыре способа задать диапазон.

Атрибуты low и high: три зоны шкалы

Атрибуты low и high делят шкалу на три зоны: от min до low низкая, от low до high средняя, от high до max высокая. По умолчанию low равен min, а high равен max: зона одна, и шкала всегда зелёная. Сами зоны цвета не задают, цвет выбирает браузер, сравнивая зону значения с лучшей зоной.

HTML
<meter min="0" max="100" low="33" high="66" value="10"></meter>

Пример: зоны при разных границах

Результат

Одни и те же три значения при разных границах.

Атрибут optimum: от чего зависит цвет шкалы

Атрибут optimum показывает, какое значение считается лучшим. Браузер находит зону, где находится optimum, и сравнивает с ней зону значения: та же зона даёт зелёный цвет, соседняя жёлтый, дальняя красный. Если optimum не указан, берётся середина диапазона. Для заряда батареи его указывают около максимума, для заполненности диска около нуля. Когда лучшая зона посередине, красного нет совсем. Конкретные оттенки зависят от браузера.

HTML
<meter min="0" max="100" low="33" high="66" optimum="80" value="90"></meter>

Пример: три положения лучшей зоны

Результат

Три расположения лучшей зоны для одних значений.

Неверные значения: что делает браузер

На неверные числа браузер не сообщает об ошибке, а подгоняет их. Значение вне границ зажимается до ближайшей границы, нечисловое (abc, пустая строка, 20%) становится нулём. Если min больше max, максимум поднимается до минимума, и все числа шкалы равны. Если low больше high, значение high поднимается до low. Лишние low, high и optimum зажимаются в диапазон так же. Нулевой max остаётся нулём, а у progress он заменяется единицей. Проверка HTML считает ошибкой значение вне границ, нечисловое значение, min больше max и low больше high.

HTML
<meter min="10" max="5" value="7"></meter>

Пример: что получается из неверных записей

Результат

Девять неудачных записей и результат.

Название шкалы: label, aria-label и текст внутри

Чтобы шкала не осталась безымянной, ей дают название через тег label с атрибутом for, через обёртку label или атрибут aria-label. Текст между <meter> и </meter> на странице не виден и название не заменяет: он служит запасным содержимым для очень старых браузеров.

HTML
<label for="fuel">Топливо</label>
<meter id="fuel" value="0.6"></meter>

Пример: где браузер берёт название

Результат

Где браузер берёт название шкалы.

Стилизация тега meter: размер, цвет и вид

Размер задают через width и height, но в родном виде высота полосы внутри тега вдвое меньше высоты самого тега. Цвет не меняют ни accent-color, ни color: у progress первое работает, у meter нет. Вертикальную шкалу даёт writing-mode. Стоит задать background или border, и браузер отказывается от родного вида и рисует упрощённую шкалу со своими цветами. Цвета зон меняют только псевдоэлементы, о них следующий раздел.

CSS
meter {
  width: 100%;
  height: 30px;
}

Пример: размер, цвет и вид

Результат

Что меняется, а что нет.

Псевдоэлементы meter: ::-webkit-meter-bar и ::-webkit-meter-optimum-value

Шкала состоит из трека и заполнения. Трек красят через ::-webkit-meter-bar, а заполнение тремя псевдоэлементами по зонам: ::-webkit-meter-optimum-value для лучшей, ::-webkit-meter-suboptimum-value для средней и ::-webkit-meter-even-less-good-value для худшей. Они работают и без appearance: none. Чтобы трек занял всю высоту тега, ему задают height. Плавность transition: width работает на заполнении при смене значения внутри одной зоны. В Firefox шкалу стилизуют через ::-moz-meter-bar. Селекторы разных браузеров пишут отдельными правилами: запятая объединила бы их, и браузер отбросил бы правило целиком.

CSS
meter {
  appearance: none;
  width: 100%;
}
meter::-webkit-meter-bar {
  height: 16px;
  background: #ddd;
}
meter::-webkit-meter-optimum-value {
  background: #1c9e93;
}

Пример: слои шкалы

Результат

Цвет по зонам, скругление и плавность.

Тег meter и JavaScript: value, min и max

Новое значение записывают в свойство value, а границы в свойства min, max, low, high и optimum. Свойства возвращают уже подогнанные числа, а в атрибуте остаётся записанное. Нечисловая строка вызывает ошибку TypeError. У шкалы нет свойства position, как у progress, зато есть labels со связанными label.

JavaScript
const fuel = document.querySelector("meter");
fuel.value = 80;
console.log(fuel.labels.length);

Пример: свойства и граничные случаи

Результат

Операции над одной шкалой.

Доступность meter: роль meter

Роль meter встроена в тег. Программа чтения с экрана получает название, значение и границы. Если задать aria-valuenow или aria-valuemax, она получит их, а не числа тега, а aria-valuetext даёт словесное описание. Но проверка HTML не допускает aria-valuenow и aria-valuetext у meter, а aria-valuemax считает нежелательным. Цвет зоны в свойствах роли не передаётся, поэтому смысл «мало» или «норма» добавляют словами рядом со шкалой.

HTML
<label>Заряд
  <meter min="0" max="100" value="70"></meter>
</label>
<span>70%, достаточно</span>

Пример: что получает программа чтения

Результат

Что слышит пользователь программы чтения.

Meter и форма: почему шкала не отправляется

Шкала не относится к полям формы: она не входит в form.elements, не попадает в FormData, и у неё нет свойства form. Группа, которую создаёт тег fieldset, с disabled на неё не действует. Число для отправки записывают в отдельное поле, например скрытое.

HTML
<form>
  <input name="a" value="1">
  <meter value="0.3"></meter>
</form>

Пример: что видит форма

Результат

Что видит форма, а что нет.

Атрибуты тега meter

Собственных атрибутов шесть: они отвечают за границы и зоны. Остальные общие для всех тегов. Для проверки HTML обязателен только value.

АтрибутСтатусЧто делаетПример записи
valueдопускаетсяТекущее значение, по умолчанию 0; для проверки HTML обязателенvalue="70"
minдопускаетсяМинимум шкалы, по умолчанию 0min="0"
maxдопускаетсяМаксимум шкалы, по умолчанию 1max="100"
lowдопускаетсяКонец низкой зоны, по умолчанию равен minlow="33"
highдопускаетсяНачало высокой зоны, по умолчанию равно maxhigh="66"
optimumдопускаетсяЛучшее значение, по умолчанию середина диапазонаoptimum="80"
idглобальныйИдентификатор для label и скриптаid="fuel"
classглобальныйКласс для оформленияclass="gauge"
titleглобальныйВсплывающая подсказкаtitle="70%"
nameне существуетШкала не отправляется с формойname="m"
formне существуетШкала не привязывается к формеform="f"
disabledне существуетОтключить шкалу нельзяdisabled
typeне существуетВида у шкалы нетtype="bar"
roleне допускаетсяРоль встроена, проверка HTML отклоняет даже role="meter"role="meter"
aria-valuenowне допускаетсяЗначение уже есть в value, проверка HTML отклоняет дубльaria-valuenow="9"

Вопросы про тег meter: несколько значений и отличие от range

Оба вопроса про случаи, когда одной шкалы мало или нужен ползунок: что делать с несколькими значениями и чем шкала отличается от range.

Как показать на шкале несколько значений сразу?

Один тег показывает одно значение. Для частей целого, например фото, видео и прочего на диске, берут несколько тегов meter с отдельными названиями. Если нужна одна полоса из цветных участков, её рисуют из блоков и описывают через role="img" и aria-label: получится картинка с текстовым описанием.

HTML
<label>Фото <meter max="100" value="40"></meter></label>
<label>Видео <meter max="100" value="25"></meter></label>

Пример: три шкалы и сборная полоса

Результат

Три шкалы или одна сборная полоса.

Чем meter отличается от input type="range"?

Ползунок двигает пользователь: он получает фокус, у него роль slider, и его значение уходит в форму. Шкала meter только показывает значение, фокус не получает и в форму не попадает.

HTML
<input type="range" name="v" min="0" max="100" value="40">

Пример: шкала и ползунок

Результат

Шкала и ползунок: что можно сделать с каждым.

Частые ошибки с тегом meter

Одни ошибки ломают сам тег, другие дают странный цвет шкалы, и вторые заметить труднее.

ОшибкаЧто происходитКак исправить
Не закрыть </meter>Весь следующий текст оказывается внутри шкалы и пропадает с экранаВсегда писать закрывающий тег
Брать meter для хода загрузкиШкала красится зонами, а роль не передаёт, что работа идётИспользовать progress
Не задать low и highЗона одна, шкала всегда зелёнаяУказать обе границы зон
Указать optimum около максимума для заполненности дискаПолный диск красится зелёнымДля такой шкалы optimum около нуля
Нарушить порядок min, low, high, maxГраницы подгоняются друг к другу, шкала теряет смыслСоблюдать порядок от меньшего к большему
Записать value="20%" или число вне границЗнак процента даёт ноль, лишнее число обрезаетсяЗаписывать число без знака внутри диапазона
Красить через accent-color или colorСвойства на шкалу не действуютИспользовать псевдоэлементы зон
Вложить в meter другой meter или блокЗапись отклоняется при проверке HTML, вложенный тег остаётся в разметкеПисать внутри только текст
Не дать шкале названиеПрограмма чтения читает роль и число без смыслаИспользовать label или aria-label
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×