F2.13.2preserve scroll and input across rotation设计

旋转需保持滚动位置与输入状态

别名: 旋转状态 · orientation state · 滚动锚点

概念解释

文章读到六成,一转,回到了标题。结账表单填了一半,一转,键盘收了、焦点没了、字段被顶到键盘底下。横竖切换若把页面当一次新导航来建,滚动像素和输入都不在了。旋转必须保住你在哪、正在写什么,而不是重开一局。

可达区怎么变是上一张的几何;这一张只问状态有没有活过重排。

机制

方向变化常被实现成整棵视图重建,尤其是横竖用了两套完全不同的树。滚动偏移是旧布局里的像素 y,树一拆就作废。要活过重排,锚必须是内容身份:还在看这一行、光标还在这个字段的第 n 个字符,而不是「距顶 1840 px」。输入状态住在会被卸掉的组件里,不先抽出再灌回去,就会丢。

键盘弹出叠在旋转上更糟:新布局的可视高度不同,原先躲开键盘的滚动补偿失效,焦点字段被盖住。模态、播放进度、多选集合同理,都属于必须搬家的状态,不是装饰。

边界

横竖是两套完全不同的应用(相机取景 vs 相册、游戏关卡 vs 菜单),有时本来就要重置。即便如此,正在录的片段、正在写的备注不该丢。网页若整页刷新来响应 orientationchange,状态保不住是架构问题,布局技巧救不了。

第一屏就很短、没有滚动也没有输入的营销页,保不保无所谓。工具页、阅读、表单、媒体才是重灾。

怎么落地

  • 旋转时按内容锚恢复:列表记住可见的第一条 id,文档记住滚动比例或块 id,表单记住焦点字段和光标。
  • 不要在旋转时卸载正在编辑的字段;键盘若被系统收起,转完后把焦点和滚回补偿一起做回去。
  • 验证:列表滚到大约 60%,在一个字段里输入未提交的字,打开一个模态,旋转两个方向再转回来。同一条仍应在视野里,字和光标还在,模态还开着。任一丢失,查是哪一层被重建却没有把状态写回。再在键盘打开时转一次,确认焦点字段仍在键盘上方可见。

延伸

  • 同组F2.13.1 横屏改变可达区与单手可用性 · F2.13.3 锁定方向需要充分理由
  • 相邻F1.10 键盘弹出后的可视压缩 · F2.11 流式与自适应布局 · F1.06 高频操作的位置稳定性
  • 站内检索orientation change · scroll restoration · caret · view state

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/F2.13.2