By Paul Lewis(设计和性能倡导者) 翻译:江天html
使用history api管理url是很是棒的一件事,能够说这是一个好web app的极为重要的特色。但它有一个缺点,滚动位置虽然被存储但更重要的是,当history来回循环的时候的存储。这种状况每每意味着当滚动位置自动改变的时候很难看的跳转,特别是当你的app发生变迁,或者是页面内容发生了任何改变,基本上都会致使很是糟糕的用户体验。html5
为了减小这种糟糕体验你能作的很少。chrome在触发scroll事件前会先出发popState事件,这意味着你能够去popState中读取到当前滚动位置,而后反向运用到scroll事件句柄上,使用window.scrollTo(至少能工做)。但firefox,先出发scroll事件,再是popstate,老的scroll值你毫无办法获取到,甭谈储存下来。呸!git
好消息是,这有个潜在的办法,history.scrollRestoration。它提供两个值,auto,做为它的默认值,能够像你所见的大多数状况同样工做,另外一个manual,意味着做为一个开发者你拥有了自主掌控任何所需的scroll改变,当用户循环往复于app的history中。若是须要,你能够跟踪scroll的位置轨迹,当你使用history.pushState(),push history的时候。github
这个特色是html5新增的实验性质的api,虽然很炫。所以你在使用的时候须要确保浏览器是支持的,检测代码:
if ('scrollRestoration' in history) {
// Back off, browser, I got this...
history.scrollRestoration = 'manual';
}web
该api在chrome 46以上被支持,接口文档:https://majido.github.io/scroll-restoration-proposal/history-based-api.html#web-idlchrome