说一说will-change

一、will-change是做什么的呢

CSS 是用来描述结构化文档(如HTML、XML)怎样渲染的语言。

CSS渲染器在渲染属性前,会有个准备的过程。有些属性需要css渲染器事先做很多准备才能实现渲染。这就容易导致页面出现卡顿,交互体验不好等问题。

如果设置了 will-change 属性,那么浏览器就可以提前知道哪些元素的属性将会改变,提前做好准备。待需要改变元素的时机到来时,就可以立刻实现它们。从而避免卡顿等问题。

例如,使用 3D Transforms 让元素在屏幕上移动时,此元素和它的上下文会被提到另一个“层”,独立于其它元素被渲染。这样那些不变的元素就能避免被重复渲染。这可以显著提高性能。

然而,将元素提取到一个新层,相对来说是代价较高的操作。这可能使 transform 动画延迟几百毫秒。

二、怎么用呢

下面是一个使用脚本应用 will-change 属性的例子:

var el = document.getElementById('element');
// 当鼠标移动到该元素上时给该元素设置 will-change 属性
el.addEventListener('mouseenter', hintBrowser);
// 当 CSS 动画结束后清除 will-change 属性
el.addEventListener('animationEnd', removeHint);
function hintBrowser() {
// 填写上那些你知道的,会在 CSS 动画中发生改变的 CSS 属性名们
this.style.willChange = 'transform, opacity';
}
function removeHint() {
this.style.willChange = 'auto';
}

语法说明

Formal syntax: auto | <animateable-feature>#
<animateable-feature> = scroll-position | contents | <custom-ident>
will-change: auto
will-change: scroll-position
will-change: contents
will-change: transform // <custom-ident> 的例子
will-change: opacity // <custom-ident> 的例子
will-change: left, top // <animateable-feature> 的例子
will-change: unset
will-change: initial
will-change: inherit
auto

浏览器会根据情况,自行进行优化。

scroll-position

表示开发者将要改变元素的滚动位置。

例如,浏览器通常仅呈现可滚动元素“滚动窗口”中的内容。而某些内容超过该窗口。如设置了此值,浏览器将扩展呈现“滚动窗口”周围的内容,从而顺利地进行更长、更快的滚动。

content

表示开发者将要改变元素的内容。

例如,浏览器常将大部分不经常改变的元素缓存下来。但如果一个元素的内容不断发生改变,那么产生和维护这个缓存就是在浪费时间。此属性值可以减少浏览器对元素的缓存,或者完全避免缓存。变为从始至终都重新渲染元素。

注意:这个值会被应用到它所声明元素的子节点。在文档树较高的节点上使用,可能会对页面性能造成很大的影响。尽量在文档树最末端使用。

<custom-ident>

表示开发者将要改变的元素属性。如果给定的值是缩写,则默认被扩展全。

例如,设置 will-change: background 将会被补全 background 的所有属性 will-change: background-image, background-position, ...

三、使用时须注意的几点

1、不要在过多的属性和元素上使用 will-change
* { will-change: transform, opacity /*, ...*/; }

你可能会觉得这么做不错,就可以优化一切属性了。

其实并非如此。

will-change 可能会引发一些十分耗费资源的优化措施。如果像上边这样给所有元素都添加,可能会使页面变慢,甚至崩溃。

2、在元素属性变化完成后最好移除 will-change 属性

有些情况,可以不移除。

比如,给页面中少量的元素使用 will-change 属性能使交互体验更好。

body > .sidebar {
will-change: transform;
/*当鼠标移动到侧边栏时,会有滑动效果*/
}

因为只在很少的元素上使用,所以它所能产生的副作用可以忽略不计。

当变化很频繁时也可以不移除。例如,鼠标移动产生的变化,或者持续存在的动画效果。此时设置 will-change 属性,其实就是在提示浏览器,这些元素会持续或有规律的发生变化,要保持对它们的优化。

.cats-flying-around-the-screen {
will-change: left, top;
}

3、给 will-change 属性足够的时间做准备

如果在动画开始的那一刻才添加 will-change 属性,是没有优化效果的。一些优化是需要充分的准备时间的.如果没有足够的时间,那 will-change 所能提高的性能也就无从谈起。所以要找到添加 will-change 属性的时机。

比如,当一个元素被点击时发生变化。那么就可以在 hover 事件上设置 will-change 属性。这能给浏览器提供大概200毫秒准备时间。因为相较之下,人类的响应速度较慢。这可以通过脚本或者简单的CSS来实现。

.element { transition: opacity .2s; opacity: 1; }
.element:hover { will-change: opacity; }
.element:active { opacity: .3; }

如果变化是发生在触发 hover 事件时,上边的做法就无法起到优化作用了。但还是可以找到恰当的时机的。比如在祖先元素上设置 will-change 属性,就可以给浏览器预留足够的准备时间。

.element { transition: opacity .2s; opacity: 1; }
.container:hover > .element { will-change: opacity; }
.element:hover { opacity: .3; }

兼容性一览

参考资料

[1] CSS Will Change Module Level 1: https://www.w3.org/TR/css-will-change-1/#propdef-will-change

[2] MDN will-change 中文版: https://developer.mozilla.org/zh-CN/docs/Web/CSS/will-change

关于奇舞周刊

《奇舞周刊》是360公司专业前端团队「奇舞团」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CSS的will-change属性是一种优化技术,用于提示浏览器即将发生的变形,以提高性能。这个属性可以告诉浏览器,某个元素将要发生变形,让浏览器做好相应的优化准备。 要使用will-change属性,只需在元素的样式中添加一行CSS代码:will-change: transform; 这样就可以提示浏览器该元素将要进行的变形,比如旋转、缩放等等。这样一来,浏览器可以在元素发生变形之前做一些性能优化的准备工作。 为了使元素在达到active状态时能够进行变形,我们可以使用以下CSS代码: .will-change { transition: transform 0.3s; } .will-change:hover { will-change: transform; } .will-change:active { transform: scale(1.5); } 首先,我们为元素添加了一个过渡效果,当transform属性发生变化时,过渡时间为0.3秒。然后,在元素悬停时,我们使用will-change属性告诉浏览器该元素将要进行的变形,以进一步优化性能。最后,我们使用:active伪类来定义元素在active状态下的变形效果,这里我们将元素的缩放比例设置为1.5。 通过使用will-change属性,我们可以提前告知浏览器某个元素将要发生的变形,以便浏览器做出相应的优化准备,从而提高页面的性能和用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CSS will-change属性简介](https://blog.csdn.net/culi3182/article/details/108341766)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CSS will-change 属性](https://blog.csdn.net/sunsineq/article/details/107110451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值