outline: none 必须写在 a:focus 上,因为虚线框仅在元素获得键盘焦点或鼠标点击后触发 :focus 时出现;全局设置 a { outline: none } 无效且可能干扰样式。

现代浏览器中,直接用 outline: none 就能解决绝大多数链接点击后虚线框问题,但必须加在 :focus 伪类上,且要考虑可访问性影响。
为什么 outline: none 必须写在 a:focus 上
浏览器只在元素获得键盘焦点(比如 Tab 切换)或鼠标点击后短暂触发 :focus,此时虚线框才出现。如果只写 a { outline: none },等于全局禁用 outline,既无效(因为非 focus 状态本就不显示),又可能干扰其他状态样式。正确写法是:
code
a:focus {
outline: none;
}
注意:部分旧版 Firefox 需要加 -moz-outline: none,但 Firefox 60+ 已完全支持标准 outline,无需额外前缀。
IE8 及更老版本只能靠 hidefocus 或 JS blur()
IE8 不支持 :focus 伪类对 @#@#@#@#@#@#@#@#@#@0 —— 简单有效,但需改所有链接标签
document.querySelectorAll('a').forEach(el => el.addEventListener('focus', () => el.blur())) —— 注意不能用 onfocus 属性赋值,IE8 对事件监听兼容性差,推荐用 attachEvent 回退不推荐用 blr:expression(...),它在 IE8 中已废弃,且会严重拖慢渲染性能。
别忽略可访问性:键盘用户依赖这个虚线框
去掉虚线框最常被忽略的后果是:盲人或仅用键盘操作的用户无法感知当前聚焦位置。如果你真要移除,至少提供替代视觉反馈:
- 给
a:focus加背景色或边框,比如:background-color: #eef; - 配合
:hover做一致高亮,避免只在 focus 时突兀变化 - 若项目有无障碍要求(如政府/教育类网站),建议保留 outline,仅调整颜色和样式:
outline: 2px solid #007bff;
Chrome 和 Safari 默认 outline 是蓝色实线,不是虚线;所谓“虚线框”主要出现在旧版 Firefox 和 IE,以及某些自定义主题的系统级设置中。
图片链接、按钮等其他元素也要一并处理
虚线框不只出现在 <a></a> 上,<button></button>、<input type="button">、带 tabindex 的 <div> 同样会触发。通用写法是:
<pre class="brush:php;toolbar:false;">code
a:focus,
button:focus,
input[type="button"]:focus,
input[type="submit"]:focus,
[tabindex]:focus {
outline: none;
}
</pre>
<p>但注意:不要无差别写 <code>*:focus { outline: none },这会破坏表单控件(如 input[type="text"])的默认聚焦提示,反而降低可用性。











