Files
cc-web/.codex/skills/create-cc-web-theme/references/lessons-learned.md
2026-07-18 10:14:38 +08:00

7.2 KiB
Raw Blame History

主题创作经验教训

目录

  1. 完成标准
  2. 构图与装饰
  3. 边框与动态尺寸
  4. 图标与重复来源
  5. 透明度与选择器
  6. 居中、菜单与动态 DOM
  7. 范围控制与缓存

1. 完成标准

教训:自动化通过不代表像设计图

症状:资产存在、选择器命中、回归全绿,但用户第一眼认为“完全不是一个东西”。

根因:回归只能证明结构契约,不能证明构图比例、边框轻重、视觉层级和图标质感。

做法:

  • 把真实浏览器视觉对照列为独立完成阶段。
  • 按参考图原始视口先验收,再做响应式。
  • 为关键区域记录截图、几何值和 computed style。
  • 用户未确认或对照差异明显时,回滚“完成”状态。

2. 构图与装饰

教训:参考图不是配色板

症状:颜色接近,但人物被遮罩压黑、侧栏比例不对、卡片堆叠、整体质感跑偏。

根因:只抽取黑、金、棕等颜色,没有量化参考图的空间、留白和主视觉安全区。

做法:先量化侧栏/顶栏/输入区比例、主视觉 bbox、阅读安全区和面板覆盖范围。

教训:主题感不是“给所有组件加边框”

症状:搜索框、消息、列表、弹层、工具块全都厚金边和切角,界面像重型游戏皮肤。

根因:把局部装饰语言泛化到所有组件。

做法:建立装饰预算。只让主按钮、输入框和少数工具框承担强边框;普通消息、列表和小标签使用轻线或无边框。

教训:先删重,再加细节

症状:越修越多伪元素、渐变、阴影和粒子,参考主体反而更弱。

做法:按“背景 → 大布局 → 面板 → 边框 → 图标 → 微交互”排序。发现层级错误时先删除多余装饰,不继续叠覆盖规则。

3. 边框与动态尺寸

教训:固定比例伪元素不适合动态输入框

症状:单行看似正确,多行内容后边框、底线或徽记偏移;窄屏出现非等比压缩。

根因:把固定 width/height 比例的整框放在 ::before/::after,它不跟随真实内容盒的边界语义。

做法:

  • 动态宽高使用 border-image/九宫格。
  • 把不能拉伸的徽记和可拉伸边线分开。
  • 测试最短、常规和最大高度。
  • focus/drag/note 状态不要用 border: 0 破坏 frame。

教训:莫名边框通常来自叠层,不是主框

症状:按钮旁多出框、输入区出现虚线、聚焦后冒出第二层边。

根因:旧 focus ring、按钮 ::after、背景素材烘焙线、主框图片内外双线同时存在。

做法:在 DevTools 逐个关闭伪元素、border、outline、box-shadow 和背景图,确定真实来源后只删那一层。

4. 图标与重复来源

教训:统一画布不等于统一视觉尺寸

症状CSS 都是 24px但图标仍显得过小、过大或偏心。

根因:透明画布内的 alpha 主体 bbox 不同;不同形状的光学重心也不同。

做法记录源规格、输出画布、alpha bbox 和实际 CSS 尺寸;非对称图标按 alpha 重心校正。

教训:最大档切图缩小不一定更清晰

症状64px 原色 PNG 缩到 1824px 后灰边、糊、材质脏。

根因:有损素材板中的半透明暗边和高光被浏览器重采样到很小区域。

做法:主交互控件重切对应规格并制作干净 mask多色状态和头像保留原色但独立裁切。

教训:新图标可能叠在旧图标上

症状:头像两个图、新会话加号消失/重复、发送按钮出现“一坨”。

根因:真实 DOM 已有文字、SVG 或 <img>,主题又添加了背景图或伪元素。

做法:先检查 DOM。每个语义只保留一个视觉来源只在目标主题下隐藏原生子节点。

5. 透明度与选择器

教训RGBA 很低仍可能看起来不透明

症状:外层气泡改为 2%10% alpha页面仍像实心黑卡片。

根因可能包括:

  • 内层 tool-call/content/title 仍是 90% 黑底。
  • blur 太高,把背景细节抹成均匀色块。
  • 旧规则用更高 specificity 锁住 background。
  • 伪元素仍覆盖整层。

做法:从最外层到最内层检查 computed background、background-image、opacity、backdrop-filter 和伪元素。用背景纹理是否可辨判断“透”,不用数值自我证明。

教训:backdrop-filter 变了不代表背景色也变了

症状DevTools 显示 blur 已更新,但气泡底色完全不变。

根因:共享 :is() 规则的最高参数 specificity 超过后置主题规则。

做法:查看每个 computed 属性的获胜规则;使用同级 selector 或只对冲突属性精确增加 !important。不要把 !important 扩散到整个主题。

教训:模糊强度不是越高越有磨砂感

症状:提高 blur 后背景更像不透明色块。

根因:暗场细节被平均,透景消失。

做法:先降低染色层,再用较小 blur 配合适度 saturate/brightness最终数值按当前背景实测不把某个主题的 blur(3px) 当通用常量。

6. 居中、菜单与动态 DOM

教训CSS “居中”需要测量证据

症状:代码有 flex/absolute 50%,视觉仍偏。

根因容器本身不在画布中心、baseline 不一致、图片 alpha 主体偏心或滚动条改变内容区中心。

做法:分别测容器中心、画布中心、图标 alpha 中心和文字 line box记录像素差后修正。

教训:菜单没显示可能是被父级裁切

症状:点击后状态正确,菜单 DOM 也存在,但看不到。

根因:列表项 overflow: hidden、错误 stacking context 或按钮被 flex 挤出。

做法:检查展开态 overflow、定位基准、z-index 和操作区尺寸。只在菜单打开时解除必要裁切。

教训:静态与动态 welcome 会漂移

症状:首次打开显示旧文案,刷新/切会话后才正确;结构修了一处另一处仍旧。

根因:index.htmlbuildWelcomeMarkup() 是两条渲染路径。

做法:结构同步,动态文案使用同一 formatter/hydration 节点;回归同时读取静态与动态源码。

7. 范围控制与缓存

教训:用户圈的是哪层,就只改哪层

症状:用户要求气泡透明,却修改了所有卡片、工具层或整页背景,导致更多视觉偏差。

做法:先用 DOM/DevTools 确认用户所指层级,明确 selector 列表;超出范围的发现只记录,不顺手实施。

教训:选择器写错会让正确元素消失

症状:加号消失或旧规则继续生效。

根因:假定 class 名,没有检查真实 DOM新 selector 命中不存在节点,旧隐藏规则仍命中真实节点。

做法:实现前用 rg 和浏览器检查实际 class回归断言真实节点保持所需显示状态。

教训:缓存会制造“完全没变化”的假象

做法:

  • 修改 CSS/JS 后推进 cache-busting query。
  • 用浏览器读取实际 <link>/<script> URL。
  • 用 HTTP 请求确认最新资源内容与 200。
  • 确认缓存后再判断 CSS 是否无效。

教训:并行会话会反复覆盖共享主题文件

做法:开始前审计活跃会话和脏文件;为子任务划分不重叠写入面。发现相同区块连续回写时停止互相覆盖,协调后再合并。