css中的性能優化之content-visibility: auto

content-visibility: auto的核心機制是讓瀏覽器智能跳過屏幕外元素的渲染工作,包括布局和繪制,直到它們接近視口時才渲染。這與虛擬滾動等傳統方案相比優勢明顯,只需要一行CSS就能實現近似效果。值得注意的是必須配合`contain-intrinsic-size`屬性使用,否則會導致布局抖動。

這個屬性用來指定未渲染元素的占位尺寸,對于動態內容可能需要JavaScript動態計算更新。性能提升數據很驚人,在1000項列表中初始加載從1200ms降到400ms,甚至提到7倍的渲染性能提升。不過要注意這不會減少網絡請求,與傳統懶加載方案是互補而非替代關系。關于兼容性,指出Chrome 85+、Edge 85+和Safari 15.4+都已支持,但Firefox支持度較差。可訪問性方面,屏幕閱讀器可能無法讀取未渲染內容,需要額外處理。

content-visibility: auto?是 CSS 中一個強大的性能優化屬性,它通過控制瀏覽器渲染內容的范圍,延遲或跳過屏幕外(offscreen)元素的渲染,從而顯著提升頁面的初始加載速度和交互流暢度。

content-visibility: auto?的核心價值在于其能夠智能地跳過屏幕外元素的渲染(包括布局和繪制),同時保留其布局占位空間,并在元素接近視口時自動觸發渲染,從而在減少初始渲染開銷和保持流暢用戶體驗之間取得平衡。

🎯 一、content-visibility: auto?的作用與原理

  • 智能跳過渲染: 當元素設置?content-visibility: auto?后,瀏覽器會跳過其初始屏幕外內容的渲染工作(包括布局和繪制),但會保留其布局占位空間。當元素滾動到接近視口時(通常在視口外約500px),瀏覽器會自動觸發渲染其內容。

  • 自動應用布局限制: 此屬性會自動為元素應用?contain: layout style paint,創建獨立的渲染格式化上下文,確保其內部布局、樣式和繪制不會影響外部文檔,這進一步優化了渲染性能。

  • 性能提升: 通過減少初始渲染時需要處理的元素數量,可以顯著縮短首次內容渲染時間(FCP)和可交互時間(TTI),并降低內存占用。測試表明,在包含1000項的列表中,初始加載時間可能從1200ms減少到400ms,內存占用從200MB降至50MB,滾動流暢度也能得到大幅提升(如從10 FPS到60 FPS)。

📝 二、如何使用?content-visibility: auto

1. 基礎用法

為需要優化的元素添加?content-visibility: auto?和?contain-intrinsic-size

css

.optimized-element {content-visibility: auto; /* 開啟智能跳過渲染 */contain-intrinsic-size: 200px 1000px; /* 指定占位寬度和高度 */
}

contain-intrinsic-size?用于為未渲染的元素提供占位尺寸,防止滾動條跳動。其值應盡可能接近元素的真實尺寸。

2. 處理動態內容

若元素內容或尺寸會動態變化,需通過 JavaScript 更新?contain-intrinsic-size

javascript

// 獲取元素的實際高度
const element = document.querySelector('.dynamic-element');
const actualHeight = element.scrollHeight;// 更新 contain-intrinsic-size
element.style.containIntrinsicSize = `auto ${actualHeight}px`;

有時,可能需要通過強制重繪來確保更新生效,例如添加一個極短的動畫。

3. 長列表優化示例

對于長列表,可以為每個列表項應用優化。

css

.long-list-item {content-visibility: auto;contain-intrinsic-size: 100px 50px; /* 根據列表項實際大小調整 */
}
4. 長文章或章節優化示例

對于包含多個章節的長篇文章,可以延遲渲染屏幕外的章節。

css

.chapter {content-visibility: auto;contain-intrinsic-size: auto 800px; /* 預估高度為800px */margin-bottom: 20px;
}

?? 三、注意事項與最佳實踐

  1. 必須指定?contain-intrinsic-size: 這是避免布局偏移和滾動條抖動的關鍵。對于高度可變的元素,需使用 JavaScript 動態計算并更新其值。

  2. 可訪問性考慮: 未渲染的內容可能無法被屏幕閱讀器讀取。確保關鍵內容在初始 HTML 中,或使用?aria-*?屬性補充信息。content-visibility: auto?的元素在屏幕外時,其內容在文檔對象模型和可訪問性樹中仍然存在,但使用?display: none?或?visibility: hidden?隱藏的元素如果未渲染,也可能無法被訪問,有時需使用?aria-hidden="true"

  3. 兼容性: 主要支持?Chrome 85+、Edge 85+、Opera 71+、Safari 15.4+。Firefox 的實驗性支持可能需要配置。建議使用?@supports?進行特性檢測并提供降級方案。

    css

    .item {content-visibility: auto;contain-intrinsic-size: 100px 500px;
    }
    /* 舊版瀏覽器回退方案 */
    @supports not (content-visibility: auto) {.item {will-change: transform; /* 或其他優化手段,如考慮虛擬滾動 */}
    }
  4. 避免與某些屬性混用: 謹慎與?position: sticky?等屬性同時使用,在 Flex 或 Grid 容器中可能需要額外測試。

  5. SEO 考慮: 部分搜索引擎爬蟲可能無法觸發滾動渲染。確保關鍵內容在初始 HTML 中,或考慮服務端渲染。

🔄 四、content-visibility: auto?與其他優化技術對比

技術原理優點缺點
content-visibility: auto瀏覽器原生跳過屏幕外渲染實現簡單,無需復雜JS,保留DOM狀態需管理占位尺寸,兼容性需考慮
虛擬滾動 (Virtual Scroll)手動控制僅渲染可視區域元素精準控制內存和性能,兼容性好實現復雜,需處理滾動位置和動態尺寸
懶加載 (Lazy Loading)按需加載數據或資源減少初始數據量,結合AJAX靈活通常需JS實現,用戶體驗可能不連貫

content-visibility: auto?與其他優化技術并非互斥,可以根據場景結合使用。例如,對長列表使用?content-visibility: auto,同時對列表中的圖片使用懶加載。

🚀 五、適用場景

  • 長列表或網格布局:如商品列表、新聞流、圖片畫廊。

  • 長文檔或多章節內容:如博客文章、幫助中心、文檔頁面。

  • 單頁應用(SPA)中的標簽頁或折疊內容:隱藏未激活的視圖。

  • 無限滾動頁面:隨著用戶滾動動態加載和渲染內容。

💎 總結

content-visibility: auto?是一個強大的瀏覽器原生性能優化工具,通過一行 CSS 就能為內容密集的頁面帶來顯著的渲染性能提升。使用時牢記:

  • 核心content-visibility: auto?+?contain-intrinsic-size

  • 關鍵:處理好動態內容和占位尺寸,避免布局偏移。

  • 注意:關注可訪問性、兼容性和 SEO 影響。

合理運用?content-visibility: auto,可以讓你的網頁滾動更加流暢,用戶體驗更加出色。

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

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

相關文章

通過uniapp將vite vue3項目打包為android系統的.apk包,并實現可自動升級功能

打包vue項目,注意vite.config.ts文件和路由文件設置 vite.config.ts,將base等配置改為./ import {fileURLToPath, URL } from node:urlimport {defineConfig } from vite import vue from @vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite import Com…

經營幫租賃經營板塊:解鎖資產運營新生態,賦能企業增長新引擎

在商業浪潮奔涌向前的當下,企業資產運營與租賃管理的模式不斷迭代,“經營幫” 以其租賃經營板塊為支點,構建起涵蓋多元業務場景、適配不同需求的生態體系,成為眾多企業破局資產低效困局、挖掘增長新動能的關鍵助力。本文將深度拆解…

C語言---編譯的最小單位---令牌(Token)

文章目錄C語言中令牌幾類令牌是編譯器理解源代碼的最小功能單元,是編譯過程的第一步。C語言中令牌幾類 1、關鍵字: 具有固定含義的保留字,如 int, if, for, while, return 等。 2、標識符: 由程序員定義的名稱,用于變…

機器學習 | Python中進行特征重要性分析的9個常用方法

在Python中,特征重要性分析是機器學習模型解釋和特征選擇的關鍵步驟。以下是9種常用方法及其實現示例: 1. 基于樹的模型內置特征重要性 原理:樹模型(如隨機森林、XGBoost)根據特征分裂時的純度提升(基尼不純度/信息增益)計算重要性。 from sklearn.ensemble import Ra…

心路歷程-了解網絡相關知識

在做這個題材的時候,考慮的一個點就是:自己的最初的想法;可是技術是不斷更新的; 以前的材料會落后,但是萬變不能變其中;所以呈現出來的知識點也相對比較老舊,為什么呢? 因為最新的素…

CAT1+mqtt

文章目錄 MQTT知識點mqtt數據固定報頭可變報頭(連接請求)有效載荷 阿里云MQTT測試訂閱Topic下發數據給MQTT.fxMQTT.fx 發布消息給服務器 下載mqtt(C-嵌入式版)我的W5500項目路徑使用Cat1連接阿里云平臺AT指令串口連接1. 開機聯網2. 激活內置SIM卡(貼片卡)3. 我這里使用連接的是…

AiPPT怎么樣?好用嗎?

AiPPT怎么樣?好用嗎?AiPPT 是一款智能高效的PPT生成工具,通過AI技術快速將主題或文檔(如Word/PDF)轉化為專業PPT,提供超10萬套行業模板,覆蓋商務、教育等22場景,支持一鍵生成大綱、文…

惡補DSP:2.F28335的定時器系統

一、定時器原理F28335 城市的三座時鐘塔(Timer0、Timer1、Timer2)是城市時間管理的核心設施,每座均為32位精度,依靠城市能源脈沖(系統時鐘 SYSCLKOUT,典型頻率為150 MHz)驅動。它們由兩個核心模…

用倒計時軟件為考研備考精準導航 復習 模擬考試 日期倒計時都可以用

考研,是一場與時間的博弈。從決定報名的那一刻起,日歷上的每一個數字都被賦予了特殊意義 —— 報名截止日、現場確認期、初試倒計時、成績查詢點…… 這些節點如同航標,指引著備考者的方向。而在這場漫長的征途里,一款精準、易用的…

React學習(七)

目錄:1.react-進階-antd-搜索2.react-進階-antd-依賴項說明 3.react-進階-antd-刪除1.react-進階-antd-搜索我們jsx代碼里只能返回一個最頂層的根元素下拉框簡化寫法:把這個對象結構賦值一下:清空定義個參數類型做修改事件需要定義三個…

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)進程間通信(IPC)的比較

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1 或 localhost)都是進程間通信(IPC)的方式,但它們在實現、性能和適用場景上有顯著區別。以下是兩者的對比:1. 通信機制Unix Domain…

SQL中對時間操作的函數

以下是SQL中常用時間操作函數的匯總,按功能分類整理,結合多個權威來源內容綜合而成: 一、獲取當前時間 函數名稱功能說明示例適用數據庫CURDATE()獲取當前日期(不含時間)SELECT CURDATE(); → 2024-08-21MySQL, Mari…

NUS PC5215 Lecture分析 Week1 Python基礎

NUS PC5215 Lecture分析 Week1 Python基礎前言Python基礎數據類型保留字表達式Import 相關庫IEEE浮點數前言 課程網站 作為一名計算機本科畢業的學生,該課程有點類似于本科期間學的數值分析的進化版,大抵是教會你如何實現各種方法,諸如蒙特卡…

模型私有化部署(Ollama vLLM LMDeploy)

一、魔塔社區平臺介紹 1.1 什么是魔塔社區? 魔塔(ModelScope)是由阿里巴巴達摩院推出的開源模型即服務(MaaS)共享平臺,匯聚了計算機視覺、自然語言處理、語音等多領域的數千個預訓練AI模型。其核心理念是…

C++編程實踐--資源管理、標準庫、并發與并行

文章目錄 資源管理 資源訪問 指向資源句柄或描述符的變量,在資源釋放后立即賦予新值 lambda函數 當lambda會逃逸出函數外面時,禁止按引用捕獲局部變量 避免lambda表達式使用默認捕獲模式 資源分配與回收 避免出現delete this操作 使用恰當的方式處理new操作符的內存分配錯誤 …

“R語言+遙感”的水環境綜合評價方法實踐技術應用

專題一、R語言概述1.1 R語言特點(R語言)1.2 安裝R(R語言)1.3 安裝RStudio(R語言)(1)下載地址(2)安裝步驟(3)軟件配置1.4 第一個程序He…

【項目復盤】【四軸飛行器設計】驅動開發部分

由于在參加面試時總需要花時間一點一點的回憶自己的項目內容,故我打算直接寫一系列的項目復盤博客,方便每次面試前的回憶。內容僅作分享交流,如有謬誤歡迎指正。 本項目系列的文章目錄如下: 【項目復盤】【四軸飛行器設計】驅動…

wpf之ComboBox

前言 wpf中ComboBox的應用非常廣泛&#xff0c;本文就來介紹ComboBox在wpf中的應用。 1、非MVVM模式下 1.1 xaml添加元素<ComboBox x:Name"cbx_test1" SelectedIndex" 0" ><ComboBoxItem >小明</ComboBoxItem ><ComboBoxItem &g…

從零開始學AI——13

前言 夏天快要過去&#xff0c;本書也快接近尾聲了。 第十三章 13.1 半監督學習 在此之前&#xff0c;我們討論的所有學習范式都具有非常明確的邊界條件&#xff1a; 監督學習&#xff1a;我們擁有大量帶標簽的數據樣本(xi,yi)(x_i, y_i)(xi?,yi?)&#xff0c;目標是學習從輸…

k8sday12數據存儲(1/2)

目錄 一、簡單基本存儲 1、EmptyDir 1.1概念 1.2作用 1.3配置文件 1.4測試 2、HostPath 2.1概念 2.2作用 2.3配置文件 2.4測試 ①、數據共享 ②、持久化存儲 3、NFS 3.1概念 3.2作用 3.3NFS服務安裝 ①、設置主節點為NFS服務器 ②、給副節點安裝NFS客戶端工…