I2.11.1reserve space against layout shift设计
逐步呈现需要为尚未到达的区块预留空间以避免布局抖动
别名: 预留高度 · CLS · 分块占位
概念解释
分块会陆续到达。到达时若这块在文档里的高度还是零,周围已经稳定的字和按钮会被顶开,这就是布局抖动(layout shift)。逐步呈现要先为尚未到达的区块留出位置——按已知的高宽比、最小高度、或骨架槽——让后到的像素填进已经占好的坑,而不是把坑从零挖到真尺寸。不准挤是原则;预留是这条原则在逐步呈现里的做法。
机制
排版按当前树算坐标。一块从「不存在」变成「存在且很高」,它下面所有节点的坐标都要重算,正在看的行和正在瞄的点击目标跟着搬家。预留把「存在」提前到几何层:节点或占位已经参与排版,只是内容还空。后到的字节替换占位内部,文档流的高度不变,重算不必发生,或只发生在占位内部。
预留需要一份先于载荷的尺寸知识:图的比例、卡片的最小行高、广告位的合同尺寸。没有这份知识,预留会不准——留矮了仍会顶,留高了到达时塌。不准的预留仍比零预留稳:塌通常发生在视口外的底部,顶发生在人已经在用的中部。能从类型推出比例时(十六比九的视频、头像圆),预留可以在数据回来前就精确。
边界
真正高度随内容剧烈变化、事先无法给出有意义下界的块(长度未知的评论),预留只能是最小槽,到达仍可能长一截;把这类块放在已读区域之下,抖动发生在尚未被用的几何里。用户自己展开造成的高度变化不是逐步呈现的抖动,是人在改布局。预留若用一块和真内容完全不同的形状,填入时仍会在块内跳,那是骨架食言的表亲,预留只保护了邻居。打印、导出这类要一次成页的通道,预留中间态不应被当成终稿。
怎么落地
- 凡会在视口内陆续出现的媒体和模块,在请求发出时就按类型写入高宽比或最小高度。
- 占位参与排版,不要用「有数据了再 insert 一个原来不占空间的节点」。
- 未知高度的块排在主任务区域之后,或放进内部滚动,避免把抖动送进正在读的列。
- 验证:主列可读之后放行一张顶部图。量主按钮的视口坐标,到达前后应重合。坐标动了,预留就不够,或根本没留。