I2.11.1reserve space against layout shift设计

逐步呈现需要为尚未到达的区块预留空间以避免布局抖动

别名: 预留高度 · CLS · 分块占位

概念解释

分块会陆续到达。到达时若这块在文档里的高度还是零,周围已经稳定的字和按钮会被顶开,这就是布局抖动(layout shift)。逐步呈现要先为尚未到达的区块留出位置——按已知的高宽比、最小高度、或骨架槽——让后到的像素填进已经占好的坑,而不是把坑从零挖到真尺寸。不准挤是原则;预留是这条原则在逐步呈现里的做法。

机制

排版按当前树算坐标。一块从「不存在」变成「存在且很高」,它下面所有节点的坐标都要重算,正在看的行和正在瞄的点击目标跟着搬家。预留把「存在」提前到几何层:节点或占位已经参与排版,只是内容还空。后到的字节替换占位内部,文档流的高度不变,重算不必发生,或只发生在占位内部。

预留需要一份先于载荷的尺寸知识:图的比例、卡片的最小行高、广告位的合同尺寸。没有这份知识,预留会不准——留矮了仍会顶,留高了到达时塌。不准的预留仍比零预留稳:塌通常发生在视口外的底部,顶发生在人已经在用的中部。能从类型推出比例时(十六比九的视频、头像圆),预留可以在数据回来前就精确。

边界

真正高度随内容剧烈变化、事先无法给出有意义下界的块(长度未知的评论),预留只能是最小槽,到达仍可能长一截;把这类块放在已读区域之下,抖动发生在尚未被用的几何里。用户自己展开造成的高度变化不是逐步呈现的抖动,是人在改布局。预留若用一块和真内容完全不同的形状,填入时仍会在块内跳,那是骨架食言的表亲,预留只保护了邻居。打印、导出这类要一次成页的通道,预留中间态不应被当成终稿。

怎么落地

  • 凡会在视口内陆续出现的媒体和模块,在请求发出时就按类型写入高宽比或最小高度。
  • 占位参与排版,不要用「有数据了再 insert 一个原来不占空间的节点」。
  • 未知高度的块排在主任务区域之后,或放进内部滚动,避免把抖动送进正在读的列。
  • 验证:主列可读之后放行一张顶部图。量主按钮的视口坐标,到达前后应重合。坐标动了,预留就不够,或根本没留。

延伸

  • 同组I2.11.2 用户可能在内容尚未完全到达时就开始操作,需要处理这种早期交互 · I2.11.3 呈现节奏过快会让用户误以为内容已完整而遗漏后续到达的部分 · I2.11.4 分块呈现的每一步都应是自洽的可用状态而非半成品
  • 相邻I2.03 分块加载 · I2.01 骨架屏与转圈的选用 · I2.05 懒加载
  • 站内检索layout shift · reserved slot · CLS progressive render

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/I2.11.1