优先使用 ,因其语义清晰、支持html嵌套、无障碍友好、具备form属性绑定能力,仅在ie8遗留系统且js依赖input.value时才用。

优先用 <button type="submit"></button>,除非你正在维护一个必须兼容 IE8 且无法改 JS 取值逻辑的遗留系统。
button 默认会提交表单,不写 type 属性就是 type="submit"
这是最常踩的坑:在 <form></form> 里写 <button>提交</button>,没加 type="button" 或 type="submit",点一下页面就刷新了。W3C 规范规定 <button></button> 默认行为是 type="submit";IE 是个例外,默认为 type="button",但现代项目基本不用考虑它。
- 想禁用提交?必须显式写
type="button" - 想触发提交?写
type="submit"(推荐,语义清晰) -
<input type="submit">天生就是提交行为,不写type也会被解析为type="submit",但它的value会参与表单序列化(比如提交后 URL 带&btn=ok),而<button></button>的value属性只在提交时起作用,内容区域文字不参与提交
button 支持嵌套 HTML,input type="submit" 只能靠 value 显示纯文本
你要加图标、换行、粗体、SVG 或响应式文字?只有 <button></button> 能直接塞进去:
<button type="submit"> <svg aria-hidden="true">...</svg><span>导出 PDF</span> </button>
<input type="submit" value="导出 PDF"> 完全锁死在 value 字符串里,空格、换行、HTML 实体都会被当作文本原样显示,没法拆解控制。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 动态更新文案+图标?
button可操作innerHTML或appendChild;input只能改value,屏幕阅读器读出来就是一整段,缺乏结构语义 - 伪元素(
::before/::after)对input无效,想加装饰只能靠背景图或额外 DOM 节点 - Flex 布局中两者基线对齐方式不同:
input按文本底线,button按内容盒,混排容易错位
button 有更多原生表单高级能力,input type="submit" 没有
<button></button> 支持 form、formaction、formmethod 等属性,哪怕按钮不在 <form></form> 标签内部,也能精准绑定并提交到指定表单:
<input type="submit"> 没有这些能力,它的作用域被严格限制在自身节点上,必须放在 <form></form> 内部才能生效。
-
button天然支持:focus-visible,无障碍体验更稳;input需手动加aria-label补全语义,否则屏幕阅读器可能只读出“按钮”两个字 -
button在 IE9+ 中行为统一,加一句button { vertical-align: middle; }就能解决大部分对齐问题;input在旧 IE 中 padding、line-height 渲染异常更常见
真正该用 input type="submit" 的场景只剩一个
遗留系统无法修改 DOM 结构,且已有大量 JS 代码依赖 el.value 读取按钮文字(比如 document.querySelector('input[type="submit"]').value),改用 button 会导致脚本失效,又没人力重写逻辑。
除此之外,所有新项目、重构、组件封装,都应该默认选 <button type="submit"></button> —— 它不是“看起来差不多”,而是语义、可访问性、扩展性、样式控制都更可控。容易被忽略的是:表单提交时,button 的 value 属性是否设置,直接影响后端接收到的字段名和值,这点比 input 更灵活也更易出错。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










