I2.05.2late lazy-load trigger设计

触发阈值过晚会造成可见空白

别名: 懒加载空白 · 触发太晚 · lazy-load hole

概念解释

懒加载靠一条触发线:对象靠近需求时才开始取。线画在视口边缘甚至进入视口之后,取数、解码、排版还要一段时间,人已经看见那个位置了,位置上却是空的。这就是可见空白(visible hole)——不是没内容,是内容的出现被阈值拖到了注视之后。首屏因此变快的那笔账,在滚动时用一块空洞还了回去。

机制

滚动把未加载对象送进视口的速度,可以快过网络把对象取回来的速度。触发若以「相交视口」为界,开始取的那一拍,对象已经在眼睛底下。之后的往返、解码、插入,全是在已暴露的空洞上表演等待。快速甩动、分页衔接、锚点跳转会让大量对象几乎同时过线,阈值更显得晚:系统刚为第一张图启动请求,人已经停在第三张的空洞上。

预热距离(root margin)是在跟这条赛跑:在对象还有一段像素才进视口时就开始取,让往返和滚动赛跑的结果落在「到达时刚好有东西」。距离太短或为零,赛跑必输。距离太长,懒加载又退化成提前加载,首屏成本回来。阈值要按往返时间来,不能按审美来。

边界

本地已经缓存的对象,即使触发晚,空洞也可能短到不被察觉——但冷缓存、弱网下同一阈值会突然变得很晚,所以不能用办公室 Wi-Fi 来标定。锚点跳进页面中部、恢复滚动位置、搜索命中滚到匹配项,都会瞬间越过「慢慢接近」的假设,阈值再合理也会空洞;这些路径需要按目标附近提前取,而不是等相交。占位高度若为零,空洞还会连带挤动,那是后到挤已呈现的表亲;即使高度留了,空洞作为「这里应该有图却没有」仍然成立。关闭图片的用户、读屏用户,空洞的视觉定义不适用,但不能因此让触发更晚。

怎么落地

  • 触发线放在视口之外:按典型往返加上解码时间,给一个预热边距,而不是 intersecting && fetch
  • 对跳转、恢复位置、深链,在滚动动画之前就按目标周围取,不要走普通的接近触发。
  • 弱网下加大预热或降级为更早加载,而不是保持一条为快网写的线。
  • 验证:在节流网络上快速滚过图墙,停住。若停住的地方先出现空洞再闪出图,阈值就晚了——把边距加大到停住时图已经在,而不是刚开始转圈。

延伸

  • 同组I2.05.1 懒加载降低首屏成本 · I2.05.3 懒加载内容需可被页面内搜索发现
  • 相邻I2.03 分块加载 · I2.11 分块加载与逐步呈现 · I2.01 骨架屏与转圈的选用
  • 站内检索lazy-load hole · root margin · late trigger

同组卡片

快捷操作

分享

分享当前页面

ios_share

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