G4.07.1restore by item identity when the list mutated设计研究

列表内容在离开期间变化时,恢复位置应定位到具体项而非绝对滚动量

别名: 按项恢复位置 · scroll anchor · 而非像素偏移 · item-based restoration

概念解释

离开列表去看详情的这段时间里,信息流顶部可能插进新帖、库存列表可能少了几行。回来时若按离开时记下的像素或 scrollTop 去滚,视口会停在另一批对象上。按具体项恢复是记住当时在看的那条 id,以及它在视口里的相对位置;内容变了,仍把那条找回来对准。基本的「不要回顶」假设列表没动;列表动了,像素书签指向的已经不是原来那一页书。

机制

像素偏移是一份对当时布局的测量,不是对对象的引用。插入、删除、图片加载导致的高度变化都会让同一偏移对准别的行。人的书签是对象:「就那张蓝卡片」,不是「1374 像素」。CSS 的 overflow-anchor 和浏览器 scroll anchoring 处理的是同一帧内的插入,跨页往返不在它们的范围里——往返时列表常常被销毁重建,锚点元素已经不在 DOM。

按 id 恢复把坐标系换成集合上的主键。回来先确保该 id 进入已渲染窗口,再把它滚到离开时的视口相对处。顶部插入了十条,像素恢复会让人以为「我看过的那些往下跑了」或「我被退回更早的内容」;id 恢复会让那十条留在上方,必要时用一句「上方有新内容」而不是把人拽到顶。主键必须稳定:用当时的数组下标当锚,重排后和下标错位,等于没换坐标系。

怎么研究

在离开期间向列表头部插入已知数量的新项,比较像素恢复与 id 恢复。

  • 自变量:恢复策略(scrollTop / 对象 id / 不恢复)、插入数量、项高度是否均匀。
  • 因变量:返回后原对象是否在视口内、对象在视口中的相对偏移误差、人是否报告「看错条」。
  • 方法论注意点:高度均匀的列表会低估像素失败——插入 N 条只是整体平移,有时看起来还像「那一带」。要用高度差很大的卡片流。不要在无插入的静态列表上测这条,那是基本回顶问题。进程被杀后的冷启动要单独跑,内存里的 DOM 锚点会丢,只剩 id。

边界

集合被筛选或排序成另一份,旧 id 可能根本不在新结果里,按项恢复会失败,这时该承认集合变了而不是卡在空白。用户在详情里删除了那一项,回来应对准邻项,仍算按对象处理。广告槽、时间戳分隔行没有稳定 id,不能当锚,要锚在相邻的内容项上。协作列表在离开期间被他人重排,id 还在但上下文变了,人对得上对象、对不上「周围那几条」,这是下一步要说明的失效,不是改回像素能修好的。

怎么落地

  • 离开时记下对象 id 和它在视口内的比例(例如距顶 30%),不要只记 scrollTop
  • 返回时先把该 id 取进渲染窗口再滚动对齐;顶部有插入则留在上方,可用弱提示,禁止为了让像素对上而把人拽到顶。
  • 锚点用稳定主键,不用当时的下标或「第几屏」。
  • 验证:在一条可见项上进详情,离开期间在顶部插入至少一屏新项,返回。原来那一条必须仍在视口里。同一录屏用像素恢复做对照,视口应已经换了一批对象——那就是这条要避免的。

延伸

  • 同组G4.07.2 无限滚动列表的位置恢复依赖已加载数据量,返回过深会触发重新加载 · G4.07.3 未提交的输入草稿应随导航离开保留,而非清空 · G4.07.4 位置恢复失效需说明原因,例如内容已被删除或重排 · G4.07.5 跨设备续读需要把位置数据存储在账号侧而非本地状态
  • 相邻G4.03 状态保持 · E5.07 无限滚动 · G4.01 返回栈与返回语义
  • 站内检索scroll anchor · item-based restoration · scroll restoration

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/G4.07.1