把「一整套规范」真正落地:补全组件 → 布局模板 → 代码规范与工具链 → 迁移策略与走查清单。核心原则:一致性 > 好看;组件化 > 复制粘贴;设计令牌 > 到处写死;文档和检查清单 > 口头约定。
v3.1 专项:首页板块卡按钮从「两个白药丸」改为「一条品牌绿玻璃操作条」,三层叠加根因一次修净,并回写为红线第 8–11 条。
| 步 | 要求 | 本项目落地 | 状态 |
|---|---|---|---|
| 1 | 盘点现状 | 四维量化实测 4221 个 HTML(色值 1079 种 / 字号 40+ 档 / 阴影 218 种…) | 完成 |
| 2 | 建立设计令牌 | 色板 13 档 + 语义色 4 + 字号 6 档 + 圆角 4 档 + 阴影 2 档 + 间距 8px 栅格 + 断点 4 档,全在 ui.css 第 0 节 | 完成 |
| 3 | 统一基础组件 | 21 类组件,覆盖 Button / Input · Select · Checkbox · Radio · FormItem / Card · Modal · Drawer · Tabs · Table · Pagination / Toast · Tooltip · Dropdown · Breadcrumb / Empty · Loading · Skeleton | 完成 |
| 4 | 布局模板 | 页头 / 页脚 / 侧栏 / 内容区 + 容器封顶 1200px + 12 列栅格 + 页面标题·面包屑·操作区·分页区 | 完成 |
| 5 | 代码规范 | 目录映射对照 + 命名规则 + 禁字清单 + Stylelint / ESLint / Prettier 真实工具链 + commitlint | 完成 |
| 6 | 迁移策略 | 冻结新增 → 令牌组件 → 布局模板 → 逐页替换 → 清旧 CSS → 视觉回归 → 走查清单 | 逐页替换中 |
.ui-* 类data-ui-* 零配置生效data-th 变成行内标签)。data-ui-dd / data-ui-tip / data-ui-tabs / data-ui-chip / data-ui-table / data-ui-confirm,交互自动生效,不写一行 JS;点外部与 Esc 统一关闭。| 要素 | 标准 |
|---|---|
| 容器最大宽度 | 1200px(阅读页 720px / 大屏 1440px 两档变体) |
| 栅格 | 12 列 CSS Grid;ui-col-* 基础 + --md-*(≥768)--lg-*(≥1024);<768px 一律收成整宽 |
| 页面结构 | ui-page(撑满视口)→ ui-page-hd(标题·面包屑·操作区同行)→ ui-page-body → ui-page-ft |
| 侧栏 | ui-aside-nav + ui-aside-link;<1024px 自动转横向可滑条 |
| 区块节奏 | ui-section + 品牌色竖条标题 ui-section-t;桌面端自动放大卡片与表单内距 |
tokens.css → ui.css 第 0 节;components/base → ui.css 12–15 节 + ui.js 行为层;layouts → 第 16 节;pages → 生成器产物;services → api/*.py;router → nginx location。不重复造一层工程。ui- 前缀 + 中划线,变体 --,状态 is-;明令禁止 .box1 .red-btn .test 这类无语义命名与魔法数。ui.css 从 1148 行吹到 2893 行、ui.js 从 320 行吹到 430 行,破坏刻意保持的密度,且零语义收益。这条边界写进了 .prettierignore 的注释里,不是漏配。node _ui_standard/lint/run.mjs all,输出 [PASS] 才允许发布,[FAIL] 一律禁止。colr:1px → Stylelint 报未知属性;注入 #zzzzzz → 报非法色值;注入未定义变量 + 不可达代码 → ESLint 报 3 个 error。撤销后真文件恢复全绿。| 标准步骤 | 本项目落地 | 状态 |
|---|---|---|
| 冻结新增,新页面必须用规范 | ui.css / ui.js 已全站注入,新页面自动继承 | 完成 |
| 先做令牌和基础组件 | 令牌 13 档 + 组件 21 类 + 声明式行为层 | 完成 |
| 做布局模板 | ui.css 第 16 节(容器/骨架/页头页脚/侧栏/栅格) | 完成 |
| 按高频页面逐页替换 | 首页 → 登录 → 列表 → 详情 → 表单 | 进行中 |
| 清理旧 CSS / 无用依赖 / 内联样式 | 并轨层已兜住视觉;源码级残留待清 | 进行中 |
| 加视觉回归截图对比 | 截图能力已具备(桌面 + 移动双套),缺固定基线 | 进行中 |
| 建立设计走查清单 | 组件库第 14 节 17 条走查项 | 完成 |
$ curl -sI https://ltdlt.cn/ui.css → 200 57539 B $ curl -sI https://ltdlt.cn/ui.js → 200 12925 B $ curl -sI https://ltdlt.cn/ui-kit.html → 200 组件标准库 v3 # 注入范围:对客页 2 条 / 后台页 0 条 / ui.css=1 ui.js=1 /bishu.html ui.css=1 ui.js=1 /zixun.html ui.css=1 ui.js=1 /detail/bishu_100.html ui.css=1 ui.js=1 /boss.html ui.css=0 ui.js=0 ← 管理端保持原貌 # 质量指标 .ui- 命名空间类数 192 CSS 大括号平衡 462 / 462 全站 border-radius:999px 残留 0 处(首页椭圆仅剩 2 个圆形悬浮钮) ui.js 行为层命中 data-ui-dd / tip / tabs / chip / table / confirm 全部存在 site_ver 20260911093936 # 静态检查门禁 $ node _ui_standard/lint/run.mjs all === css === === js === [PASS] ui.css / ui.js 静态检查全绿 # 视觉验收(CDP 精确视口,不用 --window-size) $ node _ui_cta_audit.js https://ltdlt.cn/ ".sec-cta-btn" 320,360,375,390,414,430,440 320 PASS 360 PASS 375 PASS 390 PASS 414 PASS 430 PASS 440 PASS 按钮高度统一 36px · 文字行数 1 · 文档宽=视口宽 · 横向溢出 0
ui.css 误把页面自建类 .sec-cta-btn 当通用按钮,
给了 border-radius:var(--r-pill)(999px),还顺带写入 min-height(违反「只统一视觉、不碰布局」铁律);
② 移动端强覆盖 —— mobile.css 用 !important 改成
padding:12px 14px / font-size:15px / line-height:1.4,把按钮撑肥;
③ 模板双间距 —— .sec-cta{gap:8px} 又叠 .sec-cta > * + *{margin-left:8px},白吃 16px 宽。border-radius:10px 一体成型,
左「品牌绿实心」主按钮 + 右「透明」次按钮 + 1px 细线分隔)。主次一眼分明,六张卡完全一致。white-space:nowrap + flex:1 1 0;min-width:0;
栅格同步从 1fr 1fr 改成 minmax(0,1fr)、卡片补 min-width:0
—— 否则裸 1fr 会被内容撑宽,直接顶出横向滚动条。.gb-entry-btn(立即抢)圆角 24px → 12px;
.sec-count 六处内联彩虹色(紫 / 褐 / 蓝 / 洋红…)统一为毛玻璃白。


| 视口宽度 | 按钮高 | 文字行数 | 文档宽 | 横向溢出 | 按钮宽 | 结论 |
|---|---|---|---|---|---|---|
| 320 | 36px | 1 | 320 | 0 | 63 | PASS |
| 375 | 36px | 1 | 375 | 0 | 79 | PASS |
| 430 | 36px | 1 | 430 | 0 | 94 | PASS |
| 440 | 36px | 1 | 440 | 0 | 97 | PASS |
Range.getClientRects().length
数文字真实行数(不靠肉眼、也不靠高度除行高),用 CDP Emulation.setDeviceMetricsOverride
精确指定视口 —— 浏览器 --window-size 实测会失真(指定 430 实际得到 518,截图只截 430,看起来像溢出)。




ui.css。#3949ab、青 #00897b、红 #d32f2f、奶油米黄 #fbf6ea(生成器各残留 1–2 行 + 首页黄金模板 1 行)。实测渲染已被并轨层覆盖为品牌绿、肉眼无异常,但源码该清干净——改生成器 + 模板后重建。prompt() 2803 处从生成器源头改造成 ui.confirm 与内联表单(返回值被同步代码使用,不能靠运行时接管)。alt 1622 张 + loading="lazy" + 压缩到 300KB 内;补 45 页 description、28 页 h1。style= 25112 处按页族抽公共 CSS;!important 4671 处逐文件降级(排除并轨层)。Permissions-Policy;api/*.py 内联样式纳入盘点。10 / 12 / 16 / 24 四档,都不在设计令牌内(令牌四档 = 10 / 14 / 20 / 999),逐页替换时一并对齐。.gb-entry-sub 浅绿字配橙金底的杂色;首页 / 资讯页残留的内联色一并收口。