广州总部电话:020-85564311
广州总部电话:020-85564311
20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

CSS 内容可见性:提升网页性能的秘密武器

发布日期:2025-04-09 08:47:14 浏览次数: 914 来源:前端小石匠

你是否经历过加载一个内容丰富的网页时,页面加载速度异常缓慢?这是因为浏览器需要一次性处理所有内容,即使这些内容在当前视图中不可见。这时,CSS 的 content-visibility 属性就能发挥巨大的作用。它允许浏览器推迟渲染屏幕外的内容,从而显著提升页面的加载速度。


什么是 CSS 包含?

在深入了解 content-visibility 之前,我们先来了解一下 CSS 包含(Containment)。CSS 包含是一种机制,允许开发者告诉浏览器页面的哪些部分是独立的,与其他部分无关。当浏览器知道这一点后,它可以更高效地渲染这些独立的部分,而无需对整个页面进行复杂的计算。

CSS 包含就像将内容放入一个个独立的盒子中。每个盒子的内容都不会影响其他盒子,浏览器可以独立处理每个盒子,从而提高渲染效率。


content-visibility 是如何工作的?

content-visibility 属性告诉浏览器可以跳过渲染用户当前看不到的内容。这大大节省了处理时间,因为浏览器无需为屏幕外的元素计算样式、布局和绘制。

当用户滚动页面,内容进入视图时,浏览器会及时渲染这些内容。这种方式使得初始页面加载速度更快,尤其是对于内容丰富且较长的页面。


content-visibility 属性的值

content-visibility 属性主要有三个值:

  • visible:默认行为。内容按正常方式处理和显示。
  • hidden:内容不显示且对用户不可访问(类似于 display: none),但保留其渲染状态,以便稍后快速取消隐藏。
  • auto:只有在内容接近或进入视口时才进行渲染。这是性能优化的最佳选择。

何时使用 content-visibility

content-visibility 最适合以下场景:

  • 初始视图外的内容:例如,页面首次加载时不可见的内容。
  • 自包含的内容:这些内容不影响页面的其他部分,例如不会改变布局或影响其他元素的样式。
  • 渲染成本较高的内容:例如,复杂的布局、长列表的 UI 组件、新闻源中的博客文章、长评论线程等。

何时不应使用 content-visibility

在使用 content-visibility 时,需要注意其可能带来的意外后果。以下是一些不适用的场景:

  • 初始视口内的内容:这些内容是用户首先看到的部分,延迟加载可能会导致用户体验不佳。
  • 渲染成本较低的小元素:避免过度优化,仅在真正有效时使用 content-visibility
  • 对页面布局影响较大的元素:延迟渲染这些元素可能会导致内容渲染时出现意外结果。

使用 contain-intrinsic-size

当你使用 content-visibility: auto 时,浏览器可能会面临一个问题:它不知道延迟渲染的内容有多大。在这种情况下,浏览器可能会假设高度为 0,从而导致滚动条状态出现异常。

这时,contain-intrinsic-size 属性就派上了用场。它允许你为内容指定一个占位符大小,从而避免布局的突然变化:

.content-section {
  content-visibility: auto;
  contain-intrinsic-size: auto 600px/* 宽度和高度占位符 */
}

选择性地应用 content-visibility

对于长内容列表,可以有选择性地应用 content-visibility: auto。例如,对于博客文章列表:

/* 应用于第 10 篇及之后的帖子 */
.blog-post:nth-child(n + 10) {
  content-visibility: auto;
  contain-intrinsic-size: auto 600px;
}

这种方式确保了前几篇帖子按正常方式渲染,而后续帖子则通过 content-visibility: auto 进行优化。


理解 contain 属性

content-visibility: auto 实际上应用了多种类型的包含:

  • 样式包含:防止元素内部的样式影响外部元素。
  • 布局包含:防止内部布局变化影响外部布局。
  • 绘制包含:防止内容从视觉上溢出元素。

你也可以直接使用这些包含类型与 contain 属性:

.container {
  contain: style layout paint;
}

提示:在使用 content-visibility: auto 之前,务必理解每种包含类型及其对内容渲染的影响。不要盲目使用,以免带来意外问题。


浏览器支持

content-visibility 属性在所有现代浏览器中都得到了支持,包括 Chrome、Firefox、Safari 和 Edge。然而,Firefox 和 Safari 在某些值的表现上可能会有些许差异。

contain 属性在现代浏览器中也具有良好的支持。


使用 DebugBear 测量改进

 DebugBear,我们提供了工具来衡量 CSS 包含对网站性能的影响。以下是一个示例:

假设一个页面上有数百篇博客文章,其 DOM 树可能如下所示:

通过为某些元素添加 content-visibility 属性,我们可以优化页面的渲染性能:

.apply-content-visibility {
  content-visibility: auto;
  contain-intrinsic-size: auto 300px;
}

通过切换 .apply-content-visibility 类的样式,我们可以创建一个前后对比,以了解 content-visibility 对页面加载期间渲染性能的影响。以下是在 DebugBear 仪表板中设置的两个测试:

通过 比较视图,我们可以直观地看到性能改进:

在上述截图中,我们可以看到测试页面性能指标的前后对比。CPU(绘制)时间显著下降,因为页面上有数百篇博客文章,无需立即渲染。有趣的是,最大内容绘制(LCP) 指标也得到了改善。由于浏览器可以专注于首先渲染最重要的内容——LCP 元素,页面的整体性能得到了提升。

DebugBear 还提供了一个视频比较功能,让你直观地看到这些变化的视觉影响:

您的浏览器不支持 video 标签。

虽然为演示页面创建多个 DebugBear 测试在某种程度上是有用的,但更实际的做法是使用 DebugBear 的 一键实验 功能来测试 content-visibility 对你网站性能的影响。

DebugBear 的 博客列表页面 是一个理想的测试对象。截至 2025 年 3 月,该页面上有近 200 篇文章,每篇都包含标题和摘要。通过将 /blog 页面添加为新的测试,并配置为使用 移动配置 进行测试,我们可以运行一个基线测试,捕获未优化的页面加载性能。

接下来,我们创建并配置了一个新实验:

在这个实验中,我们在页面的 <head> 中插入了一段 CSS:

<style>
  /* 延迟渲染第 11 篇及之后的文章 */
  [itemprop="blogPost"]:nth-child(n+11) {
    content-visibility: auto;
    contain-intrinsic-size: auto 300px;
  }
</style>

实验结果显示,虽然一些指标的改进可能微不足道,但在 CPU 绑定的样式、布局和绘制指标方面有显著提升,这些指标是衡量 content-visibility 带来性能益处的良好指标。


可访问性考虑

content-visibility 属性可能对可访问性产生影响。这是一个重要的主题,建议阅读 MDN 官方文档 以了解更多相关信息。


结论

content-visibility 属性为开发者提供了更强大的控制浏览器渲染内容的能力。通过告诉浏览器跳过渲染屏幕外的内容,你可以显著提升页面的加载速度和交互性能。

请记住以下关键点:

  • 对于屏幕外的内容,使用 content-visibility: auto,但在应用之前务必测试其性能影响。
  • 结合 contain-intrinsic-size 使用,以管理尚未渲染的内容的占位符大小。
  • 选择性地应用此技术,避免延迟渲染重要内容。
  • 在各种浏览器中手动测试你的更改,使用浏览器 DevTools 和 DebugBear 等工具,并与真实用户一起测试。

优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询