J2.06.2outline none replacement设计研究

移除默认样式必须提供替代

别名: outline none · 去掉焦点框 · 自定义焦点

概念解释

浏览器给可聚焦控件画默认轮廓,因为键盘没有指针可看。样式重置里写 outline: noneoutline: 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 只留用户代理,确认问题来自重置而不是浏览器没画。

延伸

  • 同组J2.06.1 焦点指示需在所有背景上可辨 · J2.06.3 焦点不得被固定元素遮挡
  • 相邻J3.01 键盘可达 · J2.10 非文本对比度
  • 站内检索outline: none · focus-visible · CSS reset focus

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/J2.06.2