CSS【詳解】性能優化

精簡 CSS

  • 移除未使用的 CSS(“死代碼”),可借助工具如 PurgeCSS、UnCSS 自動檢測并刪除未被頁面使用的樣式。
  • 避免重復樣式,通過提取公共樣式(如 @mixin 或公共類)減少代碼冗余。利用預處理器(Sass、Less)變量、混合宏功能減少重復代碼。
  • 避免過度嵌套(如 div > ul > li > a 可簡化為 .nav-link),復雜選擇器會增加瀏覽器匹配元素的計算成本。
  • 避免全局樣式濫用,使用 CSS Modules 或 Scoped CSS(如 Vue)隔離樣式,減少 CSSOM 構建時間。

壓縮 CSS

使用 Gzip 或 Brotli 壓縮傳輸,或通過 PostCSS、csso 等工具壓縮代碼

后處理器(PostCSS)可自動優化代碼(如自動前綴、壓縮、刪除冗余樣式)

拆分 CSS

  • 按頁面或組件拆分 CSS,避免單個超大 CSS 文件阻塞首屏渲染。
  • 利用媒體查詢拆分不同場景的樣式(如 @media print 單獨拆分打印樣式),瀏覽器會根據當前場景只加載必要的部分。

內聯首屏 CSS

將關鍵 CSS(首屏必需樣式)內聯到 <head> 中,避免外部 CSS 文件加載延遲導致的首屏空白。

異步加載非首屏 CSS

  • 通過 JavaScript 動態插入 <link> 標簽

減少觸發重排與重繪的CSS操作

  • 集中修改樣式(如通過添加 / 移除類一次性修改多個樣式,而非逐條設置 element.style)。
  • 避免頻繁讀取會觸發重排的屬性(如 offsetWidth、scrollTop),可先緩存值再使用。

使用性能更好的 CSS 語法

  • 優先使用 ID 或類選擇器,避免使用通配符(*)、屬性選擇器([type=“text”])等低效選擇器,尤其是在大型頁面中。
  • 避免鏈式類選擇器(如 .box.container.large),增加匹配復雜度
  • 瀏覽器匹配選擇器的順序是 “從右到左”,例如 .list li a 會先查找所有 <a>,再過濾父元素為 <li> 且祖先為 .list 的元素,效率較低。
    優化示例:將 .list li a 改為 .list-link(直接給 <a> 添加類)。
  • 對靜態效果可使用圖片代替;對動畫效果盡量在小范圍元素上使用。

content-visibility: auto

延遲渲染不在視口內的元素

瀏覽器會跳過不在視口內元素的渲染過程(包括布局、繪制等),從而減少瀏覽器的工作負擔。

使用場景
長列表、滾動頁面中存在大量離屏元素的情況,例如電商商品列表、新聞資訊列表等。

.list-item {content-visibility: auto;
}

will-change

提前告知瀏覽器元素可能會發生的變化,讓瀏覽器有時間提前做好優化準備(如創建獨立的圖層、預先計算等),從而使動畫或過渡更加流暢。

瀏覽器會根據 will-change 指定的屬性,對元素進行相應的優化處理。但需要注意,不能濫用該屬性,否則可能會消耗過多的內存和性能。

使用場景
即將發生動畫或過渡的元素,例如元素的位置移動、大小變換、透明度變化等。

.box {will-change: transform, opacity;
}

transform

使用 transform 進行動畫或過渡時,瀏覽器會將元素提升到獨立的圖層進行處理,并且不會觸發頁面的重排(布局)和重繪(繪制),只需要進行復合操作,性能更高。

復合操作是將頁面中不同圖層的內容合并成最終的頁面顯示,這個過程相對高效。而重排和重繪會消耗大量的計算資源。

使用場景
各種需要動畫效果的元素,如滑動的輪播圖、彈出的對話框等。

.slide {transition: transform 0.3s ease;
}
.slide:hover {transform: translateX(10px);
}

opacity

使用 opacity 進行動畫或過渡時,也不會觸發重排和重繪,只需要進行復合操作,性能較好。

透明度的變化只影響元素的顯示效果,不會改變元素的布局和幾何形狀,因此瀏覽器可以高效地處理。

使用場景
元素的淡入淡出效果,如模態框的顯示與隱藏、按鈕的 hover 效果等。

.fade {transition: opacity 0.3s ease;opacity: 1;
}
.fade:hover {opacity: 0.5;
}

contain

限制元素內部的渲染影響范圍,告訴瀏覽器該元素的渲染不會影響到外部,從而讓瀏覽器可以進行更高效的渲染優化。

contain 有多個取值,如 layout(表示元素內部的布局變化不會影響外部)、paint(表示元素的繪制只在自身范圍內,不會溢出到外部)、size(表示元素的大小不會受內部內容變化的影響)等。通過合理設置這些值,可以減少瀏覽器需要檢查和更新的區域。

使用場景
內部結構復雜、但與外部布局關聯性較小的元素,例如獨立的組件、卡片等

.component {contain: layout paint size;
}

background-attachment: fixed(謹慎使用)

使背景圖片固定在視口中,不會隨著頁面的滾動而滾動。在某些情況下,合理使用可以減少背景圖片的重繪次數。

但如果背景圖片較大或頁面滾動頻繁,可能會導致性能問題,因此需要謹慎使用,根據實際情況測試效果。

body {background-image: url('bg.jpg');background-attachment: fixed;
}

image-rendering

用于控制圖片縮放時的渲染方式,合理設置可以使圖片在縮放時保持更好的視覺效果,同時在一定程度上減少渲染開銷。

  • auto:默認值,使用瀏覽器默認的圖片縮放算法。
  • pixelated:當圖片放大時,會以像素塊的形式顯示,適合像素風格的圖片,渲染效率較高。

使用場景
需要進行縮放顯示的圖片,尤其是像素風格的圖片。

.pixel-art {image-rendering: pixelated;
}

position: fixed / position: absolute (適度使用)

將元素從文檔流中脫離,其位置變化不會影響其他元素的布局,從而減少因元素移動導致的重排。

固定定位(fixed)或絕對定位(absolute)的元素會獨立計算布局,其尺寸或位置的修改僅影響自身,不會觸發父元素或兄弟元素的布局更新。

使用場景
懸浮組件(如導航欄、彈窗、廣告位),避免其位置變化牽連其他元素的布局計算。

注意事項
過多脫離文檔流的元素可能增加圖層管理成本,需適度使用。

float(合理使用)

浮動元素的布局計算相對獨立,其位置調整對周邊元素的影響范圍較小(僅影響 “浮動流” 內的元素)。

使用場景
圖文混排(如新聞段落中的圖片浮動),避免圖片與文字的布局相互干擾導致頻繁重排。

注意事項
濫用浮動可能導致布局混亂,且現代布局更推薦 flex 或 grid,但特定場景下浮動仍有性能優勢。

pointer-events: none

禁止元素響應鼠標事件(如點擊、 hover 等),瀏覽器無需為該元素監聽鼠標交互,減少事件處理開銷。

元素被設置為 pointer-events: none 后,會被排除在鼠標事件目標之外,瀏覽器無需對其進行事件捕獲和處理。

使用場景
純裝飾性元素(如背景圖案、動畫特效層),無需用戶交互的元素可禁用鼠標事件,提升事件處理效率。

.decorative-layer {pointer-events: none;
}

user-select: none

禁止用戶選中元素內容,減少瀏覽器對文本選中狀態的跟蹤和渲染

瀏覽器默認會監聽文本選中事件并繪制選中高亮,禁用后可減少這部分的渲染開銷。

使用場景
按鈕、圖標、導航等無需復制的元素,避免用戶誤選并降低渲染壓力。

.button {user-select: none;
}

backface-visibility: hidden

隱藏元素旋轉時的 “背面”,減少 3D 變換中的渲染計算,降低 GPU 負載。

使用場景
3D 旋轉動畫(如卡片翻轉效果),無需顯示背面時使用,提升動畫流暢度。

.card {transform-style: preserve-3d;backface-visibility: hidden;
}

isolation: isolate

創建一個新的堆疊上下文,限制元素內部的渲染影響范圍,避免與外部元素的堆疊計算相互干擾。

堆疊上下文是瀏覽器處理元素層疊順序的機制,isolation: isolate 強制創建獨立上下文,減少跨上下文的層疊計算。

使用場景
復雜組件(如彈窗、下拉菜單),避免其內部元素的層疊關系影響頁面其他部分的渲染。

.dropdown {isolation: isolate;
}

overflow: hidden

瀏覽器默認會計算元素所有內容的布局,即使超出容器范圍,overflow: hidden 可讓瀏覽器直接忽略超出部分,降低計算量。

配合 content-visibility: auto 使用時,裁剪效果可進一步提升離屏元素的渲染效率。

使用場景
圖片容器、卡片組件等需要裁剪內容的元素,避免超出部分的無效渲染。

touch-action

瀏覽器對觸摸事件的默認處理(如手勢識別)較為復雜,touch-action 可禁用不必要的行為,提升觸摸交互的響應速度。

使用場景
移動端自定義交互元素(如滑動組件、手勢控制區域),例如禁用滾動:

.swipe-container {touch-action: none; /* 禁用所有默認觸摸行為 */
}

font-display(@font-face 中)

使用 font-display: swap 避免字體加載期間的文本不可見(FOIT);限制字體變體(如字重、樣式)數量,減少字體文件體積。

通過設置字體加載期間的顯示策略(如使用系統默認字體暫代),減少瀏覽器等待字體加載時的渲染阻塞。

使用場景
引入自定義字體時,優化字體加載體驗:

@font-face {font-family: 'MyFont';src: url('myfont.woff2') format('woff2');font-display: swap; /* 加載時使用備用字體,加載完成后替換 */
}

避免使用低性能的 CSS 語法

  • 避免使用通配符(*)、屬性選擇器([type=“text”])等低效選擇器
  • 避免使用過大的背景圖
  • 避免昂貴的 CSS 屬性,部分屬性計算成本高,如 box-shadow(尤其是模糊半徑大時)、filter(如 blur)、clip-path 等,頻繁使用或應用于大面積元素會導致性能下降。
  • CSS 變量(–var)雖靈活,但頻繁通過 JavaScript 讀寫會觸發額外的樣式計算,高頻率交互場景下需謹慎使用。
  • 預處理器(Sass、Less)的嵌套功能需合理使用,避免編譯后生成復雜選擇器;
  • 避免@import:@import會導致 CSS 加載串行化(必須等前一個加載完成才加載下一個),改用<link>并行加載。

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

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

相關文章

Flutter 線程模型詳解:主線程、異步與 Isolate

一、主線程&#xff1a;默認的執行環境 所有代碼默認運行在主線程。下面的例子展示了一個會阻塞主線程的錯誤示范&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});ov…

ChartDB:可視化數據庫設計工具私有化部署

ChartDB:可視化數據庫設計工具私有化部署一、什么是ChartDB ChartDB 是一款基于 Web 的開源數據庫可視化工具&#xff0c;專為簡化數據庫設計與管理流程而開發。以下是其核心特性與功能概述: 1、核心功能 智能查詢可視化?&#xff1a;通過單條 SQL 查詢即可生成數據庫架構圖&a…

單片機-FreeRTOS(ing)

目錄 一、基礎介紹 1.1 調度策略 1.1.1 調度方式 1.1.2 調度器 1.2 任務以及優先級 1.2.1 任務與協程 1.2.2 任務狀態 1.2.3 任務優先級 1.2.4 任務優先級分配方案 1.3 任務間通信 - 信號量 1.3.1 信號量 1.3.2 任務間計數信號量的實現 1.3.3 中斷方式計數信號量的…

為什么調用API總返回404,該如何調試

當調用一個應用程序接口&#xff08;API&#xff09;時&#xff0c;持續地收到“404 未找到”的錯誤&#xff0c;其核心原因在于客戶端發起的“請求”&#xff0c;未能成功地&#xff0c;匹配到服務器上任何一個“真實存在”的、可供訪問的“資源路徑”。這本質上&#xff0c;是…

醫療信息化自主可控轉型的實踐探索 —— 以常德二院為例

目錄 頭雁領航 - 激發醫療新質生產力 核心支撐 - 電科金倉奠定數據底座 生態共建 - 攜手護航醫療信創發展 信創產業發展是國家經濟數字化轉型、提升產業鏈發展的關鍵&#xff0c;是科技自立自強的核心基座&#xff0c;其本質是實現中國信息化產業的自主可控。醫療信創作為關…

Gin傳參和接收參數的方式

Gin查詢參數和接收參數的方式 常用 Gin 綁定方法對比方法用途特點c.Bind()自動識別 Content-Type最通用&#xff0c;根據請求頭自動選擇綁定方式c.ShouldBindJSON()只綁定 JSON強制使用 JSON 格式&#xff0c;類型明確c.ShouldBindXML()只綁定 XML強制使用 XML 格式c.ShouldBin…

MariaDB/MySQL 客戶端工具與服務端配置精要指南

文章目錄一、客戶端與服務端程序二、用戶賬號管理三、MySQL 客戶端命令3.1 命令類型?3.2 使用模式?3.3 常用選項?3.4 提示符定制?四、mysqladmin管理命令??五、服務端配置?5.1 配置文件???5.2 Socket 通信配置??六、最佳實踐總結免費個人運維知識庫&#xff0c;歡迎…

自動化項目日報生成工具測評與選型:如何匹配團隊日報管理需求

引言在項目管理場景中&#xff0c;手動撰寫日報常面臨多重效率瓶頸&#xff1a;任務數據分散在協作群、Excel 表格、項目看板等多個平臺&#xff0c;匯總時需反復核對&#xff1b;不同成員日報格式不統一&#xff0c;管理層整合分析耗時&#xff1b;任務進度與日報信息不同步&a…

基于SpringBoot+Vue的吳韻蘇香文旅小程序(協同過濾算法、Echarts圖形化分析、騰訊地圖API、二維碼識別)

&#x1f388;系統亮點&#xff1a;協同過濾算法、Echarts圖形化分析、騰訊地圖API、二維碼識別&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17小程序&a…

python numpy.random的基礎教程(附opencv 圖片轉數組、數組轉圖片)

目錄 1.在區間[a,b)隨機生成n個整數。 2.在區間[a,b)隨機生成n個數。 3.在區間[0,1)生成隨機數 4.打亂順序 5.從指定的列表中選擇 NumPy&#xff08;Numerical Python&#xff09;是一個開源的科學計算庫&#xff0c;專門用于高效處理多維數組&#xff08;ndarray&#xf…

Vue2.x核心技術與實戰(二)

目錄 三、Vue2.x:生命周期+工程化開發(組件入門) 3.1 生命周期 3.1.1 生命周期 & 生命周期四個階段 3.1.2 生命周期鉤子 Vue生命周期鉤子案例 - 新聞列表 & 輸入框自動聚焦 3.2 綜合案例:小黑記賬清單 3.3 工程化開發入門 3.3.1 工程化開發 & 腳手架Vue …

【鴻蒙心跡】7×24小時極限求生:當Origin_null遇上鴻蒙,我如何用100杯咖啡換一條跨域活路?

文章概要 大家好&#xff0c;我是那個把黑眼圈熬成華為工牌掛繩的倒霉蛋。過去100個夜晚&#xff0c;我在HarmonyOS NEXT的ArkWeb里被Origin:null反復按在地上摩擦——小程序白屏、OPTIONS 400、官方文檔沉默三連擊。最終&#xff0c;我用C、libcurl、OpenSSL和一堆速溶咖啡&am…

【git】刪除一條本地提交的歷史commit

在工程中&#xff0c;如果想要刪除一條本地提交的歷史commit&#xff0c;可以通過droprebase -i HEAD^n的方式。1.情景提交了三條commit&#xff0c;想刪掉第二條commit。git logcommit_id_*******1 commit_id_*******2 commit_id_*******32.解決git rebase -i HEAD~2輸出&…

軟件測試中,JMeter 的作用以及優缺點是什么?

回答重點JMeter 是一款開源的軟件測試工具&#xff0c;主要用來對各種軟件或服務進行性能測試和負載測試。它可以模擬大量用戶同時對服務器、網絡或其他資源發起請求&#xff0c;從而測試它們的響應時間、吞吐量等性能指標。優點&#xff1a;1&#xff09; 開源且免費 &#xf…

STM32存儲結構

我們在使用Keil編譯程序成功后會,有一行各部分占用內存的提示信息,如下Program Size:Code7492 RO-data556 Rw-data72 ZI-data11688,這是stm32代碼編譯后的提示我們分析一下這個編譯輸出&#xff1a;- Code: 7492字節 -> 代碼部分&#xff08;存放在Flash&#xff09;- RO-da…

手機 瀏覽器調用攝像頭掃描二維碼Quagga

注&#xff1a;需用谷歌瀏覽器才能調用權限1. 引入依賴&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】偽列之Version Query:全鏈路追蹤行數據變更的所有記錄(不僅僅是被修改的最后時間)(第二篇,總共六篇)

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

代理模式深度解析:從靜態代理到 Spring AOP 實現

代理模式是軟件開發中一種經典的設計模式&#xff0c;它通過引入 "代理對象" 間接訪問目標對象&#xff0c;從而在不修改目標對象代碼的前提下&#xff0c;實現功能增強&#xff08;如日志記錄、事務管理&#xff09;、權限控制等橫切需求。從簡單的靜態代理到靈活的…

算法 ----- 鏈式

目錄 一 、鏈式 二 、題目 1、兩兩相加 &#xff08;1&#xff09;題目 (3) 代碼書寫 2、兩兩交換鏈表中的節點 &#xff08;1&#xff09;題目 &#xff08;2&#xff09; 解題思路 &#xff08;3&#xff09;代碼書寫 3、重排鏈表 &#xff08;1&#xff09;題目 …

運維監控prometheus+grafana

目錄 一、環境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、驗證、使用 一、環境 系統使用CentOS7虛擬機。 監控三臺服務器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …