直接答案:25 个首页里 24 个可测(E13 返回 502),共 1,372 个文本元素、25,879 个字符。按字符加权的字号中位是 14px;4 站中位 12px(E01、E04、E11、E29),10 站 14px,4 站 16px,最高 E20 的 20px。5 站出现 <12px 文本(33 个元素、724 个字符),长文本最小 8.3px(E18);20/24 站至少有一段 ≥10 字文本的行高低于 1.4。
这不是“字号小就一定违规”:12px 可以用于日期、法务或辅助信息;但整段正文长期 12px,在手机上会明显偏小。本文把 <12px 与行高 <1.4 当作筛查信号。
方法:390×844 下逐站读计算字号
2026-11-09 21:54–21:58,用 headless Chrome 124 与 DevTools Protocol 逐站新标签打开同一批 25 个首页:390×844、DPR 1、桌面 UA,等 readyState 为 complete 后再等 2.5 秒。对每个可见元素,只取它自己的直接文本节点(≥2 字符),读取 fontSize 与 lineHeight;祖先标签或 class 含 header/footer/nav/menu/breadcrumb/copyright 的元素排除,以近似正文区域。
| 口径 | 判定 | 边界 |
|---|---|---|
| 文本元素 | 可见、宽高 ≥2px、直接文本 ≥2 字符 | 只取直接文本节点,嵌套 span 会拆成多个元素 |
| 字号 | getComputedStyle 的计算值(CSS px) | 不含浏览器缩放与系统字体放大 |
| 加权中位 | 每个字符按字号投一票,排序后取中位 | 长段落权重更高,不是元素数中位 |
| 最长文本块 | 直接字符数最多的可见文本元素 | 可能是标题、列表或标签,不保证是正文段落 |
| <12px | 字号小于 12px | 筛查阈值,不是 WCAG 最小字号 |
| 行高比 | line-height / font-size < 1.4,且文本 ≥10 字 | 标题也会计入;不是只算正文段落 |
| 正文近似 | 按祖先 tag/class 排除导航、页脚、菜单、面包屑、版权区 | class 匹配是启发式,可能误伤正文 |
结果:中位 14px,4 站只有 12px
| 加权中位字号 | 站点数 | 站点 |
|---|---|---|
| 12px | 4 | E01、E04、E11、E29 |
| 14px | 10 | E02、E03、E06、E09、E12、E17、E19、E25、E28、E30 |
| 14.6px | 1 | E18 |
| 15–15.2px | 3 | E08、E22、E26 |
| 16–16.6px | 5 | E14、E16、E23、E24、E27 |
| 20px | 1 | E20 |
5 个站的 body 声明字号就是 12px;14px 有 14 站,16px 有 3 站,其余为 14.625/16.64 的小数。最长文本块为 12px 的有 3 站(E04、E11、E29),14px 有 11 站,16px 有 5 站;E20 的 298 字符文本块为 20px。中位 12px 不代表全文都 12px:E01 的最长文本块是 16px 的介绍段,但 10px 的新闻摘要合计 467 字符,把加权中位拉到了 12px。
站点明细(E13 HTTP 502,未列出):
| 站点 | 中位 | 最长块 | <12px | 字符<12 | 行高<1.4 |
|---|---|---|---|---|---|
| E01 | 12 | 16 | 14 | 467 | 10 |
| E02 | 14 | 14 | 0 | 0 | 0 |
| E03 | 14 | 14 | 1 | 72 | 25 |
| E04 | 12 | 12 | 0 | 0 | 11 |
| E06 | 14 | 14 | 0 | 0 | 12 |
| E08 | 15 | 14 | 0 | 0 | 4 |
| E09 | 14 | 14 | 0 | 0 | 7 |
| E11 | 12 | 12 | 0 | 0 | 2 |
| E12 | 14 | 14 | 0 | 0 | 0 |
| E14 | 16 | 16 | 0 | 0 | 20 |
| E16 | 16 | 16 | 0 | 0 | 0 |
| E17 | 14 | 14 | 0 | 0 | 12 |
| E18 | 14.6 | 14.6 | 12 | 86 | 1 |
| E19 | 14 | 14 | 0 | 0 | 1 |
| E20 | 20 | 20 | 0 | 0 | 4 |
| E22 | 15 | 15 | 0 | 0 | 11 |
| E23 | 16 | 16 | 1 | 11 | 6 |
| E24 | 16 | 16 | 0 | 0 | 7 |
| E25 | 14 | 14 | 5 | 88 | 12 |
| E26 | 15.2 | 14.9 | 0 | 0 | 21 |
| E27 | 16.6 | 16.6 | 0 | 0 | 3 |
| E28 | 14 | 14 | 0 | 0 | 16 |
| E29 | 12 | 12 | 0 | 0 | 1 |
| E30 | 14 | 14 | 0 | 0 | 0 |
<12px 文本:33 个元素、724 个字符
5 站出现小于 12px 的文本,合计 33 个元素、724 个字符;其中 10 个元素有 20 字以上。E01 最多:14 个元素、467 字符,主要是 10px 的新闻摘要;E18 的 8.3px 日期标签、E25 的 5 个 6.5–10px 英文标语、E03 的 11px 地图版权、E23 的 8.6px 标语也计入。
| 站点 | <12px 元素 | 字符 | 最小长文本 | 现场 |
|---|---|---|---|---|
| E01 | 14 | 467 | 10px | 10px 新闻摘要段落 |
| E18 | 12 | 86 | 8.3px | 列表日期与英文标签 |
| E25 | 5 | 88 | 10px | 英文标语与辅助文字 |
| E03 | 1 | 72 | 11px | 地图版权文字 |
| E23 | 1 | 11 | 8.6px | 品牌标语 |
行高:20/24 站至少一段 <1.4
对 ≥10 字的可见文本,按 line-height / font-size 计算:20 个站至少一段低于 1.4,合计 186 个元素。E03 有 25 个、E26 21 个、E14 20 个、E28 16 个;E02、E12、E16、E30 为 0。行高偏紧时,长段落在小屏上更容易串行;它同样包含标题,因此是筛查而非正文判定。
验收清单:正文、辅助、行高分开看
- 正文优先 ≥14px。 12px 可以留给日期、法务与辅助信息;整段正文不要长期停在 10–12px。
- 行高 1.5–1.7。 小字号配 1.2 的行高会让长文更挤;先改正文段落,再改标签。
- 按字符加权复核。 用长段落的字号代表正文,避免被几十个小标签的平均值误导。
- 390px 真机/模拟器都要看。 浏览器缩放不能替代真正的移动字号;viewport 与缩放可参考移动视口 pilot。
- 触控与字号一起验。 小字常与小目标同时出现,可参考390px 触控审计。
局限
- 正文区域是按祖先 tag/class 的启发式排除,可能误伤含 nav/header 字样的正文容器。
- 只取直接文本节点;嵌套 span 会拆成多个元素,长度与加权中位受 DOM 结构影响。
- 只读计算后的 CSS px,不含浏览器缩放、系统字体放大或用户样式;一次快照。
- 图片、Canvas、SVG 文本不计;伪元素文字也不计。
- 行高比包含标题与标签,不是“正文行高”专项;<1.4 只是筛查线。
- 25 站 pilot,E13 502 未测;不外推行业。
数据与复核
匿名数据:equipment-homepage-font-size-390-2026.csv(25 行 × 17 列:文本元素、字符、<12px、行高、加权中位、最长块、body 字号与时间)。仓库内为 docs/research/2026-11-homepage-font-size-390.csv。聚合口径与加权中位在 scripts/font_size_probe.py,scripts/test_content_font_size_probe.py 含 6 项断言;不含站点 URL、标题或联系方式。
常见问题
12px 一定不可读吗?
不一定。12px 用于辅助信息、日期或法务文字可以接受;整段正文长期用 12px,在手机上会偏小。本文把 <12px 作为筛查阈值,不把它当成 WCAG 的硬性最小字号。
为什么按字符加权算中位?
长段落比标签更能代表正文。若按元素数平均,几十个小标签会淹没正文;按字符加权让每个字符只投一票。
行高 1.4 是什么标准?
1.5–1.7 是常见的正文行高建议;WCAG 1.4.12 的文本间距要求也以 1.5 倍行高为参考。本文用 <1.4 作为筛查线,不是一致性判定。
为什么排除 header/footer/nav?
本文想看正文区域,所以按祖先标签与 class 排除导航、页脚、菜单、面包屑和版权区;class 匹配是启发式,可能误伤正文,这是已知边界。
为什么只有 24 站可测?
E13 在本次请求返回 HTTP 502,无法读取 DOM;其余 24 站都成功渲染并测量。
数据能复核吗?
可以。公开 CSV 25 行 × 17 列(含不可测行),聚合口径在 scripts/font_size_probe.py,有 6 项离线断言;可按 sample_id 复测。