Menu

Радиокнопка в HTML: группы, выбор по умолчанию и стили

Как работают радиокнопки в HTML: группировка через атрибут name, выбор по умолчанию через checked, обязательные группы, чтение выбранного значения в JavaScript, поведение клавиатуры и оформление в виде своих кружков или карточек.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Как сделать радиокнопки в HTML

Радиокнопки позволяют читателю выбрать ровно один вариант из группы. Каждый вариант это <input type="radio">, а одинаковый name и делает их группой. Выберите размер и нажмите Order:

Форма отправляет одну пару, size=m: name группы и value выбранной кнопки. Из чего это состоит:

  • Одинаковый name у всех кнопок группы. Выбор одной снимает выбор с остальных.
  • Разный value у каждой. Именно его получает сервер. Радиокнопка без value отправляет on, что серверу ничего не говорит.
  • checked у варианта по умолчанию.
  • <label> вокруг каждой кнопки, чтобы текст был кликабельным, и <fieldset> с <legend>, чтобы программы чтения с экрана объявляли вопрос («Size») вместе с каждым вариантом.

Группу создает name

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

Кликните по всем трем в сломанной группе: все они остаются выбранными, и ни одну нельзя снова выключить, то есть худшее от обоих вариантов. Радиокнопки группируются по name внутри одной формы, поэтому в двух формах может быть по собственной группе name="size".

Обязательные группы и отсутствие выбора по умолчанию

required у любой радиокнопки группы означает, что перед отправкой формы нужно выбрать одну из них. Если не ставить checked, читателю придется выбрать самому, и это правильно, когда разумного варианта по умолчанию нет:

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

Клик может выбрать радиокнопку, но никогда не снимает выбор. Если после выбора должна оставаться возможность «без ответа», добавьте для этого отдельный вариант.

Выбранное значение в JavaScript

form.elements.name возвращает всю группу, а ее .value это значение выбранной радиокнопки (пустая строка, если ничего не выбрано). Событие change срабатывает у радиокнопки, которая стала выбранной:

Обработчик стоит на форме, поэтому ловит изменение любого ее поля. Вне формы найдите выбранную радиокнопку через document.querySelector('input[name="period"]:checked').

Поведение клавиатуры

Группа радиокнопок это одна остановка в порядке Tab. Tab переводит фокус в группу, на выбранную радиокнопку (или на первую, если ничего не выбрано), а стрелки перемещают выбор между вариантами. Следующий Tab выводит из группы. Это работает само собой у настоящих радиокнопок с общим name, и это еще одна причина не собирать радиокнопки из элементов <div>.

Оформление радиокнопок

accent-color перекрашивает стандартную радиокнопку. appearance: none позволяет нарисовать собственный кружок. А поскольку скрытую радиокнопку все равно можно выбрать через ее label, группа может выглядеть как набор карточек и сохранять все поведение радиокнопок:

Свой кружок в выбранном состоянии это просто толстая рамка. Карточки скрывают поле через opacity: 0, а не display: none, поэтому оно остается доступным для фокуса и стрелки продолжают работать, а :has(input:checked) оформляет выбранную карточку. :has() работает в современных Chrome, Firefox и Safari.

Радиокнопка, чекбокс или select?

Что использоватьКогда
РадиокнопкиОдин выбор из нескольких вариантов (примерно от 2 до 6), которые должны быть видны все сразу
ЧекбоксыЛюбое количество вариантов, включая ни одного
<select>Один выбор из длинного списка, например стран (см. select в HTML)

Частые ошибки

  • Разные name в одной группе. Можно выбрать каждую радиокнопку, и ни одну нельзя сбросить.
  • Нет value. Сервер получает on, что бы ни было выбрано.
  • Поле скрыто через display: none в своем дизайне. На нем больше нельзя сфокусироваться, и им нельзя пользоваться с клавиатуры.
  • Нет <fieldset> и <legend>. Программы чтения с экрана объявляют «Small, радиокнопка» без вопроса, к которому это относится.
  • Одна радиокнопка для флажка «Я согласен». С нее никогда нельзя снять выбор; используйте чекбокс.
  • checked у нескольких радиокнопок одной группы. Выбранной в итоге оказывается только последняя.

Часто задаваемые вопросы

Как сделать радиокнопки в HTML?

Напишите по одному <input type="radio"> на каждый вариант, дайте им всем одинаковый name и разные value и поместите каждый в <label>: <label><input type="radio" name="size" value="m"> Medium</label>. Общее имя объединяет их в одну группу, где можно выбрать только один вариант.

Почему можно выбрать несколько радиокнопок?

У кнопок разный name. Радиокнопки образуют группу только при одинаковом name (в одной форме), и в каждой группе можно выбрать только одну кнопку.

Как получить значение выбранной радиокнопки в JavaScript?

Используйте form.elements.size.value, где size это имя группы; оно возвращает значение выбранной кнопки или пустую строку, если ничего не выбрано. Без формы: document.querySelector('input[name="size"]:checked')?.value.

Как задать радиокнопку по умолчанию?

Добавьте checked одной кнопке группы: <input type="radio" name="plan" value="free" checked>. Если он есть у нескольких, побеждает последняя.

Можно ли снять выбор с радиокнопки?

Кликом нельзя: клик только выбирает. Добавьте вариант «Нет», сбросьте форму или присвойте в JavaScript button.checked = false. Если выбор должен быть необязательным и отменяемым, лучше подойдет чекбокс или select.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ