19 · 设计变量、配置与魔法数值

适用:统一调整成本高、同一个限制出现多个版本、计时器与动画不同步,或代码里出现无法解释的数值。目标是让数值有含义、单位、来源和作用域。

VAL-01 · 数值按所有者分类

数值类型例子来源与放置位置
基础设计尺度间距阶梯、字重、圆角设计系统基础变量
语义设计变量控件高度、帮助文字、焦点宽度基础变量的语义映射
组件局部变量画布工具条密度、阅读主栏宽度组件或页面模式作用域
交互策略搜索延迟、长按阈值、重试间隔行为策略模块,写明单位
业务限制名称长度、附件数量、授权范围领域规则或服务端能力,不以 CSS 决定
环境与服务配置API 地址、轮询能力、功能开放环境或服务配置,按项目发布规则管理
算法与素材几何对比度公式系数、SVG 坐标原算法或素材中,解释出处与用途

0、网格的 1fr、边框的局部几何并不天然是魔法数。不要把所有字面量包装成 NUMBER_16;应处理无法解释或需要共同变化的数值。

VAL-02 · 命名表达语义、单位与范围

.product-ui {
  --space-3: .75rem;
  --space-4: 1rem;
  --font-body-size: 1rem;
  --font-help-size: .875rem;
  --control-min-block-size: 2.75rem;
  --field-inline-gap: var(--space-3);
}
.field-help { font-size: var(--font-help-size); }

--field-inline-gap 比 --gap-12 更能说明影响。需要调密度时映射语义变量;只改变品牌色,不应该连同字段长度一起改变。

const projectNamePolicy = { maxGraphemes: 60 };
const searchPolicy = { debounceMs: 250, minimumQueryGraphemes: 1 };

数值是示例,不是通用最佳值。saveDelay 没说明单位;limit 没说明限制什么,应避免。模拟请求延迟与生产超时时间分别管理。

VAL-03 · 同一规则贯穿提示、校验与测试

名称长度限制只能有一个权威来源,字段提示、计数器、校验与边界测试引用它。前后端需要一致的计量单位和规则版本;后端仍做最终验证,不能把客户端配置当成授权。

服务端返回能力时,界面读取经过验证的能力描述;加载中和能力变化要有策略。不要出现提示 60、浏览器 maxlength 40、提交校验 80 的三个版本。

VAL-04 · 不要把不同语义绑在一起

搜索防抖和动画时长可能恰好都是 200ms,但它们解决不同问题。更改动画不应让搜索变慢。全局 MAX_TEXT_LENGTH 也不能同时控制用户名、文章标题和退款原因。

共享值用语义引用表达;相同字面值可以属于不同规则。反过来,一个业务限制不能仅因为在两个文件中出现就被视为两个独立值。

VAL-05 · CSS 与 JavaScript 各有边界

字号、间距、表面颜色优先由 CSS 变量和布局控制,避免在每次窗口变化时由 JS 重算所有像素。JS 中的手势阈值、排队与超时归行为策略。动画时间需要由 JS 控制时,可从同一配置向局部 CSS 变量输出带单位的值。

普通 CSS 自定义属性不能直接替代媒体查询中的断点。需要统一断点时使用构建期变量、生成工具或有文档依据的共享定义,不能写无效的 @media (width < var(--breakpoint)) 后声称已抽象。

动态尺寸优先由内容、容器和 CSS 布局决定,确需测量时明确观察对象、节流策略和销毁。不要用固定超时猜测字体加载、键盘弹出或布局完成。

VAL-06 · 修改数值时验证实际影响

为每个公共变量记录用途、默认值、单位、覆盖方式和影响页面。修改后检查正常、长内容、大字号、明暗与特殊变体,不能以“只改了一个数字”免除回归。

检查候选裸值时区分设计遗漏、合理局部值与算法常量。验收目标是可理解、可调整且不误伤个例,不是把数值搜索结果清零。