<button> против <input type = "button" />. Что использовать?

При просмотре большинства сайтов (включая SO) большинство из них используют:

<input type = "button" />

вместо:

<button></button>
  • Каковы основные различия между ними, если таковые имеются?
  • Есть ли веские причины использовать одно вместо другого?
  • Есть ли веские причины использовать их вместе?
  • При использовании <button> возникают проблемы с совместимостью, поскольку он не очень широко используется?

Ссылаясь на документация от октября 2020 г .: While <input> elements of type button are still perfectly valid HTML, the newer <button> element is now the favored way to create buttons. Given that a <button>’s label text is inserted between the opening and closing tags, you can include HTML in the label, even images.

Jakob 15.10.2020 15:58

@Jakob Я понимаю, что MDN - достойный справочник, но я не смог найти аналогичные рекомендации в спецификации HTML5 или каких-либо RFC-подобных документах.

wlnirvana 24.03.2021 16:33
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1 722
2
627 120
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Цитировать

Important: If you use the button element in an HTML form, different browsers will submit different values. Internet Explorer will submit the text between the <button> and </button> tags, while other browsers will submit the content of the value attribute. Use the input element to create buttons in an HTML form.

От: http://www.w3schools.com/tags/tag_button.asp

Если я правильно понимаю, ответ - совместимость и согласованность ввода от браузера к браузеру.

@Hawken Эта страница была написана идиотами, которые думали, что W3Schools выдавал себя за W3C. На самом деле W3Schools не лучше и не хуже тысяч других сайтов, которые обрабатывают такие материалы.

Mr Lister 16.04.2012 13:36

на самом деле, это зависит от версии IE и режима IE - w3schools обновила информацию, так как цитата

Damien 03.05.2012 17:53

@MrLister Я разговаривал с людьми, которые думают, что W3Schools связан с W3C. Хотя я не уверен, что согласен с «обязанностью W3Fools предоставлять точную информацию», я действительно думаю, что точность W3Schools оставляет желать лучшего, и что ее критики не обязательно идиоты. (Я многому научился у W3S, когда он был хорош; он не соответствовал стандартам.)

Marnen Laibow-Koser 25.12.2012 08:06

@MrLister W3Schools - это, пожалуй, наиболее часто используемый неофициальный источник технической информации в Интернете. И качество действительно отстой. Почему бы не выделить их? А какие детали ошиблись в W3Fools? Мне там все кажется правильным.

Marnen Laibow-Koser 25.12.2012 20:53

эта статья, кажется, предлагает довольно хороший обзор разницы.

Со страницы:

Buttons created with the BUTTON element function just like buttons created with the INPUT element, but they offer richer rendering possibilities: the BUTTON element may have content. For example, a BUTTON element that contains an image functions like and may resemble an INPUT element whose type is set to “image”, but the BUTTON element type allows content.

The Button Element - W3C

Цитата Страница форм в руководстве HTML:

Buttons created with the BUTTON element function just like buttons created with the INPUT element, but they offer richer rendering possibilities: the BUTTON element may have content. For example, a BUTTON element that contains an image functions like and may resemble an INPUT element whose type is set to "image", but the BUTTON element type allows content.

Ответ принят как подходящий
  • Вот страница, описывающий различия (в основном вы можете поместить html в <button></button>)
  • И еще одна страница, описывающий, почему люди избегают <button></button> (Подсказка: IE6)

Еще одна проблема IE при использовании <button />:

And while we're talking about IE, it's got a couple of bugs related to the width of buttons. It'll mysteriously add extra padding when you're trying to add styles, meaning you have to add a tiny hack to get things under control.

Этот ответ был в 2009 году, поскольку IE6 мертв, я полагаю, нет причин не использовать <button> сейчас?

Rosdi Kasim 26.02.2013 15:06

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

Jared 15.08.2013 05:33

Согласно Microsoft Страница обратного отсчета IE6, использование IE6 в Китае по-прежнему составляет (по состоянию на январь 2014 года) около 22%. ie6death.com отмечает, что поддержка IE6 заканчивается 8 апреля 2014 года.

BryanH 19.01.2014 03:33

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

jinglesthula 12.04.2014 01:48

Еще одно отмеченное отличие состоит в том, что элемент кнопки немного более семантичен, чем использование элемента ввода (по крайней мере, в том, что вам не нужно начинать сканирование неупорядоченного набора атрибутов в поисках `` типа '', чтобы увидеть, что это не одна из других форм элементы управления, хотя вам все равно нужно сделать это, чтобы различать type = button | submit).

jinglesthula 12.04.2014 01:51
<button /> также имеет атрибут form (и связанные атрибуты), поэтому его можно связать с формами в других частях тела документа.
Gup3rSuR4c 08.10.2014 03:29

Используйте кнопку из элемента ввода, если вы хотите создать кнопку в форме. И используйте тег кнопки, если хотите создать кнопку для действия.

Для сценариев на стороне клиента. <input type = "button"> не работает в HTML.

iGEL 03.03.2012 17:40

Внутри элемента <button> вы можете помещать контент, например текст или изображения.

<button type = "button">Click Me!</button> 

В этом разница между этим элементом и кнопками, созданными с помощью элемента <input>.

+1, поскольку <input /> действительно является пустым элементом, а <button> - нет.

Sebastian 03.05.2014 20:33

Как примечание, <button> будет неявно отправлять, что может вызвать проблемы, если вы хотите использовать кнопку в форме без отправки. Таким образом, еще одна причина использовать <input type = "button"> (или <button type = "button">)

Редактировать - подробнее

Без типа button неявно получает тип submit. Неважно, сколько кнопок отправки или полей ввода есть в форме, любая из них, которая явно или неявно введена как submit, при нажатии отправит форму.

Есть 3 поддерживаемых типа кнопки

submit ||  "submits the form when clicked (default)"
reset  ||  "resets the fields in the form when clicked"
button ||  "clickable, but without any event handler until one is assigned"

вы можете добавить больше деталей? что будет, если есть несколько кнопок? это делает только type = 'submit'?

Simon_Weaver 28.12.2012 07:46

О, дорогой W3C, почему submit по умолчанию, когда 99,9% форм содержат много button с одинsubmit ?!

kbtz 04.04.2014 00:11

Многие формы также имеют только одну кнопку - отправить. Полагаю, мне пришлось вызвать так или иначе.

jinglesthula 12.04.2014 01:54

Это может быть БОЛЬШОЙ промах! Мой тестовый код отправляется примерно в 80% случаев, в противном случае он обрабатывался как обычная кнопка. ОБЯЗАТЕЛЬНО при использовании <button> в <form>

Sydwell 02.06.2015 15:13

@ mik01aj "Неважно, сколько кнопок отправки или полей ввода есть в форме, любая из них, которая явно или неявно введена как отправка, при нажатии отправит форму." Разве это не очевидно? Любая кнопка отправки должна отправить форму. Зачем это говорить? Что мне не хватает?

Concrete Gannet 06.06.2017 03:46

<button> гибок в том смысле, что он может содержать HTML. Более того, с помощью CSS намного проще стилизовать, и стили фактически применяются во всех браузерах. Однако у Internet Explorer есть некоторые недостатки (Eww! IE!). Internet Explorer неправильно определяет атрибут значения, используя в качестве значения содержимое тега. Все значения в форме отправляются на сервер, независимо от того, нажата кнопка или нет. Это делает использование его в качестве <button type = "submit"> сложным и болезненным.

<input type = "submit">, с другой стороны, не имеет каких-либо проблем с ценностью или обнаружением, но вы не можете, однако, добавить HTML, как вы можете с <button>. Его также сложнее стилизовать, и стиль не всегда хорошо работает во всех браузерах. Надеюсь, это помогло.

Процитирую статью Разница между якорями, входами и кнопками:

Якоря (элемент <a>) представляют собой гиперссылки, ресурсы, к которым человек может перейти или загрузить в браузере. Если вы хотите разрешить пользователю переходить на новую страницу или загружать файл, используйте якорь.

Вход (<input>) представляет поле данных: поэтому некоторые пользовательские данные вы хотите отправить на сервер. Есть несколько типов ввода, связанных с кнопками:

  • <input type = "submit">
  • <input type = "image">
  • <input type = "file">
  • <input type = "reset">
  • <input type = "button">

Каждый из них имеет значение, например, «файл» используется для загрузки файла, «сброс настроек» очищает форму, а «представить» отправляет данные на сервер. Проверьте ссылку W3 на MDN или на W3Schools.

Элемент кнопка (<button>) довольно универсален:

  • вы можете вкладывать элементы в кнопку, например изображения, абзацы или заголовки;
  • кнопки также могут содержать псевдоэлементы ::before и ::after;
  • кнопки поддерживают атрибут disabled. Это позволяет легко превратить их включаются и выключаются.

Опять же, проверьте ссылку W3 на наличие тега <button>на MDN или на W3Schools.

Что касается стиля CSS, <button type = "submit" class = "Btn">Example</button> лучше, поскольку он дает вам возможность использовать CSS :before и :afterпсевдоклассы, которые могут помочь.

Из-за того, что <input type = "button"> визуально отличается от <a> или <span>, когда стилизованы с классами, в определенных ситуациях я их избегаю.

Стоит отметить, что текущий лучший ответ был написан в 2009 году. IE6 сейчас не вызывает беспокойства, поэтому согласованность стиля <button type = "submit">Wins</button> в моих глазах выходит на первое место.

Есть большая разница, если вы используете jQuery. jQuery знает о большем количестве событий на входах, чем на кнопках. На кнопках jQuery знает только о событиях щелчка. На входах jQuery распознает события «щелчок», «фокус» и «размытие».

Вы всегда можете привязать события к своим кнопкам по мере необходимости, но помните, что события, о которых автоматически узнает jQuery, разные. Например, если вы создали функцию, которая выполнялась всякий раз, когда на вашей странице происходило событие 'focusin', вход будет запускать функцию, а кнопка - нет.

re: KjetilNordin - У нас было приложение, которое знало о любых событиях focusin на странице, и одно произошло, произошло действие. Таким образом, если вы используете ввод, вы можете наблюдать за всеми элементами для одного события. Не говорю, что нужно, но можно. Риск состоит в том, что кто-то изменит ввод на кнопку, и тогда фокус не произойдет, а затем ваше действие не произойдет, а затем ваше приложение начнет работать. Вот что случилось с нами. :)

MattC 02.05.2016 21:08

использовать события фокуса, когда элемент в настоящее время нацелен с помощью мыши / клавиатуры. они показывают пользователю, где они находятся в документе.

albert 16.05.2017 20:14

кроме того, одно из различий может исходить от поставщика библиотеки и от того, что он кодирует. например, здесь я использую платформу Cordova в сочетании с мобильным пользовательским интерфейсом angular, и хотя теги input / div / etc хорошо работают с ng-click, кнопка может вызвать сбой отладчика Visual Studio, безусловно, из-за различий, вызванных программистом; обратите внимание, что ответ MattC указывает на ту же проблему, jQuery - это просто библиотека, и поставщик не подумал о некоторых функциях для одного элемента, которые он / она предоставляет для другого. поэтому, когда вы используете библиотеку, вы можете столкнуться с проблемой с одним элементом, с которой вы не столкнетесь с другим. и просто популярный, такой как input, в основном будет фиксированным, просто потому, что он более популярен.

Я просто хочу добавить кое-что к остальным ответам здесь. Элементы ввода считаются пустыми или недействительными (другие пустые элементы - это area, base, br, col, hr, img, input, link, meta и param. Вы также можете проверить здесь), то есть они не могут иметь никакого содержимого. Помимо отсутствия содержимого, пустые элементы не может иметь никаких псевдоэлементов, таких как :: after и :: before, что я считаю серьезным недостатком.

<button>
  • по умолчанию ведет себя так, как если бы у него был атрибут "type = " submit "
  • можно использовать как без формы, так и в формах.
  • текст или HTML-контент разрешен
  • псевдоэлементы css разрешены (например: раньше)
  • имя тега обычно уникально для одной формы

против.

<input type='button'>
  • type должен быть установлен на 'submit', чтобы вести себя как отправляющий элемент
  • можно использовать только в формах.
  • разрешено только текстовое содержимое
  • нет псевдоэлементов css
  • то же имя тега, что и большинство элементов форм (входов)

--
в современных браузерах оба элемента легко настраиваются с помощью css, но в большинстве случаев предпочтительнее использовать элемент button, так как вы можете стилизовать больше с помощью внутреннего html и псевдоэлементов.

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

Если вы не можете сделать это по разным причинам, не забудьте добавить атрибут role = ”button” в свой тег для доступности. Эта статья достаточно информативная: https://www.deque.com/blog/accessible-aria-buttons/

Другие вопросы по теме