Тег fieldset в HTML: что это, legend и disabled

Тег fieldset (от английского field set, «набор полей») объединяет связанные поля формы в одну группу. Браузер рисует вокруг группы рамку, программы чтения с экрана воспринимают её как группу, а атрибут disabled у fieldset отключает сразу все поля внутри. Заголовок группы задаёт тег legend, он записывается первым, а закрывающий тег </fieldset> обязателен.

Группа работает внутри тега form, объединяет поля из тега input и других тегов, а надписи к полям задаёт тег label. Основы разобраны в уроке «Группировка полей формы в HTML: тег fieldset».

HTML
<fieldset>
  <legend>Получение</legend>
  <label><input type="radio" name="delivery" value="courier"> Курьер</label>
  <label><input type="radio" name="delivery" value="post"> Почта</label>
</fieldset>

Тег fieldset в HTML: что это и для чего нужен

Группа нужна для трёх целей. Визуально рамка отделяет связанные поля от остальных. Для программ чтения с экрана поля внутри fieldset относятся к одной группе, и она получает название. Технически одним атрибутом disabled отключается всё содержимое. Рамка по умолчанию зависит от браузера и системы, а оформляется обычными свойствами CSS. Тег записывают чаще всего внутри form, но обязательным это не является.

HTML
<fieldset>
  <legend>Контакты</legend>
  <input name="email" type="email">
  <input name="phone" type="tel">
</fieldset>

Пример: группа полей с fieldset и без него

Результат

Выберите запись и отметьте переключатель: под результатом рамка и состояние группы.

Заголовок группы: legend внутри fieldset

Заголовок группы задаёт legend. Он записывается первым внутри fieldset, и браузер размещает его на верхней рамке. У него две роли: он служит названием группы для программ чтения, а поля внутри первого legend остаются доступными, когда группа отключена. Внутри допустимы текст, строчные теги, поле формы и заголовок h3.

HTML
<fieldset disabled>
  <legend><label><input type="checkbox" name="on"> Включить</label></legend>
  <input name="city">
</fieldset>

Пример: заголовок и поле в legend

Результат

Выберите запись: под результатом состояние полей группы.

Атрибут disabled: отключение всех полей группы

Атрибут disabled отключает все поля внутри группы: input, select, textarea и button. Исключение: поля в первом legend. У отключённого поля селектор :disabled совпадает, а собственное свойство disabled остаётся false, поэтому скрипт, читающий свойство поля, отключения не увидит. Атрибут булев: disabled="false" группу всё равно отключает, а снять отключение можно, удалив атрибут или присвоив fieldset.disabled = false. Отключённые поля не получают клики и в данные формы не попадают. Ссылка a полем формы не является и работает как обычно. Вложенный fieldset отключается вместе с внешним.

HTML
<fieldset disabled>
  <legend>Адрес</legend>
  <input name="city">
  <button type="button">Кнопка</button>
</fieldset>

Пример: что отключает disabled

Результат

Выберите запись и кликните по кнопке и ссылке: под результатом состояние полей и число кликов.

Атрибуты name и form: что даёт fieldset форме

Атрибут name у fieldset в данные формы не попадает: на сервер уходят только значения полей. Зато сам fieldset входит в form.elements, и form.elements.address возвращает его. Атрибут form связывает с формой сам fieldset, записанный вне неё, но поля внутри форму от него не получают: каждому полю нужен свой form. Подробнее об атрибуте у полей: атрибут form у поля.

HTML
<form id="order"></form>
<fieldset name="address" form="order">
  <input name="city" form="order">
</fieldset>

Пример: name, form и данные формы

Результат

Выберите запись: под результатом связь с формой и данные.

Вложенные fieldset и допустимое содержимое

Внутри fieldset допустим обычный контент страницы: текст, div, абзацы, таблицы и вложенные fieldset. Вложенность удобна для сложных форм: внешняя группа «Адрес» и внутренняя «Индекс». Отключение внешней группы действует и на вложенную. Сам fieldset нельзя записывать внутри p: браузер закрывает абзац перед группой, а закрывающий </p> создаёт лишний пустой абзац. Проверка HTML в этом случае сообщает об ошибке.

HTML
<fieldset>
  <legend>Адрес</legend>
  <fieldset>
    <legend>Индекс</legend>
    <input name="zip">
  </fieldset>
</fieldset>

Пример: вложенные группы и fieldset внутри p

Результат

Выберите запись: под результатом родитель группы и число абзацев.

Тег fieldset и JavaScript: elements, disabled и проверка

Список полей группы возвращает fieldset.elements: в него входят поля, кнопки, select, output, вложенные fieldset и поля внутри legend, а обычные теги вроде span не входят. Свойство type у fieldset всегда равно fieldset, а disabled читает и меняет атрибут. Отключённая группа в проверке формы не участвует: required у полей внутри не проверяется, и form.checkValidity() возвращает true. Сам fieldset проверяемым не бывает: willValidate равен false.

JavaScript
const form = document.querySelector("form");
const fieldset = document.querySelector("fieldset");
console.log(fieldset.elements.length);
fieldset.disabled = true;
console.log(form.checkValidity());

Пример: elements, type, disabled и проверка

Результат

Выберите запись: под результатом ответ скрипта.

CSS для fieldset: рамка, отступы и flex

Рамку, отступы и заголовок оформляют обычными свойствами: border, border-radius и padding. Чтобы убрать рамку, а смысловую группу сохранить, пишут border: 0; padding: 0; margin: 0. Для расположения полей fieldset принимает display: flex и display: grid, а заголовок остаётся на рамке. Состояния группы описывают селекторы fieldset:disabled и fieldset:has(:invalid).

CSS
fieldset {
  border: 1px solid #1c9e93;
  border-radius: 8px;
  padding: 12px;
}
fieldset:disabled {
  opacity: 0.5;
}

Пример: рамка, flex, grid и :has()

Результат

Выберите стиль: под результатом вычисленные display и рамка.

Доступность fieldset: название группы и radiogroup

У fieldset неявная роль group, а название берётся из legend. Приоритет такой: aria-labelledby главнее aria-label, а он главнее legend. Без legend и других подписей группа остаётся без названия. Для группы переключателей допустима роль radiogroup, а другие роли вроде menu проверка HTML считает ошибкой. Если у блока переключателей есть вопрос, его записывают в legend: без него программа чтения зачитывает варианты без вопроса.

HTML
<fieldset aria-label="Способ">
  <legend>Получение</legend>
  <label><input type="radio" name="d"> Курьер</label>
</fieldset>

Пример: откуда берётся название группы

Результат

Выберите запись: под результатом роль и название группы.

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

У fieldset три собственных атрибута и глобальные. Отдельно отмечены атрибуты, которых у fieldset нет: часть из них знакома по полям формы, но проверка HTML сообщает об ошибке.

АтрибутСтатусЧто делаетПример записи
disabledактуаленОтключает все поля внутри, кроме полей в первом legenddisabled
formактуаленid формы, с которой связан сам fieldset, поля внутри форму не получаютform="order"
nameактуаленНазвание группы для form.elements, на сервер не уходитname="address"
classглобальныйКласс для оформленияclass="group"
idглобальныйИдентификатор группы, например для aria-labelledbyid="delivery"
titleглобальныйВсплывающая подсказкаtitle="Получение"
roleглобальныйДопустимы group, radiogroup, presentation и nonerole="radiogroup"
valueне существуетУ группы нет значенияvalue="1"
typeне существуетТип у группы не задаютtype="radio"
readonlyне существуетЗапрет правки задают у самих полейreadonly
placeholderне существуетПодсказку задают полюplaceholder="Адрес"

Вопросы про тег fieldset: переключатель группы и ширина

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

Как отключить группу полей, но сохранить один рабочий переключатель?

Переключатель помещают в первый legend, а группу включают из скрипта. Поле внутри legend вместе с группой не отключается, поэтому флажок остаётся доступным, а обработчик change добавляет и убирает атрибут disabled у fieldset. Флажок внутри самой группы после отключения включить не сможет.

HTML
<fieldset disabled>
  <legend>
    <label><input type="checkbox"> Нужен курьер</label>
  </legend>
  <input name="city" placeholder="Город">
</fieldset>

Пример: флажок в legend, в группе и снаружи

Результат

Выберите запись и отметьте флажок: под результатом состояние флажка и поля.

Почему fieldset выступает за границы узкого контейнера?

У fieldset по умолчанию задан min-width: min-content: группа не сужается меньше ширины содержимого. Если внутри широкое поле, рамка становится шире контейнера. Исправляют это значением min-width: 0 у fieldset и max-width: 100% у поля.

CSS
fieldset {
  min-width: 0;
}
input {
  max-width: 100%;
}

Пример: ширина группы в узком контейнере

Результат

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

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

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

ОшибкаЧто происходитКак исправить
Блок переключателей без fieldset и legendПрограмма чтения зачитывает варианты без вопросаОбернуть группу в fieldset и записать вопрос в legend
legend не первым или второй legendЗапись недопустима, проверка HTML сообщает об ошибкеЗаписать один legend первым
Блочный тег, например div, внутри legendЗапись недопустима, проверка HTML сообщает об ошибкеИспользовать текст, span или заголовок
fieldset внутри pАбзац закрывается перед группой, появляется лишний пустой абзацЗаменить p на div
disabled="false" для включения группыБулев атрибут действует по наличию, группа остаётся отключённойУдалить атрибут или присвоить fieldset.disabled = false
Расчёт на то, что name у fieldset уйдёт на серверВ данные попадают только значения полейДать name самим полям
form только у fieldsetПоля внутри форму не получают и не отправляютсяУказать form у каждого поля или записать группу внутри form
disabled там, где значения нужно отправитьОтключённые поля в данные не попадаютИспользовать readonly у текстовых полей
Флажок, который включает группу, записан внутри этой группыОн отключается вместе с группой, и включить её нечемПоместить выключатель в первый legend или вне группы
Категория
Поделиться в социальных сетях

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

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

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

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

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