Menu

Кнопка в HTML: типы, submit, неактивное состояние и стили

Как сделать кнопку в HTML элементом <button>: три типа (submit, button, reset), отправка значения вместе с формой, неактивные кнопки, иконки и стили CSS, которые сохраняют рамку фокуса.

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

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

Кнопка это элемент <button>. Содержимое между тегами это то, что видит пользователь, а type="button" говорит, что кнопка запускает ваш скрипт, а не отправляет форму. Кликните по ней в превью:

Больше рабочей кнопке ничего не нужно: подпись, type и что-то, что слушает click. Браузер делает ее доступной для фокуса с клавиатуры и нажимает ее по Enter или Space, так что пользователи клавиатуры получают все это без дополнительного кода. <div> с обработчиком клика не получает ничего из этого.

Можно встретить и onclick="...", написанный прямо в теге. Это работает, но addEventListener держит скрипт отдельно от разметки и позволяет нескольким обработчикам делить одну кнопку.

Три типа кнопок

Атрибут type определяет, что делает кнопка при нажатии.

typeЧто делаетДля чего
submitОтправляет форму, к которой относится. Это значение по умолчанию.Главное действие формы
buttonСама ничего не делает; решает ваш JavaScriptПереключатели, диалоги, счетчики, все, что работает на скриптах
resetВозвращает все поля формы к начальным значениямРедко; пользователи нажимают ее по ошибке

Введите что-нибудь и попробуйте каждую кнопку. Превью не уходит со страницы при отправке формы; оно показывает данные, которые отправила бы форма.

Reset восстанавливает значение, записанное в HTML (Ada), а не пустое поле. А если удалить type="button" у Uppercase, она станет кнопкой отправки: переведет имя в верхний регистр и затем отправит форму.

Кнопка отправки: отправка name и value

У кнопки отправки могут быть собственные name и value. Они отправляются с формой, только если форму отправила именно эта кнопка, поэтому две кнопки могут делить одну форму и сообщать серверу, какое действие выбрано:

Нажмите Publish, и форма отправит title=My first post и action=publish. Очистите заголовок и нажмите любую кнопку: required остановит отправку, и браузер покажет свое сообщение. Нажатие Enter в текстовом поле тоже отправляет форму, и браузер считает это нажатием первой кнопки отправки, поэтому отправляется action=draft.

Кнопки отправки также принимают атрибуты, которые переопределяют форму для одной этой кнопки: formaction (другой URL), formmethod, formtarget и formnovalidate, который пропускает валидацию. formnovalidate обычно ставят кнопке «Сохранить черновик», которая должна работать, пока обязательные поля еще пустые.

Кнопка, стоящая вне своей формы, все равно может ее отправить через атрибут form, который принимает id формы: <button type="submit" form="signup">Sign up</button>.

Неактивные кнопки

Атрибут disabled выключает кнопку. Неактивная кнопка игнорирует клики, пропускается при переходе по Tab и не отправляется с формой. Браузеры также делают ее серой. Частый прием: держать кнопку отправки неактивной, пока не выполнено условие:

В JavaScript button.disabled это логическое свойство: присваивайте ему true или false. В HTML важно наличие атрибута, поэтому disabled="false" все равно отключает кнопку.

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

Стили кнопки через CSS

Браузеры рисуют кнопки своим шрифтом, рамкой и фоном. Несколько свойств заменяют все это. Сохраняйте видимый стиль фокуса: по нему пользователи клавиатуры видят, где находятся.

Для чего каждое правило:

  • font: inherit заставляет кнопку использовать шрифт страницы. Без него кнопки используют собственный, более мелкий шрифт форм браузера (13.33px в Chrome и Firefox).
  • cursor: pointer показывает курсор в виде руки. По умолчанию у кнопок обычная стрелка.
  • :hover, :active и :focus-visible оформляют состояния указателя, нажатия и фокуса с клавиатуры. :focus-visible показывает рамку при фокусе с клавиатуры, но не после клика мышью, поэтому убирать outline, чтобы ее избежать, не нужно.
  • :disabled выбирает кнопки с атрибутом disabled.

Нажмите Tab в превью, чтобы увидеть, как янтарная рамка фокуса переходит между первыми двумя кнопками. Неактивная пропускается. (На Mac Safari и Firefox переходят по Tab к кнопкам, только если в системных настройках включена навигация с клавиатуры; в Safari без нее работает Option+Tab.) Полный список состояний есть на странице hover в CSS.

Кнопки с иконками

<button> может содержать HTML, поэтому иконка ставится внутрь рядом с текстом. У кнопки только с иконкой нет текста, который могла бы объявить программа чтения с экрана, поэтому дайте ей aria-label:

aria-hidden="true" у SVG исключает его из дерева доступности, поэтому первая кнопка объявляется как «Add item, кнопка», а вторая как «Delete, кнопка».

button или input type="submit"

<input type="submit"> это более старый способ написать кнопку отправки. Оба отправляют форму одинаково; разница в том, что они могут содержать.

<input type="submit" value="Send">   <!-- label comes from value, text only -->
<button type="submit">Send</button>  <!-- label is the content, HTML allowed -->
<button><input type="submit">
ПодписьСодержимое между тегамиАтрибут value
Может содержать иконки или разметкуДаНет
Закрывающий тегОбязателенНет (пустой элемент)
Тип по умолчаниюsubmitВсегда отправка

Используйте <button>. Единственная причина оставить <input type="submit"> это существующий CSS или JavaScript, который его выбирает. Есть также <input type="button"> и <input type="reset">, та же идея для двух других типов.

Кнопка или ссылка?

Кнопка что-то делает на текущей странице: отправляет, открывает, переключает, удаляет. Ссылка ведет на другой URL. Если клик меняет адресную строку, это должен быть <a href>, оформленный как кнопка, если того требует дизайн. Этот прием и то, почему кнопка внутри ссылки некорректна, описаны на странице кнопка как ссылка в HTML.

Доступность

  • Используйте настоящий <button>. Он получает фокус, работает с Enter и Space и объявляется как кнопка. Чтобы воссоздать это на <div>, нужны role, tabindex и обработчики клавиш, и результат обычно все равно неполный.
  • У каждой кнопки должно быть имя: ее текст или aria-label, если у нее только иконка.
  • Сохраняйте видимый стиль фокуса. outline: none без замены оставляет пользователей клавиатуры без ориентира.
  • Делайте кнопку достаточно большой, чтобы в нее было легко попасть. WCAG 2.2 требует не меньше 24 на 24 пикселя CSS; отступы, как в примере со стилями выше, дают высоту около 40 пикселей.
  • Для переключателя добавьте aria-pressed="true" или "false" и обновляйте его при смене состояния.

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

  • Кнопка в форме без type. Она отправляет форму. Пишите type="button" у каждой кнопки, которая не должна отправлять форму.
  • Кнопка внутри ссылки, <a href="/x"><button>Go</button></a>. Это некорректный HTML, и в разных браузерах он ведет себя по-разному. Используйте один элемент: ссылку, оформленную как кнопка.
  • <div onclick> в роли кнопки. До него нельзя добраться с клавиатуры.
  • Удаленная рамка фокуса без стиля :focus-visible взамен.
  • disabled="false" в расчете на активную кнопку. Удалите атрибут.
  • Забытый font: inherit, после чего непонятно, почему у кнопок другой шрифт, чем у остальной страницы.

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

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

Напишите <button type="button">Click me</button>. Текст между тегами это подпись кнопки. Добавьте обработчик click в JavaScript, чтобы она что-то делала, или поместите ее в <form> с type="submit", чтобы она отправляла форму.

Какой тип у кнопки HTML по умолчанию?

submit. <button> без атрибута type внутри формы отправляет эту форму при клике, поэтому обычная кнопка в форме может перезагружать страницу. Для любой кнопки, которая запускает JavaScript, пишите type="button".

Чем button отличается от input type=submit?

Оба отправляют форму. <button> может содержать HTML (иконку, жирный текст) между тегами, а <input type="submit"> берет подпись из атрибута value и может содержать только обычный текст. В большинстве современного кода используют <button>.

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

Добавьте атрибут disabled: <button disabled>Save</button>. По неактивной кнопке нельзя кликнуть, на ней нельзя сфокусироваться, и ее name и value не отправляются с формой. Уберите атрибут (btn.disabled = false в JavaScript), чтобы снова ее включить.

Как сделать, чтобы кнопка HTML вела на другую страницу?

Используйте ссылку, оформленную как кнопка: <a href="/pricing" class="btn">See pricing</a>. <button> нужен для действий на текущей странице. Кнопка внутри <a> это некорректный HTML.

Почему кнопка перезагружает страницу?

Она находится внутри <form> и у нее нет type, поэтому это кнопка отправки, и браузер отправляет форму и загружает ответ. Добавьте ей type="button" или вызовите event.preventDefault() в обработчике submit, если обрабатываете форму через JavaScript.

Coddy programming languages illustration

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

НАЧАТЬ