1. 动画过渡
Ralltiir 的一大功能就是页面切换效果,减少用户等待的焦虑感。
虽然面临着不完善的异步 API,以及各种 transition
相关的兼容性问题,
我们仍然要在尽量多的浏览器上提供体验不错的页面过渡态。
本文介绍过渡态的实现,兼容性问题,以及对应的降级方式。
1.1. 实现方案
页面切换动画分为入场、退场和没有动画三种:
- 当用户点击一个链接时发生页面入场。
- 当用户点击我们提供的返回按钮时页面退场。
- 当用户使用浏览器前进后退(包括手势),现在 Ralltiir 还不能得知是前进还是后退,不做动画效果。
入场为从右向左划入,退场为入场的逆向操作。下文都以入场动画为例。 入场动画使用 CSS Transition 实现,步骤如下(以下步骤与网络请求是并发的):
- 渲染新浮层。使用 注册时提供的配置 渲染一个 view(
position:fixed
)。 - 保持滚动位置。滚动新的浮层,使得
fixed
前后视觉位置一致。 - 入场动画。让浮层从右向左做
transition
。 - 渲染页面。等待网络请求结束后,渲染结果 HTML 至浮层上。
- 隐藏旧页面。隐藏上一个页面的 view。
- 恢复滚动位置。恢复当前 view 的
position
相关属性。
退场动画有一个额外的工作:离开时保存浏览位置(scrollTop
, scrollLeft
),返回到时恢复浏览位置。
1.2. 兼容性与降级
在有些浏览器下动画的实现可能有兼容问题,这时会根据 UA 进行相应降级。
1.2.1. 保持滚动位置
下面的浏览器中保持滚动位置会导致页面跳动:
- iOS 下,UIWebview 的浏览器中
解决方案:Ralltiir 不保持滚动位置,视觉上表现为页面滚到顶后进行退场动画。
1.2.2. 后退按钮失效
在 iOS 11,Safari 内核的浏览器中,页面 load
事件会阻塞 popstate
的触发。
导致页面未完全载入时,后退按钮无效。
解决方案:Ralltiir 暂无方案,建议相关页面优化首屏时间。