优先用 <button>:支持嵌套内容、语义清晰、可访问性好、样式可控;<input type="button"> 仅支持纯文本且兼容性差。

用 <button> 还是 <input type="button">?
优先用 <button>。它天然支持嵌套内容(比如图标 + 文字)、语义清晰、可访问性好,而且默认样式更可控。<input type="button"> 只能放纯文本,且在某些老浏览器里对 padding 和 line-height 的处理不一致。
常见错误:用 <input type="submit"> 却没包在 <form> 里,结果点击后页面刷新或报错;或者误以为 <input> 更“轻量”,其实现代浏览器中两者开销几乎没差别。
-
<button>支持disabled、type="button|submit|reset",注意type不写默认是submit,非表单内点击可能意外触发表单提交 -
<input type="button">的value是显示文本,不能插 HTML;而<button>的文本写在开始和结束标签之间,可加<svg>或<span> - 若需兼容 IE8 及更早版本(极少见),
<input>确实更稳,但此时 JS 交互和 CSS 也大概率出问题,不如整体升级方案
按钮点击没反应?检查这三件事
90% 的“按钮点不动”不是代码写错,而是事件绑定或 DOM 状态出了问题。
- 确认 JS 获取到的是真实 DOM 节点:用
console.log(document.querySelector('button'))看是否为null—— 常见于脚本执行早于 HTML 解析,把 JS 放在</body>前,或用DOMContentLoaded - 检查
disabled属性是否被动态加上了:button[disabled]在控制台里会灰掉,且click事件根本不会触发 - CSS 中写了
pointer-events: none或父容器遮挡(比如z-index错乱、绝对定位覆盖)也会让点击失效,用浏览器开发者工具的“检查元素”看鼠标悬停时高亮的是不是真按钮
onclick 行内写法 vs addEventListener,怎么选?
除非是临时调试或超简单页面,否则别用 onclick="doSomething()"。它把结构和行为混在一起,无法复用、不好测试、容易拼错函数名导致静默失败。
立即学习“前端免费学习笔记(深入)”;
错误现象:onclick="handleClick()" 里调用的函数未定义,控制台报 ReferenceError,但按钮看起来“只是没反应”;或者多个 onclick 写在同一元素上,只有最后一个生效。
-
addEventListener允许同一按钮绑定多个处理函数,也方便后期移除:btn.removeEventListener('click', handler) - 注意事件监听器里的
this指向:箭头函数会丢失,普通函数里this是触发事件的按钮元素,但若用了bind或封装成模块,得确认上下文 - 移动端要注意
click有约 300ms 延迟,如需快速响应,改用touchstart(但得同时处理click兼容桌面端)
按钮样式失效?重点盯这几个 CSS 属性
按钮自带 UA 样式(比如 Chrome 给 <button> 加了 border、background、font),直接写 color: red 可能被覆盖,得用更具体的规则或重置。
- 先加
button { all: unset; }快速清空默认样式,再从零写,避免被 UA 样式干扰 -
appearance: none可以去掉系统原生样式(如 macOS 的圆角阴影),但 Safari 需要-webkit-appearance: none - 如果按钮文字垂直居中异常,大概率是
line-height和height冲突,优先用padding控制高度,而不是固定height - 禁用状态样式别只靠
opacity: 0.5:它不影响可访问性,屏幕阅读器仍会读出按钮,必须配合aria-disabled="true"和pointer-events: none
复杂点在于,不同浏览器对 <button> 的默认 box-sizing、vertical-align 处理不一致,微调时建议用 display: inline-flex 替代纯 inline 布局,能更好控制对齐和尺寸。



















