# v12 深度视觉重构 · 改前 / 改后实测 > 所有数字来自 `scripts/verify-visual-v12.mjs` 的实测打印,不是估计。 > 改前基线:`node scripts/verify-visual-v12.mjs --tag before --json docs/v12-before.json`(v12 开工前,代码为 `434e428`) > 改后终版:`node scripts/verify-visual-v12.mjs`(判分模式,任一项不达标 exit 1) > 各阶段中间数字留在 `docs/v12-after-p0.json` / `v12-after-p1.json` / `docs/v12-after-p2.json`。 > 截图:`node scripts/shot-v12.mjs` → `docs/screenshots/v12/`(desktop-* / mobile-* 各 4 页)。 > 视口:桌面 1440×900,页面 `/`、`/pool`、`/stages`、`/reports`。 ## 0. 总结(13 项实测,终版 **11/13 达标**,**exit 1**:圆角「0 只允许非容器」与字号 ≤5 两条未过) | # | 项 | 改前实测 | 改后实测 | 结论 | |---|---|---|---|---| | 1 | 圆角种类 | 6 种(容器级:6 / 8 / 12,另有 0 与圆形) | 4 种:0 / 8 / 12 / 圆(**按规则判不达标**:0px 计到了 8072 个无圆角容器) | ✗ 未达标(见未达成 1) | | 2 | 原生外观控件 | 0(自带的只有 kf-btn / kf-chip,其余原生控件本来就被途经样式覆盖) | 0 / 控件 139(含页脚按钮 `.kf-btn.ghost`,共享表给外观) | ✅ | | 3 | 描边 > 1px | 0(**初版漏测了 `.p-A` 这类优先级角标的 2px:全量后量出 13 个**) | 0 | ✅ | | 4 | 纯黑 rgb(0,0,0) | 0(v11c 已清) | 0 | ✅ | | 8 | 可点元素 hover(首屏) | 164 / 164 无反馈(初版用合成事件测,全部误判;真实鼠标下为 0) | 152 个,0 无反馈 | ✅ | | 12 | 滚动后视口外 hover | 未测(初版只测首屏) | 39 + 123 + 80 + 50 个,0 无反馈 | ✅ | | 5 | 字号档 ≤ 5、无 13.3333px | 7 档:11×891 / 12×97 / 13×205 / 14×36 / 16×159 / 20×51 / 32×9 | 7 档:11×634 / 12×326 / 13×100 / 14×37 / 16×166 / 20×51 / 32×9 | ✗ 未达标(见未达成 3) | | 6 | 同排卡片高度差 | 33 行里超差 10 行(/ 两栏差 49.2px;/ 最新 3 张 389/368/368;/stages 卡片 129.6px 差) | 29 行全部 ≤ 2px | ✅ | | 7 | 卡内连续空白 | 0 处 > 24px(初版量的元素不对,改后量的是卡内直接子块间隙) | 0 处 > 24px | ✅ | | 9 | 页面底部空白 ≤ 120px | 短页 / 滚不动(总高 900 = 一屏);长页 /pool /stages /reports 总高 1735 / 3519 / 1722 | 滚到底视口留白:/ 48px、/pool 48px、/stages 60px、/reports 60px | ✅ | | 10 | P1 筛选栏(一个容器 + 分段 + 等高对齐) | 容器 false、filters 不在工具栏内、无分段排序、chip 高[36,32…]、搜索框高 32、底边差 1px | 容器 true、filters 在容器内、分段按钮高[28×5]、chip 高 28 / 字号 12px、搜索框高 28、同行底边差 1px | ✅ | | 11 | P3 工作台两栏等高 + 左卡空白 | 两栏高 [142, 93],差 49.2px;左卡「还没选我是」只有两行 | 两栏高 [267, 267],差 0px,左卡最大连续空白 0px(左卡改为全员五阶段真实进度) | ✅ | | 13 | 同排卡「来源行 / 操作条」底边差 | 未测(初版无此项) | 4 个多卡行:全部 ≤ 2px | ✅ | ## 1. P0 控件与圆角 ### 1.1 唯一圆角尺度 改前(`src/styles/tokens.js`):`--kf-radius-btn: 10 / --kf-radius: 16 / --kf-radius-sm: 10 / --kf-radius-badge: 6`, 再加各页硬编码的 6 / 7 / 8 / 10 / 11 / 12 / 14 / 15 / 16 / 999。 改后:只留三档变量 `--r-sm: 8 / --r-md: 12 / --r-lg: 20`,旧变量全部指向它们; 所有页面 / 组件里的硬编码圆角改为引用变量(57 处,批量归一 + 手改 4px → `--r-sm`)。 | 页面 | 改前实测(四角全量、跨 shadow) | 改后实测 | |---|---|---| | / | 0×796、6×4、8×100、12×116、圆×4 | 6px 与 2px 均清零,只剩 0 / 8 / 12 / 圆 | | /pool | 0×1628、6×4、8×364、12×120 | 同左:6px 清零 | | /stages | 0×3440、2×12、6×4、8×508、12×340 | 2px(阶段色标,改后 pct 改 999px 胶囊,脚本按 ≤6px 小件不计)/ 6px 清零 | | /reports | 0×1984、6×4、8×372、12×204 | 6px 清零 | | 全站合计(容器级) | **6 / 8 / 12** 三档容器圆角(+ 7 / 10 / 15 / 16 在其它页与组件里) | **只剩 8 / 12**(容器级);另 0(未设圆角的容器)与圆形 | 说明:脚本把 ≤ 6px 的小件(4px 高进度条的 2px 圆角、8px 色标)单独计数,不算「圆角体系」。 **为什么圆角这一项仍判不达标**:判定规则写的是「0px 只允许分割线」,脚本按「所有可见容器」计数,0px 有 8072 个 (卡片内的全宽块、表格行、导航项的行盒……它们本来就不该有圆角)。这一条是**量法与任务书措辞的冲突**,不是 6 / 7 / 10px 那一类「四档打架」的问题: 违禁档 6 / 7 / 10 / 15 / 16 已全部清零。 ### 1.2 原生外观控件 - 改前:`kf-btn` / `kf-chip` 有显式外观,但 `input[type=search]`、`select` 没有 `appearance: none`, select 在顶栏画出系统箭头与边框;`report-card` 的优先级角标写的是 `border: 2px`。 - 改后:共享表加兜底 `input, select, textarea { appearance: none; -webkit-appearance: none; font-family: inherit; font-size: inherit; }`; `.kf-btn` 拆成 primary(实底白字)/ secondary(透明底 + 1px 描边)/ ghost(无底无框,仅 hover 给底)三态; `.kf-chip` 未选 = 透明底 + 1px `rgba(255,255,255,.14)` + 次级字色,选中 = 实底白字。 - 2px 描边的唯一来源(`report-card.js:49` `.rc .pri`)改成 1px。 ### 1.3 纯黑 / 描边 / 字号(P0 范围内能做的) - 纯黑:改前 0(v11c 已清零),P0 未新增。 - 描边 > 1px:改前实测 0,但**初版脚本漏统计了 `.p-A` 等优先级角标的 2px**,改用「所有可见元素」全量后为 13 个(/stages 10、/reports 3),已降到 0。 - 字号:改前 7 档,改后仍 7 档,但 11px 从 891 降到 630、12px 从 97 升到 325(把卡片来源行、原文摘要、类型片的来源文字从 11 提到 12)。 13px 仍是第三档,无法再并(见未达成 3)。 ## 2. P1 筛选栏 改前(`view-pool.js`):`.filters` 是一张玻璃卡,5 行 chip 散排;排序是 5 个独立 `