css3中不需要回流和重绘的属性

本文探讨CSS3的硬件加速属性,如transform、opacity、filter和will-change,这些属性能有效减少页面回流和重绘,提升用户体验。通过具体实例说明如何使用这些属性优化网页性能。

众所周知,页面的回流和重绘会造成额外的计算消耗,降低用户体验,而css3自带的硬件加速则根本不需要回流和重绘

css3不需要回流和重绘的属性:

  • transform
  • opacity
  • filter
  • Will-change

transform 属性向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜

opacity属性设置元素的不透明级别。如 opacity: 0.5

filter 属性定义了元素(通常是<img>)的可视效果(例如:模糊与饱和度)。语法:

filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();

例如:

img {
    -webkit-filter: grayscale(100%); /* Chrome, Safari, Opera */
    filter: grayscale(100%);
}


// 修改所有图片的颜色为黑白 (100% 灰度):

will-change属性可以提前通知浏览器我们要对元素做什么动画,这样浏览器可以提前准备合适的优化设置。这样可以避免对页面响应速度有重要影响的昂贵成本。元素可以更快的被改变,渲染的也更快,这样页面可以快速更新,表现的更加流畅。

举个例子,当对于素使用 CSS 3D变形时,元素及其内容可以在合成到页面之前被创建到我们之前说的layer。然而把元素放到layer中是个昂贵的操作,这将会导致变形动画延迟一个课件的瞬间,也就是flicker

为了避免这种延时,我们可以在发生之前通知浏览器,这样浏览器会有一定的时间去准备这些变化,当发生的时候layer已经准备好了,这样动画酒会很流畅,不会闪屏

使用will-change提示浏览器关于即将发生的变形十分简单,添加个CSS属性就行

will-change: transform;

也可以告诉浏览器要改变元素的滚动条位置,或者多个要变化的属性,写下属性的名字就行,也可以写多个,逗号隔开

will-change: transform, opacity;

声明了元素即将进行的变化会让浏览器在渲染页面时做更好的决定,这明显比之前说的3D hacks要好。

 

关于will-change的具体介绍和好处见另一篇介绍:https://www.cnblogs.com/yuzhongwusan/p/4186405.html

为减少 CSS 回流的发生,可采用以下优化方法- **批量修改样式**:避免逐个修改样式属性,而是将多个样式属性合并到一个类中,通过切换类名来一次性应用多个样式更改。例如: ```javascript // 推荐的写法 var s = document.body.style; s.padding = "2px"; // 回流+ s.border = "1px solid red"; // 再一次回流+ s.color = "blue"; // 再一次 s.backgroundColor = "#ccc"; // 再一次 s.fontSize = "14px"; // 再一次回流+ // 推荐的写法 var body = document.body; body.classList.add(&#39;new-style&#39;); ``` ```css .new-style { padding: 2px; border: 1px solid red; color: blue; background-color: #ccc; font-size: 14px; } ``` - **使用文档片段(DocumentFragment)**:在添加多个 DOM 元素时,先将元素添加到文档片段中,最后再将文档片段一次性添加到文档中,这样只会触发一次回流。例如: ```javascript var fragment = document.createDocumentFragment(); for (var i = 0; i < 10; i++) { var newElement = document.createElement(&#39;div&#39;); newElement.textContent = &#39;Element &#39; + i; fragment.appendChild(newElement); } document.body.appendChild(fragment); ``` - **使用 CSS3 硬件加速**:利用 CSS3 的硬件加速特性,让 `transform`、`opacity`、`filters` 这些动画不会引起回流过对于动画的其它属性,如 `background-color` 等,还是会引起回流,但能提升这些动画的性能 [^3]。例如: ```css .element { transform: translate(100px, 100px); opacity: 0.5; will-change: transform, opacity; /* 提前告知浏览器元素即将发生变化 */ } ``` - **避免频繁读取布局信息**:当读取元素的布局信息(如 `offsetWidth`、`offsetHeight`、`scrollTop` 等)时,浏览器为了保证数据的准确性,会强制刷新队列,立即进行回流。因此,应尽量避免在修改样式的过程中频繁读取布局信息。如果需要多次读取,可将布局信息缓存起来。例如: ```javascript // 推荐的写法 var element = document.getElementById(&#39;myElement&#39;); element.style.width = &#39;200px&#39;; var width = element.offsetWidth; // 强制回流 element.style.height = width + &#39;px&#39;; // 推荐的写法 var element = document.getElementById(&#39;myElement&#39;); var width = element.offsetWidth; // 读取一次布局信息 element.style.width = &#39;200px&#39;; element.style.height = width + &#39;px&#39;; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值