前端面試題目---頁面抖動的原因、如何避免、如何解決

前端頁面抖動是一個常見且影響用戶體驗的問題,下面將從抖動發生的場景、解決辦法以及預防措施三個方面進行詳細闡述。

頁面抖動發生的場景

1. 元素尺寸動態變化
  • 圖片加載:當頁面中圖片的寬高沒有預先設定,在圖片加載完成后,其實際尺寸會撐開所在容器,導致周圍元素位置發生變動,從而產生頁面抖動。例如,在一個新聞列表中,圖片占位區域初始高度為 0,圖片加載完成后撐開高度,列表會整體向下移動。
  • 內容動態更新:像一些實時更新數據的頁面,如股票行情頁面,當數據更新時,顯示數據的元素內容長度改變,會使元素寬度或高度變化,引發頁面抖動。
2. 滾動條出現或消失
  • 內容溢出:當頁面內容超過可視區域高度或寬度時,滾動條會出現;而當內容減少到不溢出時,滾動條又會消失。滾動條的出現和消失會占據一定的寬度(垂直滾動條)或高度(水平滾動條),導致頁面布局發生微小變化,產生抖動。
  • 模態框彈出:當模態框彈出時,頁面的滾動會被禁止,滾動條消失;模態框關閉后,滾動條又會重新出現,這一過程會造成頁面抖動。
3. CSS 動畫和過渡
  • 動畫計算誤差:在使用 CSS 動畫或過渡效果時,由于瀏覽器的渲染計算存在一定誤差,可能會導致元素在動畫過程中出現輕微的位置偏移或抖動。例如,在一個元素的旋轉動畫中,可能會出現旋轉不流暢的抖動現象。
  • 動畫觸發條件:當動畫的觸發條件頻繁變化時,如鼠標懸停在元素上觸發動畫,鼠標快速進出元素,會使動畫不斷開始和停止,導致頁面抖動。
4. 瀏覽器重排和重繪
  • 頻繁操作 DOM:在 JavaScript 中頻繁修改 DOM 元素的樣式、添加或刪除元素等操作,會觸發瀏覽器的重排和重繪。重排是指瀏覽器重新計算元素的布局信息,重繪是指重新繪制元素的外觀。頻繁的重排和重繪會導致頁面抖動。例如,在一個循環中不斷修改元素的寬度和高度。
  • 響應式布局切換:當瀏覽器窗口大小改變時,響應式布局會根據不同的媒體查詢規則重新調整元素的布局,這一過程可能會觸發多次重排和重繪,引起頁面抖動。

解決頁面抖動問題的方法

1. 針對元素尺寸動態變化
  • 預設圖片尺寸:在 HTML 或 CSS 中為圖片設置固定的寬度和高度,這樣在圖片加載過程中,占位區域的大小不會改變,避免頁面抖動。例如:

html

<img src="example.jpg" width="300" height="200" alt="Example Image">
  • 使用占位符:在內容動態更新前,先顯示占位符元素,占位符的尺寸與實際內容的尺寸一致,等內容加載完成后再替換占位符,保證頁面布局穩定。
2. 針對滾動條出現或消失
  • 固定滾動條:可以通過 CSS 強制頁面始終顯示滾動條,避免滾動條出現和消失帶來的布局變化。例如:

css

html {overflow-y: scroll;
}
  • 模態框處理:在模態框彈出時,給頁面添加一個類名,通過 CSS 讓頁面的內容區域可以在模態框內滾動,而不影響頁面整體的滾動條狀態。
3. 針對 CSS 動畫和過渡
  • 優化動畫代碼:檢查 CSS 動畫和過渡的代碼,確保動畫的關鍵幀和過渡屬性設置合理,避免出現不必要的計算誤差。例如,使用 transform 屬性進行動畫操作,因為 transform 不會觸發重排,性能更好。

css

.element {transition: transform 0.3s ease;
}
.element:hover {transform: scale(1.1);
}
  • 防抖和節流:對于頻繁觸發的動畫事件,如鼠標懸停事件,可以使用防抖和節流技術來限制事件的觸發頻率,避免動畫的頻繁開始和停止。
4. 針對瀏覽器重排和重繪
  • 批量修改 DOM:將多次 DOM 操作合并為一次,減少重排和重繪的次數。例如,先創建一個文檔片段,在文檔片段中進行所有的 DOM 操作,最后將文檔片段添加到頁面中。

javascript

const fragment = document.createDocumentFragment();
const newElement = document.createElement('div');
newElement.textContent = 'New Content';
fragment.appendChild(newElement);
document.body.appendChild(fragment);
  • 緩存布局信息:在 JavaScript 中,如果需要多次讀取元素的布局信息(如寬度、高度、位置等),可以先將這些信息緩存起來,避免多次讀取觸發重排。

避免頁面抖動問題的預防措施

1. 前端開發規范
  • 合理規劃布局:在設計頁面布局時,充分考慮元素的尺寸和位置變化,避免因內容動態更新或圖片加載等因素導致布局不穩定。
  • 使用響應式設計:采用響應式設計原則,確保頁面在不同設備和屏幕尺寸下都能保持穩定的布局。同時,合理設置媒體查詢斷點,避免頻繁的布局切換。
2. 性能優化
  • 圖片優化:對圖片進行壓縮和裁剪,減少圖片的加載時間和文件大小。同時,根據不同的設備和屏幕分辨率,提供不同尺寸的圖片,避免圖片過大或過小導致的布局問題。
  • 代碼壓縮和合并:壓縮和合并 CSS 和 JavaScript 文件,減少文件的請求數量和大小,提高頁面的加載速度,降低因資源加載導致的頁面抖動風險。
3. 測試和調試
  • 多瀏覽器和設備測試:在不同的瀏覽器和設備上進行頁面測試,檢查是否存在頁面抖動問題。不同瀏覽器的渲染引擎和性能表現可能會有所差異,及時發現并解決兼容性問題。
  • 性能監測工具:使用瀏覽器的開發者工具和性能監測工具,如 Chrome DevTools 中的 Performance 面板,分析頁面的性能瓶頸和重排重繪情況,提前發現并優化可能導致頁面抖動的問題。

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

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

相關文章

vue知識點3

1.使用componenent的好處 符合高內聚&#xff0c;低耦合。一個組件出問題了&#xff0c;不會影響其他組件。 2.vue版本決定了一些使用框架的版本 vue2使用的路由版本只能到3 3.路由的配置介紹一下 a.安裝路由的插件 npm install vue-router3 b.整理文件路徑 將路徑整理…

如何測試和驗證CVE-2024-1430:Netgear R7000 路由器信息泄露漏洞分析

CVE-2024-1430 是一個影響 Netgear R7000 路由器的安全漏洞&#xff0c;漏洞來源于該路由器 Web 管理界面的信息泄露問題。攻擊者通過訪問 /currentsetting.htm 文件&#xff0c;可能泄露敏感信息&#xff0c;如 Wi-Fi 密碼等。 在測試和驗證 CVE-2024-1430 時&#xff0c;您需…

數據結構:哈夫曼樹

1.概念 哈夫曼樹&#xff08;Huffman Tree&#xff09;是一種用于數據壓縮的二叉樹&#xff0c;由大衛哈夫曼&#xff08;David A. Huffman&#xff09;于1952年提出。它通過構建最優二叉樹來實現數據的高效壓縮&#xff0c;廣泛應用于文件壓縮、圖像壓縮等領域。 哈夫曼樹的…

UE5.2后 Bake Out Materials失效

這個問題出現在5.3&#xff0c;5.4&#xff0c;5.5沒有測試 烘焙貼圖后會找不到貼圖位置&#xff0c; 這個是5.2的正常狀態 默認是生成在模型當前目錄里&#xff0c;包括新的材質 但是這個bug會讓材質和貼圖都消失&#xff0c;無法定位 暫時沒有辦法解決&#xff0c;等官方 …

ADC 的音頻實驗,無線收發模塊( nRF24L01)

nRF24L01 采用 QFN20 封裝&#xff0c;有 20 個引腳&#xff0c;以下是各引腳的詳細介紹&#xff1a; 1. 電源引腳 ? VDD&#xff1a;電源輸入端&#xff0c;一般接 3V 電源&#xff0c;為芯片提供工作電壓&#xff0c;供電電壓范圍為 1.9V&#xff5e;3.6V。 ? VSS&#xf…

基于HTML5 Canvas 和 JavaScript 實現的煙花動畫效果

以下是一個使用 HTML5 Canvas 和 JavaScript 實現的煙花動畫效果代碼盒子: <!DOCTYPE html> <html> <head><title>煙花效果

C++課程設計 運動會分數統計(含源碼)

C++課程設計 運動會分數統計 一、題目描述(一)問題描述(二)基本要求二、程序設計文檔1. 項目概述1.1 項目背景1.2 功能需求1.3 非功能需求2. 系統設計2.1 數據結構設計2.1.1 `School` 結構體2.1.2 `Project` 結構體2.2 功能模塊設計2.2.1 主菜單2.2.2 輸入/修改項目成績2.2…

【音視頻】RTSP拉流: RTP負載AAC詳解(三)

此文為系列文章&#xff0c;此系列主要講解RTSP客戶端的拉流及播放&#xff0c;文章持續更新&#xff0c;會從rtsp的基本協議講起&#xff0c;如何一步步實現音視頻的拉流過程&#xff0c;包括一系列涉及到的協議&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

Dockerfiles 的 Top 10 常見 DevOps/SRE 面試問題及答案

1. RUN 和 CMD 之間有什么區別&#xff1f; RUN : 在鏡像構建過程中執行命令&#xff0c;創建一個新的層。通常用于安裝軟件包。 示例: RUN apt-get update && apt-get install -y curlCMD : 指定容器啟動時默認運行的命令。它在運行時執行&#xff0c;而不是在構建過程…

【ARM】JTAG接口介紹

1、 文檔目標 對 JTAG 接口有更多的認識&#xff0c;在遇到關于 JTAG 接口問題時有一些排查的思路。 2、 問題場景 在使用調試器過程時&#xff0c;免不了要接觸到 JTAG 接口&#xff0c;當出現連接不上時&#xff0c;就不知道從哪來進行排查。 3、軟硬件環境 1 軟件版本&am…

opencascade 獲取edge起始點 會出現終點與實際不同的情況

在使用 OpenCASCADE 獲取 TopoDS_Edge 的起始點和終點時&#xff0c;可能會出現終點與實際不一致的情況。這通常是由于以下原因導致的&#xff1a; 幾何曲線的方向問題&#xff1a;在某些情況下&#xff0c;幾何曲線的方向可能與拓撲邊的方向不一致&#xff0c;導致通過幾何曲線…

【電腦】u盤重裝win7

u盤必須8GB以上 1. CPU型號 首先查看CPU的型號看看到底能不能裝win7 2. 下載光盤映像文件 網址 看電腦是多少位的機器(32位下載x86 64位下載x64) 一共是這么多個版本按需下載對應的版本 電腦小白推薦無腦下載旗艦版 將鏈接復制到迅雷進行下載 3. 下載軟碟通 網址 下…

C++-AVL樹

一、AVL樹的概念 1.二叉搜索樹 二叉搜索樹&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也稱二叉排序樹或二叉查找樹。 二叉搜索樹&#xff1a;一棵二叉樹&#xff0c;可以為空&#xff1b;如果不為空&#xff0c;滿足以下性質&#xff1a; 非空左子…

【網絡安全 | 漏洞挖掘】后端接受非預期參數的故事

未經許可,不得轉載。 文章目錄 正文正文 在對某項目進行測試時,我遵循了一套系統化的方法論,以確保全面理解其安全性。 首先,我創建了一個賬戶,并從用戶的角度探索主域及其各項功能。此階段,我避免使用 Burp Suite 或其他工具,而是嘗試真正理解該應用的設計邏輯與交互…

01.01、判定字符是否唯一

01.01、[簡單] 判定字符是否唯一 1、題目描述 實現一個算法&#xff0c;確定一個字符串 s 的所有字符是否全都不同。 在這一題中&#xff0c;我們的任務是判斷一個字符串 s 中的所有字符是否全都不同。我們將討論兩種不同的方法來解決這個問題&#xff0c;并詳細解釋每種方法…

w208基于spring boot物流管理系統設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

《剛剛問世》系列初窺篇-Java+Playwright自動化測試-22- 操作鼠標拖拽 - 下篇(詳細教程)

1.簡介 上一篇中&#xff0c;宏哥說的宏哥在最后提到網站的反爬蟲機制&#xff0c;那么宏哥在自己本地做一個網頁&#xff0c;沒有那個反爬蟲的機制&#xff0c;谷歌瀏覽器是不是就可以驗證成功了&#xff0c;宏哥就想驗證一下自己想法&#xff0c;其次有人私信宏哥說是有那種…

神經網絡常見激活函數 8-SELU函數

SELU 縮放指數線性單元&#xff1a;SELU&#xff08;Scaled Exponential Linear Unit&#xff09; 函數導函數 SELU函數 S E L U ( x ) { λ x x > 0 λ α ( e x ? 1 ) x ≤ 0 \rm SELU(x) \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alph…

【Elasticsearch】多字段查詢方式匯總

在 Elasticsearch 中&#xff0c;實現多字段查詢的常見方式有以下幾種&#xff0c;每種方式適用于不同的場景&#xff1a; --- ### 1. **multi_match 查詢** - **用途**&#xff1a;在多個字段中執行同一查詢&#xff0c;支持多種匹配策略。 - **關鍵參數**&#xff1a…

多線之旅:wait 與 notify

今天小編繼續來分享下多線程中的一些內容。 在多線程環境下&#xff0c;由于線程調度的不確定性&#xff0c;所以我們有時候無法很好的去保證其線程的執行順序。 但是呢&#xff0c;我們又要實現這個順序執行&#xff0c;所以我們可以使用到這兩個方法&#xff0c;wait 和 no…