Как сделать чекбокс в HTML
Чекбокс это <input type="checkbox">. Поместите его внутрь <label> вместе с текстом, чтобы клик по тексту тоже переключал флажок. Отметьте один или оба флажка и нажмите Save, чтобы увидеть, что отправляет форма:
В исходном состоянии форма отправляет только updates=on. Это объясняют два правила:
- Отмеченный флажок отправляет
name=value. У второго флажка нетvalue, поэтому он отправляет значение по умолчанию,on. - Неотмеченный флажок не отправляет вообще ничего. Ни
newsletter=no, ни пустого значения: имени просто нет в данных.
checked в HTML задает начальное состояние. Как и у любого логического атрибута, важно его наличие: checked="false" все равно отмечает флажок.
Атрибуты чекбокса
| Атрибут | Что делает |
|---|---|
name | Ключ, который отправляется, когда флажок отмечен |
value | Что отправляется, когда флажок отмечен (по умолчанию on) |
checked | Флажок отмечен при загрузке страницы |
required | Форма не отправится, пока флажок не отмечен |
disabled | Флажок нельзя переключить, и он не отправляется |
Группа чекбоксов
Для выбора «любых из этих» дайте всем флажкам одинаковый name и разные value. Оберните их в <fieldset> с <legend>, чтобы у группы было название:
Форма отправляет topic=html и topic=css: одно и то же имя дважды. Большинство серверных фреймворков умеют читать это как список. Исключение составляет PHP: он оставляет только последнее значение, если имя не заканчивается скобками, name="topic[]". В JavaScript new FormData(form).getAll('topic') возвращает ['html', 'css'].
Отправка значения, когда флажок не отмечен
Когда серверу нужно явное «нет», поставьте перед чекбоксом скрытое поле с тем же именем. Если флажок не отмечен, отправляется только скрытое значение; если отмечен, отправляются оба, и сервер берет последнее:
Нажмите Continue: форма не отправится, пока не отмечен флажок условий, потому что он required. Затем она отправит marketing=no и terms=accepted, или marketing=no, marketing=yes и terms=accepted, если отмечен первый флажок. Такие фреймворки, как Rails, генерируют ровно эту пару со скрытым полем. Прежде чем на это полагаться, проверьте, как ваш сервер читает повторяющееся имя.
«Выбрать все» и состояние indeterminate
У чекбокса есть третий вид, черточка, для состояния «некоторые, но не все». Оно существует только в JavaScript: задайте box.indeterminate = true. Флажок «выбрать все» использует его, когда отмечена часть флажков, которыми он управляет:
indeterminate меняет только внешний вид (и то, что объявляют программы чтения с экрана: «смешанное» или «частично отмечен»). Под ним флажок по-прежнему либо отмечен, либо нет, и именно это отправляет форма. Клик по флажку в состоянии indeterminate убирает черточку и переключает его.
Чтобы реагировать на чекбокс, используйте событие change, а его состояние читайте из box.checked. box.value при переключении не меняется.
Оформление чекбоксов
Быстрее всего изменить accent-color: оно перекрашивает стандартный чекбокс и сохраняет все его поведение. Для совсем другого вида appearance: none убирает стандартную отрисовку и позволяет оформлять поле как любой блок:
Свой флажок остается настоящим чекбоксом: он переключается по клику и Space, отправляется с формой и объявляется как чекбокс. Рисуйте его через :checked и сохраняйте стиль :focus-visible, потому что без стандартной отрисовки рамки фокуса нет, если вы не добавили ее сами.
Переключатель
Переключатель это чекбокс, который означает «включено/выключено прямо сейчас», а не «включить в выбор». Нарисуйте его через appearance: none и добавьте role="switch", чтобы программы чтения с экрана объявляли переключатель во включенном или выключенном состоянии, а не отмеченный чекбокс:
inset-inline-start отсчитывает положение ручки от начала строки, поэтому на страницах с письмом справа налево переключатель, как и положено, сдвигается в другую сторону. Для сгруппированного выбора «да/нет», где можно выбрать только один вариант, см. радиокнопка в HTML.
Частые ошибки
- Ожидание
falseот неотмеченного флажка. Ничего не отправляется. На сервере считайте отсутствующее имя значением «выключено» или добавьте скрытое поле. checked="false". Флажок все равно отмечен. Удалите атрибут.- Чекбокс без подписи или с текстом рядом, который не является
<label>. Маленький квадрат становится единственной целью для клика, а программы чтения с экрана объявляют «чекбокс» без названия. См. label в HTML. - Забытый
value, из-за чего каждый флажок в группе отправляетon, и сервер не может их различить. - Чтение
box.value, чтобы узнать, отмечен ли флажок. Используйтеbox.checked. - Чекбоксы для выбора «одного из». Для этого есть радиокнопки.
Часто задаваемые вопросы
Как сделать чекбокс в HTML?
Используйте <input type="checkbox"> внутри label: <label><input type="checkbox" name="terms" value="yes"> I agree</label>. Label делает кликабельным и текст.
Как сделать чекбокс отмеченным по умолчанию?
Добавьте атрибут checked: <input type="checkbox" name="news" checked>. Важно само наличие атрибута, поэтому checked="false" все равно отмечает флажок. В JavaScript присвойте box.checked = true или false.
Какое значение отправляет неотмеченный чекбокс?
Никакого. Неотмеченный чекбокс полностью исключается из отправляемых данных. Отмеченный отправляет свой value или on, если value нет. Если серверу нужно явное «нет», поставьте перед чекбоксом скрытое поле с тем же именем.
Как получить значение чекбокса в JavaScript?
Читайте box.checked, это true или false. box.value это значение, которое он отправил бы, и оно не меняется, отмечен флажок или нет. Чтобы реагировать на переключение, слушайте событие change.
Как изменить цвет чекбокса?
Задайте ему accent-color: input[type=checkbox] { accent-color: #16a34a; }. Для полностью своего вида задайте appearance: none и нарисуйте квадрат и галочку сами через CSS.