CSS content-visibility:提升頁面渲染性能的 “智能渲染開關”

在前端開發中,你是否遇到過這樣的問題:頁面包含大量 DOM 元素(如長列表、復雜表格)時,滾動變得卡頓,交互響應遲緩?這往往是因為瀏覽器需要不斷渲染屏幕外的元素,浪費了大量計算資源。而 CSS 的content-visibility屬性就像一個 “智能渲染開關”,能讓瀏覽器只渲染可見區域的內容,大幅提升頁面性能。今天,我們就來解鎖這個提升渲染效率的 “黑科技”。

一、認識 content-visibility:渲染性能的 “智能調節器”

content-visibility是 CSS 新增的性能優化屬性,它的核心作用是:控制元素是否被瀏覽器渲染,只對用戶可見的內容進行渲染,不可見的內容則暫時跳過渲染過程,從而減少 CPU 和 GPU 的消耗。

1.1 為什么需要 content-visibility?

瀏覽器渲染頁面的過程(回流、重繪、合成)是性能消耗的 “重災區”,尤其是當頁面包含以下內容時:

  • 超長列表(如 1000 + 條數據的商品列表)

  • 復雜表格(包含大量單元格和樣式)

  • 富文本內容(如包含圖片、視頻的長文章)

  • 隱藏的離線內容(如標簽頁切換時未顯示的面板)

這些場景中,大量不可見的元素仍會被瀏覽器渲染,導致:

  • 頁面加載時間延長

  • 滾動時出現卡頓(掉幀)

  • 交互響應變慢(如點擊、輸入延遲)

content-visibility的出現,讓瀏覽器可以 “按需渲染”,只處理用戶當前能看到的內容,從而釋放計算資源。

1.2 與其他性能屬性的區別

CSS 中還有visibilitydisplay等控制顯示的屬性,content-visibility的獨特之處在于:

屬性作用渲染狀態適用場景
content-visibility控制元素是否被渲染(保留布局空間)不可見時不渲染,可見時恢復長列表、隱藏內容的性能優化
visibility: hidden隱藏元素(保留布局空間)仍會被渲染(只是不可見)臨時隱藏元素(需保留空間)
display: none隱藏元素(不保留布局空間)不渲染,完全從 DOM 中移除徹底隱藏且不占空間的元素

簡單說,content-visibility實現了 “不渲染但保留布局” 的效果,兼顧了性能和布局穩定性。

二、核心用法:一行代碼提升性能

content-visibility的用法非常簡單,只需為需要優化的元素添加該屬性,常用值有三個:

2.1 content-visibility: auto(智能渲染)

這是最常用的值,瀏覽器會自動判斷元素是否在視口內:

  • 如果元素可見(在視口內或接近視口),正常渲染。

  • 如果元素不可見(完全在視口外),不渲染,節省性能。

/* 為長列表項添加智能渲染 */
.list-item {content-visibility: auto;
}

適用場景:長列表(如商品列表、評論列表)、分頁內容、標簽頁中的隱藏面板等。

2.2 content-visibility: visible(強制渲染)

強制元素始終被渲染,無論是否可見。相當于禁用content-visibility的優化效果。

/* 強制渲染關鍵元素 */
.header,
.footer {content-visibility: visible;
}

適用場景:頁面關鍵元素(如導航欄、頁腳),確保它們始終正常顯示,不受優化影響。

2.3 content-visibility: hidden(不渲染但保留布局)

元素不被渲染,但會保留其布局空間(類似visibility: hidden,但性能更好)。

/* 不渲染離線內容,但保留空間 */
.offscreen-content {content-visibility: hidden;
}

適用場景:暫時隱藏但很快會顯示的內容(如彈窗、下拉菜單),避免頻繁渲染切換的性能損耗。

2.4 配合 contain-intrinsic-size 使用

content-visibility: auto的元素不可見時,瀏覽器會 “忘記” 它的尺寸,可能導致布局偏移(如滾動時突然跳動)。此時可通過contain-intrinsic-size指定元素的 “默認尺寸”,讓瀏覽器在未渲染時也能保留正確的布局空間。

.list-item {content-visibility: auto;/* 指定元素的默認尺寸(寬高),避免布局偏移 */contain-intrinsic-size: 200px 100px; /* 寬度200px,高度100px */
}

為什么需要這個屬性?

如果元素的尺寸依賴于內容(如高度由文本多少決定),瀏覽器未渲染時無法知道其真實尺寸,可能會用 0 或默認值占位,導致滾動時突然撐開布局。contain-intrinsic-size相當于給元素 “預設” 一個尺寸,確保未渲染時布局依然穩定。

三、實戰案例:長列表性能優化

長列表是content-visibility最能發揮作用的場景,我們來對比優化前后的效果。

3.1 未優化的長列表

<!-- 1000條數據的長列表 -->
<ul class="long-list"><!-- 循環生成1000個列表項 --><li class="list-item">項目 1:大量文本內容...</li><li class="list-item">項目 2:大量文本內容...</li><!-- ...更多列表項... -->
</ul>
/* 未添加content-visibility */
.long-list {list-style: none;padding: 0;
}.list-item {padding: 1rem;border-bottom: 1px solid #eee;
}

問題:頁面加載時,瀏覽器需要渲染全部 1000 個列表項,即使用戶只能看到其中 10 個,導致初始加載慢、滾動卡頓。

3.2 優化后的長列表

只需添加一行 CSS:

.list-item {padding: 1rem;border-bottom: 1px solid #eee;/* 智能渲染:只渲染可見項 */content-visibility: auto;/* 預設尺寸,避免布局偏移 */contain-intrinsic-size: 80px; /* 預估每個列表項高度為80px */
}

優化效果

  • 初始加載時,瀏覽器只渲染視口內的列表項(約 10-20 個),加載速度提升 5-10 倍。

  • 滾動時,瀏覽器動態渲染即將進入視口的項,滾動更流暢(幀率提升)。

  • 列表項的布局空間保持不變,不會出現滾動時的 “跳動”。

3.3 其他實用場景

(1)標簽頁內容優化

標簽頁切換時,未激活的標簽內容無需渲染:

<div class="tabs"><div class="tab-panel active">標簽1內容</div><div class="tab-panel">標簽2內容</div><div class="tab-panel">標簽3內容</div>
</div>
.tab-panel {/* 未激活的標簽頁不渲染 */content-visibility: auto;
}/* 激活的標簽頁強制渲染 */
.tab-panel.active {content-visibility: visible;
}
(2)隱藏的彈窗內容

彈窗未打開時,內部內容無需渲染:

<dialog id="modal"><div class="modal-content">彈窗內容...</div>
</dialog>
.modal-content {/* 彈窗未打開時不渲染 */content-visibility: auto;
}/* 彈窗打開時強制渲染 */
dialog[open] .modal-content {content-visibility: visible;
}

四、性能提升原理:瀏覽器的 “懶渲染” 機制

content-visibility: auto的優化效果源于瀏覽器的 “懶渲染” 策略,具體包括三個階段:

  1. 判斷可見性:瀏覽器快速檢查元素是否在視口內或接近視口(通常是視口外 1-2 屏的范圍)。

  2. 跳過渲染:對完全不可見的元素,跳過布局(Layout)、繪制(Paint)和合成(Composite)過程。

  3. 按需恢復:當元素即將進入視口時(如用戶滾動),瀏覽器快速恢復渲染,確保用戶看到內容時已渲染完成。

這個過程中,瀏覽器只消耗極少量資源判斷可見性,而省去了大量的渲染計算,從而顯著提升性能。

五、避坑指南:這些錯誤要避免

5.1 不要濫用 content-visibility: auto

  • 對于本身渲染成本低的元素(如簡單文本、小圖標),添加content-visibility: auto可能不會提升性能,反而會增加瀏覽器的可見性判斷成本。

  • 建議只對 “渲染成本高” 的元素使用(如復雜列表項、包含圖片和復雜樣式的元素)。

5.2 必須配合 contain-intrinsic-size 避免布局偏移

如果元素尺寸不固定(如高度由內容決定),未添加contain-intrinsic-size可能導致:

  • 滾動時元素突然 “撐開”,出現布局跳動。

  • 元素位置計算錯誤(如錨點定位不準)。

解決方法:根據內容預估一個合理的尺寸,如列表項高度、面板寬度等。

.card {content-visibility: auto;/* 預估卡片尺寸:寬300px,高200px */contain-intrinsic-size: 300px 200px;
}

5.3 注意瀏覽器兼容性

content-visibility兼容所有現代瀏覽器,但需注意:

  • Chrome 85+、Firefox 101+、Edge 85+、Safari 15.4+ 原生支持。

  • IE 完全不支持(可忽略,IE 已逐漸退出市場)。

  • 舊瀏覽器中,content-visibility會被忽略,元素正常渲染(無性能優化,但不影響功能)。

可通過@supports檢測瀏覽器支持情況:

/* 只在支持的瀏覽器中應用 */
@supports (content-visibility: auto) {.list-item {content-visibility: auto;contain-intrinsic-size: 80px;}
}

六、總結

content-visibility是一個 “用極少代碼實現巨大性能提升” 的 CSS 屬性,尤其適合處理長列表、隱藏內容等渲染成本高的場景。它的核心價值在于:

  • 簡單高效:一行代碼即可實現性能優化,無需復雜的 JavaScript 邏輯。

  • 無損體驗:在提升性能的同時,保持頁面布局穩定,用戶無感知。

  • 智能適配:瀏覽器自動判斷何時渲染,開發者無需手動控制。

如果你正在開發包含大量內容的頁面(如電商商品列表、新聞網站、數據報表),不妨試試content-visibility—— 它可能會讓你的頁面加載速度和滾動流暢度有質的飛躍。

最后提醒:性能優化的關鍵是 “按需優化”,先通過瀏覽器開發者工具(如 Performance 面板)找到渲染瓶頸,再針對性地應用content-visibility,才能達到最佳效果。

你在項目中用過content-visibility嗎?歡迎在評論區分享你的優化效果~

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

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

相關文章

Javascript面試題及詳細答案150道之(016-030)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

仿真電路:(十七下)DC-DC升壓壓電路原理簡單仿真

1.前言 升壓的環境用的沒降壓的多&#xff0c;但是升壓會用在LED的很多電路上&#xff0c;所以理解一下原理 2.DC-DC升壓原理簡單仿真 升壓原理 下面還是對升壓進行簡單的仿真 拓撲結構以及原理和降壓還是很相似的&#xff0c;只是位置不太一樣&#xff0c;過程推導就不推導…

ros2--source

setup腳本類型 install下面會有幾個setup.xxx的shell腳本。 setup.bash setup.ps1 setup.sh setup.zsh 什么區別呢 文件名 Shell 類型 適用場景 setup.bash Bash (Linux/macOS) 標準 Linux/macOS 終端(默認使用) setup.sh 通用 Shell 兼容性更廣,但功能可能受限 setu…

40.MySQL事務

1.事務的作用事務用于保證數據的一致性&#xff0c;它由一組相關的 dml (update delete insert) 語句組成&#xff0c;該組的 dml (update delete insert) 語句要么全部成功&#xff0c;要么全部失敗。如&#xff1a;轉賬就要用事務來處理&#xff0c;用以保證數據的一致性。假…

java導入pdf(攜帶動態表格,圖片,純java不需要模板)

java導出pdf文件一、介紹二、準備三、實現效果四、代碼一、介紹 上一篇文章&#xff08;java使用freemarker操作word&#xff08;攜帶動態表格&#xff0c;圖片&#xff09;&#xff09;https://blog.csdn.net/weixin_45853881/article/details/129298494 緊跟上文&#xff0c…

【dropdown組件填坑指南】鼠標從觸發元素到下拉框中間間隙時,下拉框消失,怎么解決?

開發dropdown組件填坑之hideDelay 引言 在開發下拉菜單&#xff08;dropdown&#xff09;或彈出框&#xff08;popover&#xff09;組件時&#xff0c;一個常見的用戶體驗問題就是鼠標移出觸發區域后&#xff0c;彈出內容立即消失&#xff0c;這會導致用戶無法移動到彈出內容上…

Linux I/O 函數完整清單

Linux I/O 函數完整清單 1. 基礎 I/O 函數 1.1 基本讀寫 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);1.2 位置指定讀寫 #include <unistd.h>ssize_t pread(int fd, void *buf, siz…

面經——電子電路技術知識詳解

電子電路技術知識詳解 目錄 德摩根定律周期性矩形波產生方法自激振蕩器原理與設計晶體管溫度效應分析反向飽和電流影響因素放大電路負反饋類型判斷正弦波90相移電路直接耦合放大器的缺點二階有源低通濾波器分析開關電源與線性電源對比 德摩根定律 德摩根定律&#xff08;De …

docker 安裝 gitlab

null文章瀏覽閱讀445次。問題&#xff1a;運行 docker run hello-world 報錯。原因&#xff1a;原鏡像源網絡不穩定。https://blog.csdn.net/sszdzq/article/details/145733419 鏡像獲取 在線下載 docker pull gitlab/gitlab-ce:17.11.1-ce.0 離線獲取 創建運行 sudo docke…

PHP中的日期/時間處理之Carbon組件

日常開發中&#xff0c;我們會經常用到日期和時間的操作&#xff0c;但官方的一般操作比較復雜&#xff0c;需要大量的時間進行格式化問題和大量計算等等。Carbon組件 可以幫助我們在 PHP 開發中處理日期/時間變得更加簡單、更語義化&#xff0c;從而使得我們的代碼更容易閱讀和…

學習嵌入式第十八天

文章目錄1.數據結構1.概念2.衡量代碼質量和效率1.時間復雜度2.空間復雜度3.數據結構分類1.邏輯結構2.存儲結構3.常見的數據結構2.鏈表1.與順序表的區別2.鏈表分類1.單向鏈表1.定義鏈表節點類型2.空鏈表的創建3.鏈表的頭插法4.鏈表的遍歷5.鏈表元素刪除3.makefile習題1.數據結構…

基于SpringBoot+Vue實現校園商鋪系統

作者主頁&#xff1a;編程指南針 作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗&#xff0c;被多個學校常年聘為校外企業導師&#xff0c;指導學生畢業設計并參…

從資源閑置到彈性高吞吐,JuiceFS 如何構建 70GB/s 吞吐的緩存池?

AI 模型的訓練與推理對存儲系統提出了極為嚴苛的要求&#xff0c;特別是在高吞吐、高并發以及對海量小文件的高效處理方面&#xff0c;已成為三大主要挑戰。盡管基于 Lustre 或 GPFS 的并行文件系統具備出色的性能&#xff0c;但其成本高昂、吞吐能力與容量強耦合&#xff0c;可…

提升JVM性能之CMS垃圾回收器的優化分析與案例剖析

這里寫目錄標題一、CMS基本介紹二、CMS核心優化策略1. 避免并發模式失敗&#xff08;Concurrent Mode Failure&#xff09;2. 減少內存碎片3. 調優并發階段耗時4. 新生代優化配合三、典型案例解析案例1&#xff1a;電商服務頻繁Full GC案例2&#xff1a;金融交易系統碎片導致長…

Token系列 - 再談穩定幣

相關政策 2024年12月&#xff0c;歐洲《加密資產市場監管法案》正式成為法律2025年3月&#xff0c;日本細化了加密資產及穩定幣的監管調整2025年5月&#xff0c;英國發布了關于穩定幣發行、加密資產托管及加密資產公司財務穩健性的監管提案&#xff1b;2025年5月20日&#xff…

【20min 急速入門】使用Demucs進行音軌分離

創建環境 conda create --name mujica python3.10下載加速依賴 先用nvidia-smi檢查機器使用的獨顯版本, 然后從pytorch官網下載對應的GPU版torch, torchaudio 比如我的是12.2, 就下載11.8版本的 pip3 install torch torchvision torchaudio --index-url https://download.p…

字節Seed發布擴散語言模型,推理速度達2146 tokens/s,比同規模自回歸快5.4倍

用擴散模型寫代碼&#xff0c;不僅像開了倍速&#xff0c;改起來還特別靈活&#xff01;字節Seed最新發布擴散語言模型Seed Diffusion Preview&#xff0c;這款模型主要聚焦于代碼生成領域&#xff0c;它的特別之處在于采用了離散狀態擴散技術&#xff0c;在推理速度上表現出色…

海洋大地測量基準與水下導航系列之九我國海洋PNT最新技術進展(下)

三、海洋PNT技術裝備研發與工程化應用 1.海底基準裝備 研制了首批適應海洋環境的多型海底基準站裝備&#xff0c;在我國南海海域成功布設了定位精度優于0.25m的海底大地測量試驗基準網&#xff0c;實現了我國海底大地測量基準技術零的突破。基準方艙具備穩固、抗壓、防腐、防…

入門MicroPython+ESP32:安裝逗腦IDE及驅動

本篇文章將手把手帶大家入門MicroPython ESP32&#xff0c;重點介紹逗腦IDE的安裝過程以及相關驅動的安裝。 一、下載逗腦IDE 要開始使用逗腦IDE&#xff0c;首先需要從官網下載最新版本。請訪問以下網址進行下載&#xff1a;https://www.itprojects.cn/ide 下載時的界面大…

CentOS上部署Redis及其哨兵(Sentinel)模式

架構&#xff1a;說明我這里是偽集群的&#xff0c;redis 在同一臺機器&#xff0c;Sentinel 只有一個&#xff0c;也存在單點故障問題只能當作開發環境使用&#xff0c;要滿足生產至少是下面這種架構 ------------------- ------------------- ------------------- …