深入理解重排(Reflow)與重繪(Repaint),寫出高性能 CSS 動畫

在前端開發中,CSS 動畫是提升用戶體驗的重要手段,但很多開發者在使用動畫時并不了解瀏覽器背后的渲染機制,導致動畫卡頓甚至影響整體性能。本文將帶你深入理解 CSS 中的兩大核心概念 —— 重排(Reflow)重繪(Repaint),并掌握如何編寫高性能的 CSS 動畫。


在這里插入圖片描述

一、什么是 Reflow(重排)?

重排是指瀏覽器在渲染過程中,重新計算元素的幾何結構(位置、大小、盒模型)的過程。

會觸發 Reflow 的典型操作:

  • 修改幾何類屬性:widthheightmarginpaddingborder
  • 位置屬性:topleftbottomright
  • 布局屬性:displaypositionoverflow
  • DOM 操作:添加、刪除、修改節點
  • 讀取某些屬性(如 offsetTop, scrollHeight 等)會強制觸發 reflow

?? 重排是瀏覽器渲染中最昂貴的操作之一,可能導致整個頁面重新計算布局,開銷巨大。


二、什么是 Repaint(重繪)?

重繪是指元素樣式發生改變(如顏色、透明度、陰影等)而不影響布局的情況下,瀏覽器重新將像素繪制到屏幕的過程。

會觸發 Repaint 的典型屬性:

  • color
  • background
  • box-shadow
  • visibility
  • border-color
  • opacity(僅重繪,不重排)

Repaint 相比 Reflow 成本較低,但在短時間內大量觸發仍會影響性能。


三、最推薦的動畫屬性:Composite-only 屬性

有一類動畫屬性不會觸發 Reflow 或 Repaint,而是直接由 GPU 圖層合成完成,性能極佳:

? 推薦動畫屬性:

  • transform ?
  • opacity ?
  • filter(部分瀏覽器可能仍會 repaint)

推薦寫法:

.box {will-change: transform, opacity;transition: transform 0.3s ease, opacity 0.2s ease;
}

四、常見動畫屬性性能比較

屬性名會觸發性能建議
transformComposite? 推薦
opacityComposite? 推薦
left/top 等定位屬性Reflow+Repaint? 慎用
width/heightReflow+Repaint? 慎用
background-colorRepaint?? 一般
box-shadowRepaint?? 一般

五、不要濫用 transition: all

雖然 transition: all 0.3s ease; 寫起來簡單,但它有以下幾個問題:

  1. 性能差:會監聽所有可動畫屬性
  2. 不可控:有些屬性其實不能動畫(比如 display),容易產生混亂
  3. 調試難:不清楚到底哪些屬性在執行動畫

? 推薦寫法:

transition: transform 0.3s ease, opacity 0.2s ease;

六、實戰建議總結

  • ? 動畫盡量只使用 transformopacity
  • ? 使用 will-change 提前告訴瀏覽器優化這些屬性
  • ? 避免 left/top/width/height 動畫,改用 transform: translate()scale() 替代
  • ? 不要使用 transition: all

通過理解 Reflow 與 Repaint 的工作機制,我們可以編寫出更高效、更流暢的 CSS 動畫,提升用戶體驗的同時,降低性能消耗。如果你在動畫性能上遇到具體問題,也歡迎留言或繼續交流!

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

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

相關文章

<貪心算法>

前言:在主包還沒有接觸算法的時候,就常聽人提起“貪心”,當時是layman,根本不知道說的是什么,以為很難呢,但去了解一下,發現也不過如此嘛(bushi),還以為是什么高級東西呢…

大模型快速 ASGI 服務器uvicorn

基礎概念類 1. 什么是 Uvicorn,它的作用是什么? 答案:Uvicorn 是一個基于 Python 的快速 ASGI(異步服務器網關接口)服務器。它的主要作用是作為 Web 應用程序的服務器,負責接收客戶端的請求,并…

2025高頻面試算法總結篇【二叉樹】

文章目錄 直接刷題鏈接直達非遞歸實現求二叉樹的深度非遞歸從左至右打印一顆二叉樹中的所有路徑判斷平衡二叉樹二叉搜索樹中第K小的元素二叉樹的完全性檢驗根據前&中序遍歷結果重建二叉樹二叉樹的最近公共祖先二叉樹的直徑二叉樹的遍歷 直接刷題鏈接直達 非遞歸實現求二叉…

redis 和 MongoDB都可以存儲鍵值對,并且值可以是復雜json,用完整例子分別展示說明兩者在存儲json鍵值對上的使用對比

Redis 存儲 JSON 鍵值對示例 存儲操作: // 存儲用戶信息(鍵:user:1001,值:JSON對象) SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介紹幾種創意登錄頁(含完整源碼)

今天為大家收集了幾種不同風格的登錄頁,搭配動態漸變背景,效果絕對驚艷! CSS3實現動態漸變玻璃擬態登錄頁 一、開篇語 純CSS實現當下最火的玻璃擬態(Morphism)風格登錄頁,搭配動態漸變背景,效果絕對驚艷! …

R語言之mlr依賴包缺失警告之分析

因為本地沒有網絡,所有相關的依賴包都是手動下載,再使用腳本一鍵安裝的。 在使用mlr包時,執行下面的代碼時,總是報各種依賴缺失,也不知道咋看FAIL信息。 # 建模與調參 # 查閱線性回歸、隨機森林、xgboost和KNN四種模…

無狀態版的DHCPv6是不是SLAAC? 筆記250405

無狀態版的DHCPv6是不是SLAAC? 筆記250405 無狀態版 DHCPv6 不是 SLAAC,但二者在 IPv6 網絡中可協同工作。以下是核心區別與協作關系: 本質區別 特性SLAAC無狀態 DHCPv6主要功能生成 IPv6 地址(基于路由器通告的前綴)分發 DNS、…

uniapp微信小程序地圖marker自定義氣泡 customCallout偶爾顯示不全解決辦法

這個天坑問題,在微信開發工具上是不會顯示出來的,只有在真機上才會偶爾出現隨機樣式偏移/裁剪/寬長偏移,詢問社區也只是讓你提交代碼片段,并無解決辦法。 一開始我懷疑是地圖組件加載出現了問題,于是給地圖加了一個v-if"reL…

LabVIEW商業軟件開發注意問題

在 LabVIEW 商業軟件開發進程中,性能優化、界面設計及兼容性與擴展性,對軟件品質、用戶體驗和市場適配性起著決定性作用。下面,借助多個LabVIEW 編程特性的實際案例,深入分析這些方面的開發要點。 一、性能優化:提升軟…

Ubuntu 安裝 VLC

最近項目中需要用VLC查看NVR下子設備的RTSP流,特此記錄,便于日后查閱。 1、安裝snap $ sudo apt update $ sudo apt install snapd 2、安裝vlc $ sudo snap install vlc 3、可能遇到的問題 snap beta install on ubuntu 22.04 failing to start Qt: Se…

LeetCode 3047 求交集區域內的最大正方形面積

探尋矩形交集中的最大正方形面積 在算法與數據結構的探索之路上,二維平面幾何問題一直占據著獨特的地位,它們不僅考驗我們的空間思維能力,還要求我們能夠巧妙地運用算法邏輯。今天,我們將深入剖析一道極具代表性的二維平面幾何算…

【Kafka基礎】Kafka 2.8以下版本的安裝與配置指南:傳統ZooKeeper依賴版詳解

對于仍在使用Kafka 2.8之前版本的團隊來說,需要特別注意其強依賴外部ZooKeeper的特性。本文將完整演示傳統架構下的安裝流程,并對比新舊版本差異。 1 版本特性差異說明 1.1 2.8 vs 2.8-核心區別 特性 2.8版本 2.8-版本 協調服務 可選內置KRaft模式 …

springboot+easyexcel實現下載excels模板下拉選擇

定義下拉注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface ExcelDropDown {/*** 固定下拉選項*/String[] source() default {};/*** 動態數據源key(從上下文中獲取)*/String sourceMethod() default "";…

第15周:注意力匯聚:Nadaraya-Watson 核回歸

注意力匯聚:Nadaraya-Watson 核回歸 Nadaraya-Watson 核回歸是一個經典的注意力機制模型,它展示了如何通過注意力權重來對輸入數據進行加權平均。以下是該內容的核心總結: 關鍵概念 注意力機制框架:由查詢(自主提示…

adb devices報錯 ADB server didn‘t ACK

ubuntu下連接手機首次使用adb devices 報錯ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…

Mac下Homebrew的安裝與使用

Mac下Homebrew的安裝與使用 一蓑煙羽 關注 2017.10.19 11:59* 字數 515 閱讀 7684評論 0喜歡 3 Homebrew簡介,安裝與使用 簡介 Homebrew 官方網站 Homebrew是一個包管理器,用于安裝Apple沒有預裝但你需要的UNIX工具。(比如著名的wget&am…

非常適合做后臺項目的go腳手架

分享一個非常適合做后臺腳手架的go項目,該項目使用gin作為mvc框架搭建。她就是Gin-vue-admin。該一個基于 vue 和 gin 開發的全棧前后端分離的開發基礎平臺,集成jwt鑒權,動態路由,動態菜單,casbin鑒權,表單…

優化 Django 數據庫查詢

優化 Django 數據庫查詢 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 優化 Django 數據庫查詢**理解 N+1 查詢問題****`select_related`:外鍵的急加載**示例何時使用 `select_re…

大數據(5)Spark部署核彈級避坑指南:從高并發集群調優到源碼級安全加固(附萬億級日志分析實戰+智能運維巡檢系統)

目錄 背景一、Spark核心架構拆解1. 分布式計算五層模型 二、五步軍工級部署階段1:環境核彈級校驗階段2:集群拓撲構建階段3:黃金配置模板階段4:高可用啟停階段5:安全加固方案 三、萬億級日志分析實戰1. 案例背景&#x…

【學Rust寫CAD】36 顏色插值函數(alpha256.rs補充方法)

源碼 pub fn alpha_lerp(self,src: Argb, dst: Argb, clip: u32) -> Argb {self.alpha_mul_256(clip).lerp(src, dst)}這個函數 alpha_lerp 是一個顏色插值(線性插值,lerp)函數,它結合了透明度混合(alpha_mul_256&…