再次學習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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14555.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日一題(2)——100~200間的素數

方法一&#xff1a; public class suCount {public static void main(String[] args){int sum0;c1:for(int i100;i<200;i){for(int j2;j<i;j){if(i%j0)continue c1;//continue中斷循環&#xff0c;且返回外層循環&#xff0c;進入下一次遍歷else if(ji-1){System.out.pr…

Linux信號:信號的保存

目錄 一、信號在內核中的表示 二、sigset_t 2.1sigset_t的概念和意義 2.2信號集操作數 三、信號集操作數的使用 3.1sigprocmask 3.2sigpending 3.3sigemptyset 四、代碼演示 一、信號在內核中的表示 實際執行信號的處理動作稱為信號 遞達(Delivery) 。 信號從產生到遞達…

Mysql數據庫——DML操作

目錄 添加數據&#xff08;INSERT&#xff09; 修改數據&#xff08;UPDATE&#xff09; 刪除數據&#xff08;DELETE&#xff09; 添加數據&#xff1a; &#xff08;1). 給指定字段添加數據 &#xff08;2). 給全部字段添加數據 &#xff08;3). 批量添加數據 修改數據: 案例…

【STM32】HAL庫點燈

【STM32】HAL庫點燈 一、探究目標二、探究原理2.1 ST開發庫2.1.1 直接配置寄存器2.1.2 標準外設庫2.1.3 HAL庫2.2 HAL開發2.2.1 環境配置2.2.2 時鐘配置2.2.3 GPIO配置2.2.4 工程創建2.2.5 KEIL代碼![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/bf1c95d5c6724a6a…

NextGen Mirth Connect XStream反序列化遠程代碼執行漏洞(CVE-2023-43208)

0x01 產品簡介 NextGen Mirth Connect是是美國NextGen公司的一個醫療集成引擎,主要用于醫療領域的系統集成和數據交換,支持多種協議和標準。 0x02 漏洞概述 NextGen Mirth Connect 4.4.1之前版本存在遠程代碼執行漏洞,未經身份認證的攻擊者可利用該漏洞遠程執行代碼。 0…

混合組網VS傳統網絡:智能硬件混合組網優劣勢淺要解析

智能硬件混合組網是一種利用多種通信技術相結合的方法&#xff0c;以實現更靈活、更可靠的網絡連接。通過藍牙、Wi-Fi、LoRa、4G相互之間的不同通訊方式&#xff0c;根據應用場景的不同以及現場實際環境&#xff0c;優選最佳物聯網混合組網方案&#xff0c;以達到部署最便捷性價…

一張SSL證書如何同時保護多個域名及其子域名?

在互聯網時代&#xff0c;數據安全和隱私保護變得至關重要&#xff0c;而SSL證書作為確保網站安全的重要工具&#xff0c;其重要性不言而喻。本文將詳細探討一種特殊的SSL證書——多域名通配符SSL證書&#xff0c;它為網站管理員提供了一種高效、經濟的方式來保護多個域名及其子…

學Java以及IDEA工具中遇到的常用單詞

Arithmetic 算術 operator 運算符 relational 關系 logic 邏輯 assign 分配 TernaryOperator 三元運算符、 gender 性別 lebal 標簽 array 數組 two dimesional 二維 object 對象 method 方法 row 行 column 列 parameter 參數 recursion 遞歸 overload 方法重載 calculate 計算…

MyBatis從入門到“入土“

&#x1f495;喜歡的朋友可以關注一下&#xff0c;下次更新不迷路&#xff01;&#x1f495;(●?●) 目錄 一、Mybatis為何物&#xff1f;&#x1f44c; 二、快速入門&#x1f923; 1、新建項目&#x1f60a; 2、數據庫建表&#x1f60a; 3、導入依賴的jar包&#x1f60a;…

Linux學習筆記6

TFTP 服務器搭建和測試 關于TFTP:TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;簡單文件傳輸協議&#xff09;&#xff0c;是一個基于UDP 協議實現 的用于在客戶機和服務器之間進行簡單文件傳輸的協議&#xff0c;適合于開銷不大、不復雜的應用場合 搭建服務器…

后量子密碼的發展和應用

后量子算法&#xff0c;特別是后量子密碼(PQC)&#xff0c;是近年來密碼學領域的一個熱門話題。隨著量子計算技術的快速發展&#xff0c;傳統的公鑰密碼算法面臨著被量子計算機破解的威脅。為了應對這一挑戰&#xff0c;后量子密碼應運而生&#xff0c;成為了一種能夠抵抗量子計…

【論文筆記】| 蛋白質大模型ProLLaMA

【論文筆記】| 蛋白質大模型ProLLaMA ProLLaMA: A Protein Large Language Model for Multi-Task Protein Language Processing Peking University Theme: Domain Specific LLM Main work&#xff1a; 當前 ProLLM 的固有局限性&#xff1a;&#xff08;i&#xff09;缺乏自然…

Redis篇 在linux系統上安裝Redis

安裝Redis 在Ubuntu上安裝Redis 在Ubuntu上安裝Redis 在linux系統中,我們安裝Redis,必須先使它有root權限. 那么在linux中,如何切換到root用戶權限呢? sudo su 就可切換到用戶權限了. 在切換到用戶權限后,我們需要用一條命令來搜索Redis相關的軟件包 apt search redis 會出現非…

ROS2學習——節點話題通信(2)

目錄 一、ROS2節點 1.概念 2.實例 &#xff08;1&#xff09;ros2 run &#xff08;2&#xff09;ros2 node list &#xff08;3&#xff09;remapping重映射 &#xff08;4&#xff09;ros2 node info 二、話題 &#xff08;1&#xff09; ros2 topic list &#xf…

頭歌openGauss-存儲過程第1關:創建存儲過程

編程要求 1、創建第1個存儲過程&#xff0c;并調用&#xff1b; 1&#xff09;創建存儲過程&#xff0c;查詢emp表數據&#xff1b; 2&#xff09;調用存儲過程&#xff1b; --創建存儲過程&#xff0c;獲得計算機&#xff08;cs&#xff09;系學生選課情況并將結果寫入臨時表t…

人臉識別:基于卷積神經網絡(CNN)分類思想的人臉識別系統

本文來自公眾號 “AI大道理” —————— 項目配套視頻課程&#xff1a; 平臺&#xff1a;荔枝微課 鏈接&#xff1a;十方教育 項目地址&#xff1a;https://github.com/AIBigTruth/CNN_faces_recognition 之前很多人來詢問這個項目怎么做&#xff0c;代碼跑不起來&#…

數據庫讀寫分離

實現 MySQL 的讀寫分離主要可以通過以下幾種方式&#xff1a; 一主多從架構&#xff1a; 設置一個主數據庫&#xff08;Master&#xff09;來處理寫操作&#xff08;如 INSERT、UPDATE、DELETE&#xff09;。 設置多個從數據庫&#xff08;Slave&#xff09;來處理讀操作&…

USB數據恢復軟件:輕松找回U盤重要數據!

USB數據丟失的原因 USB數據丟失有一些常見原因&#xff0c;了解這些原因有利于恢復數據。 文件意外刪除病毒攻擊軟件錯誤未安全彈出USB設備格式化USB設備 順便一提&#xff0c;如果你通過快捷鍵“Ctrl D”刪除了數據&#xff0c;那你可以從回收站中還原它們。如果你永久刪除…

Isaac Sim仿真平臺學習(1)認識Isaac Sim

0.前言 上一個教程中我們下載好了Isaac Sim&#xff0c;這一章我們將來簡單了解一下Isaac Sim平臺。 isaac Sim仿真平臺安裝-CSDN博客 1.Isaac Sim是啥&#xff1f; What Is Isaac Sim? — Omniverse IsaacSim latest documentation Isaac Sim是NVDIA Omniverse平臺的機器…

【編譯原理復習筆記】屬性文法

屬性文法 也稱為屬性翻譯文法&#xff0c;由 Knuth 提出&#xff0c;以上下文無關文法為基礎 &#xff08;1&#xff09;為每個文法符號&#xff08;終結符與非終結符&#xff09;配備相關的屬性&#xff0c;代表與該文法符號相關的信息 &#xff08;2&#xff09;屬性文法對于…