F2.03.2spacing base divisible by density设计

基数选择需与常见屏幕密度整除

别名: 间距基数 · 4pt · pixel snapping

概念解释

间距基数乘上 2x、3x 之后,应当落在整数设备像素上。4 和 8 常见,是因为 4×2=8、4×3=12,没有半像素。基数选 5,在 1.5x 的 Android 上变成 7.5,左右圆整方向一旦不一致,盒子就糊,1 px 分割线也会一边粗一边细。

这条只问算术能不能整除,不问档位该有几个,也不问例外会不会把体系带崩。

机制

布局引擎在逻辑像素里算,屏幕按密度把逻辑像素扩成设备像素。奇数或「好看的 5、6」乘上 1.5、2.75 这类密度,会得到分数。分数再被栅格化,相邻边可能一个向下取整一个向上,于是本该对齐的两条边错开半像素,描边发虚。

触控和字体已经在抢整数像素。间距再贡献一批半像素,页面会在「说不清的不干净」里变脏,尤其是成排的卡片和 1 px 线。基数能被常见密度整除,是把误差关在栅格化之前。

边界

矢量绘制到离屏纹理再缩放的表面(部分游戏、地图)不走这套盒模型,基数约束弱很多。只做 3x 的单一机型,5 的倍数偶尔也能干净,一旦加入 1.5x、2.75x 或桌面 1x 就立刻露馅。

用户把显示缩放开到 125%、150% 时,连 8 的倍数都可能不再整除;那时更稳的是「尽量整除」加上在目标缩放下抽检发虚边,而不是假定某一个基数永远安全。

怎么落地

  • 选定基数(通常 4)后,列出目标密度(1、1.5、2、2.75、3)和系统显示缩放,逐档验算 基数 × 密度 是否为整数或可接受的圆整。
  • 1 px 分割线单独处理:用物理像素或 hairline 写法,不要指望 5 px 的内边距去「带出」一条干净的线。
  • 验证:在 1.5x 和 3x 模拟器上打开同一列表,放大看卡片边和分割线。出现一边糊一边清、或左右 padding 视觉不等,记下对应的逻辑值。把该值改成基数倍数后再看糊边是否消失。

延伸

  • 同组F2.03.1 有限的间距档位降低决策与不一致 · F2.03.3 标度外的例外值会瓦解体系
  • 相邻F2.01 栅格系统 · F2.05 对齐 · F6.04 图标的最小尺寸
  • 站内检索pixel snapping · density independent pixels · 4pt grid · hairline

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/F2.03.2