7.2 KiB
主题创作经验教训
目录
- 完成标准
- 构图与装饰
- 边框与动态尺寸
- 图标与重复来源
- 透明度与选择器
- 居中、菜单与动态 DOM
- 范围控制与缓存
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 缩到 18–24px 后灰边、糊、材质脏。
根因:有损素材板中的半透明暗边和高光被浏览器重采样到很小区域。
做法:主交互控件重切对应规格并制作干净 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.html 与 buildWelcomeMarkup() 是两条渲染路径。
做法:结构同步,动态文案使用同一 formatter/hydration 节点;回归同时读取静态与动态源码。
7. 范围控制与缓存
教训:用户圈的是哪层,就只改哪层
症状:用户要求气泡透明,却修改了所有卡片、工具层或整页背景,导致更多视觉偏差。
做法:先用 DOM/DevTools 确认用户所指层级,明确 selector 列表;超出范围的发现只记录,不顺手实施。
教训:选择器写错会让正确元素消失
症状:加号消失或旧规则继续生效。
根因:假定 class 名,没有检查真实 DOM;新 selector 命中不存在节点,旧隐藏规则仍命中真实节点。
做法:实现前用 rg 和浏览器检查实际 class,回归断言真实节点保持所需显示状态。
教训:缓存会制造“完全没变化”的假象
做法:
- 修改 CSS/JS 后推进 cache-busting query。
- 用浏览器读取实际
<link>/<script>URL。 - 用 HTTP 请求确认最新资源内容与 200。
- 确认缓存后再判断 CSS 是否无效。
教训:并行会话会反复覆盖共享主题文件
做法:开始前审计活跃会话和脏文件;为子任务划分不重叠写入面。发现相同区块连续回写时停止互相覆盖,协调后再合并。