直接答案:25 个首页里,19 站有 :focus 规则(共 1,014 条);21 站在任意规则中出现 outline:none,其中 17 站把它写进 :focus 规则(131 条)。15 站声明了替代视觉:14 站是结构性替代(12 站用 box-shadow,另 2 站用 outline/border),1 站只改颜色;4 站只删不补(35 条规则),6 站完全没有 :focus 规则;6 站使用 :focus-visible(12 条)。

本文只读样式声明,不渲染页面、不比较对比度,也不执行 JS。

25
首页
19
有 :focus
21
outline:none
17
在 :focus 内
15
有替代声明
4
只删不补

方法:把 outline:none 放回规则里看

2026-11-08 23:42–23:43,对同一批 25 个首页实时请求 HTML,读取 HTML 内联 <style> 与前 3 个外链 CSS;串行、站间 0.5 秒、超时 15 秒。解析器先去掉注释,再用“选择器 + 声明块”配对;@media 外层不计、其内部规则照常计入。只读声明,不渲染。

口径定义边界
任意 outline:noneCSS 文本中出现 outline:none 或 outline:0含非 :focus 规则与内联样式
:focus 内 outline:none选择器含 :focus / :focus-visible / :focus-within,且声明 outline 为 none/0不看 :hover、:active
替代声明:focus 规则中声明 outline(非 none)、box-shadow、border、background、text-decoration、filter、transform、text-shadow只改 color 归为弱替代
结构性替代上述结构属性至少一条不判断渲染与对比度
只删不补有 :focus 规则内 outline:none,且该站没有任何替代声明按站点判定,不按单条规则

结果:19 站有 :focus,15 站有替代

指标站点数规则数
有 :focus 规则191,014
有 :focus-visible 规则612
任意 outline:none21343
:focus 内 outline:none17131
有替代声明15890
结构性替代14758
仅改颜色1132
只删不补434
无 :focus 规则60

替代并不平均。12 站用 box-shadow(E01、E02、E03、E06、E09、E14、E16、E17、E22、E23、E25、E30),另 2 站用 outline/border 等结构属性(E04、E12);E13 只有颜色变化,归为弱替代。E11、E19、E24、E26 只删不补,共 35 条规则;E08、E18、E20、E27、E28、E29 没有 :focus 规则,其中 E18、E20 未取到外链 CSS,也没有内联焦点规则,属于抓取边界。还要注意:E04、E12 的替代只覆盖特定工具类(跳转链接或读屏文本),同一站的 input:focus 仍可能只删不补,站点级标记会高估实际覆盖范围。

与上一期口径的差异

上一期只读外链 CSS、按文本出现次数统计:18 站有 :focus 规则、20 站出现 outline:none。本期把内联 <style> 也算进来并改为按规则解析:19 站、21 站。差异主要来自内联样式——E25 的 68 条焦点规则全部来自一段内联 <style>,外链 CSS 为 0;E17 有 17 段内联样式、E24 有 9 段。两次抓取到的样式表也可能不同,因此只比较汇总口径,不逐站对比。

口径上一期 22:42本期 23:42
样式来源前 3 个外链 CSS内联 <style> + 前 3 个外链 CSS
解析方式文本出现次数选择器 + 声明
有 :focus 规则18 站19 站
出现 outline:none20 站21 站
其中在 :focus 内未统计17 站

对验收的启示

  1. 验收焦点不要只搜关键词。 看到 outline:none 要追问同一 :focus 规则里有没有替代;本期 15 站有、4 站只删不补。
  2. 把内联样式算进检查。 E25 的焦点规则全部在内联 <style>,只抓外链会漏掉整站。
  3. box-shadow 是最常见替代(12/15),但声明不等于可见。 用键盘逐页走一遍 Tab,确认焦点位置在深浅背景上都看得见。
  4. 只删不补优先修。 E11、E19、E24、E26 共 35 条规则删了 outline 却没给替代。
  5. 无 :focus 规则不一定坏。 6 站可能依赖浏览器默认焦点环;先人工确认再判缺陷。企业官网验收可参考网站建设服务。

局限

  • 只看声明:不渲染、不比较颜色对比度,不证明焦点真的可见。
  • 样式范围:内联 <style> 与前 3 个外链 CSS;@import 与 JS 注入的样式不计。
  • 解析边界:@media 外层不计、内部计;不支持 CSS 嵌套语法;伪元素未单独区分。
  • 抓取边界:E18、E20 未取到外链 CSS;个别站点两次抓到的样式表不同。
  • 站点级标记:只要站内有任意替代规则就记为“有替代”,不区分它是否覆盖被删掉 outline 的元素。
  • 25 站 pilot:同一批装备企业样本,不外推行业。

数据与复算

匿名数据:equipment-homepage-focus-indicator-2026.csv(25 行 × 13 列:状态、CSS 文件数、焦点规则、focus-visible、任意 outline:none、:focus 内 outline:none、替代/结构性替代/仅颜色/box-shadow/只删不补规则数与时间)。仓库内为 docs/research/2026-11-homepage-focus-indicator.csv。

解析:scripts/focus_indicator_probe.py;单元测试 scripts/test_content_focus_indicator.py(11 项,无网络)。运行:

python -m unittest scripts.test_content_focus_indicator

配套:首页语义与键盘可达性(skip link、tabindex、focus 计数)、首页链接结构 pilot(2,739 链接)、首页导航 pilot。

数据来源与口径

  1. 样本:第 4 期 30 个首页中缓存为 200 的 25 个,与 22:42 键盘复测同一批。
  2. 抓取:2026-11-08 23:42–23:43 Asia/Shanghai,串行,站间 0.5 秒,超时 15 秒。
  3. 样式:HTML 内联 <style> + 前 3 个外链 CSS。
  4. 口径:任意 outline:none、:focus 内 outline:none、替代声明、结构性替代、只删不补,定义见上表。

常见问题

为什么上一期 20 站、这一期 21 站?

两期口径不同:上一期只读外链 CSS、按文本出现次数统计;本期把 HTML 内联