refactor: 完成全局CSS模块化治理
CSS quality / css-quality (push) Has been cancelled

This commit is contained in:
hectorzhao
2026-09-05 00:45:05 +08:00
parent 1a7a7245a6
commit 458ddd97df
31 changed files with 17265 additions and 9857 deletions
+80
View File
@@ -0,0 +1,80 @@
# CSS 日常开发规范
## 1. 适用范围
本规范适用于新增、修改、迁移和审查前端 CSS。它是日常开发的强制规则;`global.css` 的存量拆分步骤另见 `global-css-modularization-plan-20260904.md`
原则只有两条:每条样式必须有唯一所有者;样式的生效范围必须和所有者范围一致。
## 2. 先判断归属
按以下顺序判断,命中后停止:
| 问题 | 归属 |
|---|---|
| 是否只是颜色、间距、字号、圆角、阴影等设计变量? | `src/styles/tokens.css`,只定义自定义属性 |
| 是否是浏览器重置或标签字体继承? | `src/styles/reset.css`,不得包含业务类名 |
| 是否属于 AppShell、侧栏、顶栏、导航、登录框架或页面容器? | `src/styles/shell.css` |
| 是否被多个业务域复用,且所有状态和视觉语义一致? | `src/styles/components/` 中对应公共组件文件 |
| 是否只在同一业务域的多个页面复用? | 业务域目录中的共享 CSS,并使用业务域根前缀 |
| 是否只服务一个页面、弹窗或局部组件? | 与所有者同目录的 CSS,由所有者直接 import |
| 是否无法确认用途的历史规则? | 暂留 `global.css`,先记录和查证,不得复制或新增 |
“看起来相似”不等于公共组件。只有 API、交互状态和视觉语义都一致,才能上移到公共层。
## 3. 命名和作用域
- 页面必须有唯一根类名,例如 `.admin-report-materials-page`
- 页面样式必须位于页面根类名下,避免路由切换后已加载 CSS 污染其他页面。
- 业务域共享样式使用稳定的业务域前缀;公共组件使用组件名,不使用 `item``title``card` 等无上下文短类名。
- 状态类使用所属组件限定,例如 `.report-field-card.is-selected`,不得单独定义全局 `.selected`
- 不新增无根节点限定的 `div``button``table` 等业务样式。
- 新代码不使用 ID 选择器控制样式。
## 4. Import 和级联
固定层级为:
```text
tokens → reset → shell → shared components → business shared → page styles
```
- 基础层和全局共享层只能由应用入口或明确的公共组件入口加载。
- 页面 CSS 由页面或其业务域入口直接 import,不得通过 `global.css` 间接加载。
- 公共组件不得依赖业务页面样式;业务页面可以覆盖公共组件,但必须位于页面根节点下。
- 相同 specificity 下的覆盖如果依赖加载顺序,必须在代码中保持稳定,并验证首次进入、刷新和跨路由跳转。
- 伪类、子选择器、动画和媒体查询跟随其所有者,不集中到新的全局文件。
## 5. 修改规则
- 优先复用 `tokens.css` 中已有变量;新增 token 必须具有跨页面意义。
- 不新增 `!important`。确有第三方样式等不可控原因时,需说明原因、影响范围和移除条件。
- 不通过不断嵌套或重复类名提高 specificity;应修正所有权、根节点或加载层级。
- 不在纯样式修复中顺手重排整个文件、改色、改字号或重做布局。
- 不复制已有规则来快速覆盖问题;先搜索同名选择器和全部消费者。
- 动态数值可使用 React `style` 或 CSS 自定义属性;稳定视觉规则仍应归入 CSS 所有者文件。
## 6. `global.css` 过渡规则
- 在完成自动门禁和相关脚本适配前,文件继续保留 `global.css` 名称,行为上视为只减不增的 legacy 文件。
- 允许:迁出选择器、删除已验证无用规则、为保持迁移前计算样式而做的最小修正。
- 禁止:新页面选择器、新业务组件、单页补丁、无根节点覆盖以及新的 `!important`
- 例外必须在变更说明中记录原因、影响页面、验证证据和后续清理条件;不能只写“临时处理”。
- 禁止整文件 Prettier;迁出的新文件应单独格式化。
## 7. 开发和审查清单
提交前至少确认:
1. 样式文件和选择器有明确所有者。
2. 页面及业务样式具有根节点命名空间。
3. 没有向 `global.css` 增加页面或业务规则。
4. 没有新的无说明 `!important`、宽泛标签选择器或跨层依赖。
5. 修改共享样式时已列出并检查所有消费者。
6. hover、focus、disabled、loading、selected、danger、空数据和错误状态没有遗漏。
7. 1600×1000、1366×768、390×844 下没有新增溢出、遮挡和层级错误。
8. 首次进入、刷新和跨路由切换后的计算样式一致。
9. 已运行 CSS 格式与样式门禁、相关测试、TypeScript、生产构建和 `git diff --check`
10. staged diff 没有整文件重排或其他会话的修改。
在自动门禁正式落地前,第 3、4、5、8 项必须人工检查,不能因工具尚未覆盖而跳过。