CSS Containment属性浅用

网页开发中,性能优化一直是一个永恒的主题。浏览器的重绘(repaint)和回流(reflow)尤其是页面性能的常见杀手,因为它们往往需要大量的计算资源。幸运的是,CSS Containment属性为开发者提供了一种新的优化手段。本文将详细介绍CSS Containment属性的概念、用法以及如何通过它来提高页面的渲染性能。

CSS Containment属性简介

CSS Containment属性允许开发者告诉浏览器某个元素的布局、样式或尺寸是独立于文档流的其他部分。这意味着,当这个元素或其内部的子元素发生变化时,浏览器可以仅重新计算和渲染这个独立的部分,而不是整个页面,从而显著提高渲染性能。

使用场景

CSS Containment适用于以下几种场景:

  • 独立组件: 如果页面中有独立的UI组件,其内部状态变化不影响页面的其他部分,可以使用Containment来优化。
  • 列表和网格: 对于大量重复内容的列表和网格布局,应用Containment可以减少不必要的计算。
  • 动画元素: 对于含有动画的元素,尤其是那些仅改变自身属性(如transform)的动画,使用Containment可以避免影响页面的其他部分。

属性值

CSS Containment属性提供了四个值:

  • content:表示元素的内容是独立的,不影响外部布局
  • layout:表示元素的内部布局不影响外部布局
  • paint:表示元素的绘制不会影响外部元素
  • size:表示元素的尺寸不受外部影响,也不影响外部元素

最强的containment设置是contain: strict,它相当于同时应用了layoutpaintsize

示例

假设我们有一个动态加载内容的卡片,我们可以这样应用Containment来优化性能:

html 复制代码
<div class="card" style="contain: content;">
  <!-- 动态加载的内容 -->
</div>

这里,我们通过contain: content告诉浏览器,.card内部的任何变化都不会影响到外部布局,浏览器因此可以优化渲染性能。

对于一个动画元素:

css 复制代码
.animated-element {
  contain: paint;
  animation: slideIn 1s infinite;
}

由于设置了contain: paint,浏览器知道这个元素的动画只影响元素本身的绘制,而不会影响到外部元素,因此可以针对性地优化。

注意事项

  • 应用CSS Containment时,需要确保真的理解了它的含义和后果。错误的使用可能会导致页面布局或样式出现意外的结果。
  • 并非所有浏览器都支持CSS Containment属性。在使用之前,最好查阅Can I use来了解当前的浏览器支持情况。

知道你们不会去查,我直接贴在这里了,怎么样,点个赞?

反面例子

下面列举一些反面的例子,以求更好的理解这个属性: 使用CSS Containment属性时,如果不当心或误解了它的作用,可能会导致一些不希望发生的副作用。以下是一些典型的错误使用场景,也即"反面例子":

1. 过度隔离导致的布局问题

css 复制代码
.container {
  contain: layout;
}

如果.container内部的元素需要影响到外部布局(比如弹出菜单超出容器边界) ,设置contain: layout会阻止这种布局上的影响,导致布局破坏或弹出菜单无法正确显示。

2. 忽略内容变化引起的滚动条问题

css 复制代码
.scrollable-area {
  contain: paint;
  overflow: auto;
}

在这个例子中,假设.scrollable-area是一个滚动区域,通过contain: paint,我们告诉浏览器只需考虑该元素的绘制情况,忽略内部布局变化。如果内部内容动态变化导致高度增加,理论上会需要滚动条,但由于布局变化被隔离,滚动条可能不会出现,导致内容无法完全访问

3. 不适当的尺寸隔离

css 复制代码
.fixed-size {
  contain: size;
  width: 100px;
  height: 100px;
}

如果.fixed-size元素内部的内容动态变化,可能需要更多空间来展示 ,但由于设置了contain: size,其尺寸变化不会影响到外部布局,也不会根据内容调整,可能导致内容被截断或溢出

4. 错误使用contain: strict影响功能

css 复制代码
.interactive-widget {
  contain: strict;
}

虽然contain: strict是最强的隔离级别,但在需要与外部有布局或样式交互的元素上使用它可能会导致问题。例如,.interactive-widget可能是一个需要根据外部尺寸调整自己位置的小工具,或者需要在外部显示弹出层,使用contain: strict会限制这些功能的实现

结论

CSS Containment属性提供了一种有效的机制,通过告知浏览器页面的哪些部分是独立的,从而减少不必要的重绘和回流,提高页面渲染性能。正确地应用这一属性,可以在不牺牲用户体验的情况下,显著提升Web应用的性能。在设计和开发Web应用时,合理利用CSS Containment将是提升性能的关键手段之一。

相关推荐
徊忆羽菲6 分钟前
利用HTML5和CSS来实现一个漂亮的表格样式
前端·css·html5
不爱说话郭德纲12 分钟前
Stylus、Less 和 Sass 的使用与区别
前端·css·面试·less·sass·stylus
前端Hardy9 小时前
HTML&CSS:MacBook Air 3D 动画跃然屏上
前端·javascript·css·3d·html
彪82513 小时前
第十章 JavaScript的应用
css·html5
好青崧13 小时前
CSS 样式入门:属性全知晓
前端·css·tensorflow
珹洺14 小时前
从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程
前端·javascript·css·前端框架·html
前端Hardy14 小时前
HTML&CSS:翻书加载效果
前端·javascript·css·3d·html·css3
问道飞鱼14 小时前
【前端知识】SCSS(Sassy CSS)是一种CSS预处理器语言
前端·css·less·scss
命运之光14 小时前
【经典】高级动态抽奖系统(HTML,CSS、JS)
前端·css·html
2301_8010741515 小时前
初始ArkUI
javascript·css·html5·arkts