直接答案: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。
方法:把 outline:none 放回规则里看
2026-11-08 23:42–23:43,对同一批 25 个首页实时请求 HTML,读取 HTML 内联 <style> 与前 3 个外链 CSS;串行、站间 0.5 秒、超时 15 秒。解析器先去掉注释,再用“选择器 + 声明块”配对;@media 外层不计、其内部规则照常计入。只读声明,不渲染。
| 口径 | 定义 | 边界 |
|---|---|---|
| 任意 outline:none | CSS 文本中出现 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 规则 | 19 | 1,014 |
| 有 :focus-visible 规则 | 6 | 12 |
| 任意 outline:none | 21 | 343 |
| :focus 内 outline:none | 17 | 131 |
| 有替代声明 | 15 | 890 |
| 结构性替代 | 14 | 758 |
| 仅改颜色 | 1 | 132 |
| 只删不补 | 4 | 34 |
| 无 :focus 规则 | 6 | 0 |
替代并不平均。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:none | 20 站 | 21 站 |
| 其中在 :focus 内 | 未统计 | 17 站 |
对验收的启示
- 验收焦点不要只搜关键词。 看到 outline:none 要追问同一 :focus 规则里有没有替代;本期 15 站有、4 站只删不补。
- 把内联样式算进检查。 E25 的焦点规则全部在内联
<style>,只抓外链会漏掉整站。 - box-shadow 是最常见替代(12/15),但声明不等于可见。 用键盘逐页走一遍 Tab,确认焦点位置在深浅背景上都看得见。
- 只删不补优先修。 E11、E19、E24、E26 共 35 条规则删了 outline 却没给替代。
- 无 :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。
数据来源与口径
- 样本:第 4 期 30 个首页中缓存为 200 的 25 个,与 22:42 键盘复测同一批。
- 抓取:2026-11-08 23:42–23:43 Asia/Shanghai,串行,站间 0.5 秒,超时 15 秒。
- 样式:HTML 内联
<style>+ 前 3 个外链 CSS。 - 口径:任意 outline:none、:focus 内 outline:none、替代声明、结构性替代、只删不补,定义见上表。
常见问题
为什么上一期 20 站、这一期 21 站?
两期口径不同:上一期只读外链 CSS、按文本出现次数统计;本期把 HTML 内联