移除默认样式必须提供替代
别名: outline none · 去掉焦点框 · 自定义焦点
概念解释
浏览器给可聚焦控件画默认轮廓,因为键盘没有指针可看。样式重置里写 outline: none 或 outline: 0,等于拆掉这条公共线索。可以换一套自己的指示,不能只拆不补。替代必须在键盘聚焦时出现;用悬停底色、用鼠标按下态,都不是替代。环在各种底上够不够亮,是前一条;这里管的是默认被拿掉之后,还有没有指示这件事实。
机制
用户代理样式是键盘可见性的底线。全局重置、组件库的「干净外观」、以及把 :focus 和 :focus-visible 一起清掉,都会把这条底线抹掉。第二层::focus { outline: none } 连鼠标点击后的残余焦点一起杀掉,键盘 Tab 同样没有环。只在 :focus-visible 里清掉、却不写新的描边或内发光,键盘路径一样盲。
有人用 box-shadow 或底色变化当替代,这可以,但必须绑在键盘可感知的伪类上,并且真正出现——写在文档里却被更高优先级的重置盖掉,等于没补。自定义控件(div tabindex="0")本来就没有按钮那种用户代理轮廓,删除默认的同时往往也没补,缺陷会成片出现。
怎么研究
在 CSS 里搜 outline:\s*(none|0) 和等价的 outline-width: 0。对每个命中,看同选择器或 :focus-visible 里有没有可见替代。键盘遍历,对比「用户代理默认 / 当前站点」。
自变量:是否移除 outline、是否提供替代、替代绑在 :focus 还是 :focus-visible。
因变量:键盘停驻时是否有任何可见记号、鼠标点击后是否错误地出现记号、重置覆盖替代的次数。
把流行重置引入的空白页也纳入:缺陷常常不在业务 CSS,而在底座。
边界
仅在指针激活后隐藏焦点、键盘仍显示,这是允许的 :focus-visible 用法,不算「只拆不补」。不可聚焦的装饰元素本不该有焦点样式。某些移动 WebView 的用户代理轮廓本来就弱,更不能再拆。强制颜色模式下浏览器可能改画轮廓,自定义替代要能被覆盖或自己适配,否则会和系统指示叠两套或全无。
怎么落地
- 禁止无配套规则的
outline: none/0;拆默认的同一处必须写上:focus-visible替代。 - 替代用描边、双色环或足够厚的
box-shadow,绑在键盘可见的伪类上,不要绑在:hover。 - 自定义可聚焦控件当原生一样处理:没有用户代理轮廓,从第一天就画替代。
- 验证:全库搜索 outline 关闭项,每一处点开对应的聚焦样式。藏指针 Tab 走一遍,任何停没有记号即失败。临时关掉站点 CSS 只留用户代理,确认问题来自重置而不是浏览器没画。