当前位置: 首页 > news >正文

再次学习History.scrollRestoration

再次学习History.scrollRestoration

2024-05-23-23-52-40

之前在react.dev的源代码中了解到了这个HIstory的属性,当时写了一篇笔记来记录我对它的理解,现在看来还是一知半解。所以今天打算重新学习一下这个属性,主要从属性以及所属对象的介绍、使用方法,是否开启标准这几个方面来简单展开。

什么是scrollRestoration

scrollRestoration是一个属性,它所属的实例是浏览器的History。

这个属性是做什么的?它用来控制我们在切换历史页面的时候,滚动条的位置会不会恢复到之前的位置。
请添加图片描述

如图所示,我们切换历史页面,又切换回最之前的页面,发现滚动条的位置依然保持底部,也就是之前的位置。

什么是切换历史页面,从操作上来讲就是点击浏览器的回退(有的浏览器长按回退键会弹出历史的前面多个页面供选择)、前进按钮

从代码上来讲就是执行下面的这些操作:

history.back()
history.forward()
history.go(page) // page大于0,表示往后面翻对应的页数,反之则是往前翻对应的页数

那么scrollRestoration这个属性与是否恢复滚动条的关系是什么?

scrollRestoration可选的值为auto和manual (如果浏览器支持这个属性,那么它默认是auto)

scroll restoration mode, a scroll restoration mode, initially “auto”. HTML Standard

如果是auto:那么在切换历史页面的时候,滚动条会自动地恢复到切换之前的位置。

如果是manual:那么在切换页面的时候,滚动条会在顶部。

(上述的结果均在未手动修改state对应的滚动条位置的情况下)

属性的局限性

我之前觉得这个特性很好,但是为什么要单独地设置一个属性来控制是否要恢复到之前的滚动条位置呢?

在History API - 滚动恢复 | Blog | Chrome for Developers这篇文章中提到:

This often means unsightly jumps as the scroll position changes automatically, and especially so if your app does transitions, or changes the contents of the page in any way. Ultimately this leads to an horrible user experience.
To make matters even worse there’s very little you can do about it: Chrome triggers a popState event before the scroll event, which means you can read the current scroll position in popState and then reverse it in the scroll event handler with window.scrollTo (Ewww, but at least it works!). Firefox, however, triggers the scroll event before popState, so you have no idea what the old scroll value was in order to restore it. Bah!

翻译为中文:

这通常意味着当滚动位置自动改变时会出现难看的跳动,尤其是当你的应用程序进行过渡或以任何方式更改页面内容时。这最终会导致糟糕的用户体验。
更糟的是,你几乎无能为力:Chrome 会在 scroll 事件之前触发 popState 事件,这意味着你可以在 popState 中读取当前的滚动位置,然后在 scroll 事件处理程序中使用 window.scrollTo 恢复滚动位置(呃,但至少它能工作!)。然而,Firefox 则是在 popState 事件之前触发 scroll 事件,所以你无法知道旧的滚动位置以便恢复它。唉!

总结一下就是,此文的作者认为这个属性会造成的两个缺点是:

  1. 可能产生不太美观的跳跃:当滚动位置自动改变时,页面内容可能会突然跳动,尤其是在应用程序进行过渡或更改页面内容时,这会导致不好的用户体验。
  2. (在不开启这个属性的时候)非常难以人工地实现恢复滚动位置:由于不同浏览器在触发 popState 和 scroll 事件的顺序上存在差异(如 Chrome 和 Firefox),这使得在所有浏览器中一致地恢复滚动位置变得非常困难。

那么什么时候需要设置为manual?

参考上面的两个缺点来说,当满足以下的条件的时候,可以考虑设置为manual

  1. 页面确实会产生了不太美观的跳跃
  2. 不在意历史的滚动条位置,同时更希望全部由手动控制滚动条位置的时候

参考的资料

History: scrollRestoration property - Web APIs | MDN

HTML Standard

相关文章:

  • 在Spring中自定义事件及发布与监听
  • 【LeetCode】438.找到字符串中所有字母异位词
  • 18 - grace数据处理 - 补充 - 地下水储量计算过程分解 - 地表水储量变化Glads水文数据处理
  • Python 实现Word (DOC或DOCX)与TXT文本格式互转
  • 【相机标定系列】【相机模型】SLAM 中常用的相机模型畸变模型总结
  • SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测
  • Rust腐蚀怎么用服务器一键开服联机教程
  • Github 2024-05-21 开源项目日报 Top10
  • 【并发小知识】
  • Redis 中 List 数据结构详解
  • 2023、2024国赛web复现wp
  • 【vue】el-select选择器实现宽度自适应
  • Py列表(list)
  • 2024/5/28 P1247 取火柴游戏
  • 【Linux学习】进程间通信 (3) —— System V (1)
  • 5、React组件事件详解
  • CAP理论的例子讲解
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Go 语言编译器的 //go: 详解
  • Mybatis初体验
  • nodejs:开发并发布一个nodejs包
  • nodejs调试方法
  • PermissionScope Swift4 兼容问题
  • react 代码优化(一) ——事件处理
  • springboot_database项目介绍
  • tab.js分享及浏览器兼容性问题汇总
  • Travix是如何部署应用程序到Kubernetes上的
  • 初识 beanstalkd
  • 初探 Vue 生命周期和钩子函数
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 漂亮刷新控件-iOS
  • 深度学习中的信息论知识详解
  • - 转 Ext2.0 form使用实例
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​虚拟化系列介绍(十)
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #QT(QCharts绘制曲线)
  • (1)(1.13) SiK无线电高级配置(六)
  • (10)ATF MMU转换表
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (20050108)又读《平凡的世界》
  • (AngularJS)Angular 控制器之间通信初探
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Forward) Music Player: From UI Proposal to Code
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)pulsar安装在独立的docker中,python测试
  • (二)构建dubbo分布式平台-平台功能导图
  • (六)软件测试分工
  • (三)SvelteKit教程:layout 文件
  • (十八)三元表达式和列表解析
  • (一)UDP基本编程步骤
  • (正则)提取页面里的img标签
  • (转载)跟我一起学习VIM - The Life Changing Editor