I2.03.2later chunks must not shove设计
后到内容不应挤动已呈现内容
别名: 后到不挤 · 已呈现稳定 · no layout shove
概念解释
先画已就绪,屏幕上就已经有人在读、在瞄的东西。后到的块插进来时若把这些东西顶走、推下、改命中区域,先画的那笔账就被后到的一笔勾销。原则是:已呈现的几何对用户保持稳定,后到的内容去尚未被占用的位置,或替换明确仍是占位的区域,而不是去挤正在被用的区域。
怎么给未到的块留坑、早期点击怎么收,是逐步呈现那一组的后果问题。这里只把「不准挤」立成加载顺序里的约束。
机制
人一旦在一块已呈现的内容上完成定向——标题的位置、第一段的起点、一颗按钮的坐标——这份定向就是正在进行的工作记忆。后到的图在上方展开、广告条插入、评论区突然长高,工作记忆里的坐标全部作废:眼睛要重新找行,手指点到的已经换了主人,正在读的句子被推出视口。先呈现本想提前开始的认知工作,被自己的后续到达打断,净效果可能比整体等待更差,因为人被启动了一次又被驱离。
挤动和骨架食言不同。骨架食言发生在一次等待的结束帧,支票只有一张。这里是多张支票陆续兑现:第一张已经兑付给用户在用,第二张却去改第一张的版面。约束因此是时间性的:晚到的块对早到的块没有改写权,除非早到的块自己还在声明「我是占位」。
边界
用户自己触发的变化(展开、筛选、旋转屏幕)不是后到内容在挤,是人在改布局。未读区域里的插入——视口下方很远的页脚——挤了也不打断当前工作,但仍会在滚到时让滚动位置的预期出错,不能完全当没发生。必须插在已呈现区域里的内容(一行内联的认证徽章),要走替换占位而不是把邻居挤开;没有占位又必须插入时,先呈现原则要让步,宁可晚一点一起画,也不要在人已经开始读之后插刀。动画把挤动做成滑动,坐标仍然丢了,只是看起来礼貌。
怎么落地
- 后到的块默认追加到尚未成为阅读/指向对象的区域,或填进仍标明为空的槽,禁止在已可见主列顶部无预告地插入。
- 会在视口内出现的媒体,不要用「高度从 0 长到真实」的方式进场。
- 若做不到不挤,这一块就不要单独先画:把它和会被它移动的邻居捆成一次呈现。
- 验证:先让主列出齐,开始读或把指针放在一颗按钮上,再放行一张顶部大图。按钮被顶走或正在读的行离开视口,就是后到在挤已呈现。