在前端开发中,你是否遇到过这样的问题:页面包含大量 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;要满足生产至少是下面这种架构 ------------------- ------------------- ------------------- …