标注需说明约束关系而非固定数值
别名: 约束标注 · hug fill · min max 尺寸 · 冻结像素
概念解释
交付给实现的标注,要写的是布局引擎必须遵守的约束关系(constraint-based annotation):相对谁、最小多少、最大多少、拥抱内容还是填满容器。某一画板宽度下量出来的「13px」只是那一次采样。把采样写进标注,等于把一张静帧冻成合同;实现只能在那个宽度上对得上,宽度一变就只能猜。
它不是「标得更精确」,而是换一种可编译的对象:引擎吃的是关系,不是像素快照。固定宽高的标志、安全区硬底这类本来就不参与伸缩的量,写死数值是对的;会随容器、内容和密度重算的间距与尺寸,写死就是错的对象。
机制
屏幕上的框不是把画板复印过去。父级宽度、文案长度、字号、密度一变,同一元素的边距和宽高会重算。实现侧如果读到「左边距 16、宽度 343」,它得到的是某个 375 宽画板上的一次解;换到 320 或分栏变窄,这组数不再是合法解。关系型标注把「什么可以变、什么必须保住」交给引擎:Hug contents、Fill container、min 8 / max 24、相对父级、相对兄弟。引擎在新宽度上再解一次,标注仍然成立。
冻结数值的吸引力来自验收习惯:用尺子量实现和视觉稿,13 对上了就算过。尺子量的是静帧之间的距离,量不到约束有没有被编码。于是实现用绝对定位把那一帧摆准,自适应从一开始就没被交付。
边界
印刷稿、图标网格、必须与物理按键对齐的面板,布局目标就是固定像素,约束标注没有对象。没有约束引擎、只能绝对定位的遗留画布上,写 Hug/Fill 等于写给不存在的运行时。min/max 若被写成与内容无关的装饰范围(「随便 8 到 24」),实现仍不知道在哪一档该停。品牌色、圆角这类不随容器变的属性,本来就该是命名值,不是布局约束;把它们也改写成 hug/fill 会把两种决定搅在一起。
怎么落地
- 每个会伸缩的框写明三种之一:拥抱内容、填满容器、固定;固定必须附带为什么不能变。
- 间距写成相对哪一条边或哪一个兄弟,并给出下限和上限,不写「现在看起来是 13」。
- 把画板拉到最窄和最宽两档,检查标注在两档上是否仍够用;某档只能靠目测补数,说明那一档的约束没写出来。
- 验证:只把标注交给没看过视觉稿的实现者,让他在两个极端宽度上排出同一组件。若他开始回视觉稿量 13px,或两档中有一档对不上意图,约束没有被交付。