一、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

最后

  • 欢迎加我微信(winty230),拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

点个在看支持我吧

说一说will-change相关推荐

  1. mysql中change用法,mysql 中alter的用法以及一些步骤

    mysql 中alter的用法以及一些方法 在用到alter的时间,查到了这个文章,就copy下来了,详细进入下面链接: MySQL之alter语句用法总结 1:删除列 ALTER TABLE [表名 ...

  2. Linux下stat + 文件名后, Access,Modify,Change的含义

    我们首先在一个目录下创建了一个文件使用命令touch file 然后输入命令:stat file,这个时候会输出一系列信息 大家注意红色框中的三个时间 Access : 文件最近一次被访问的时间 Mo ...

  3. java changelistener_ListChangeListener.Change

    表示对Observablelist进行的更改的报告. 更改可能包含一个或多个实际更改,并且必须由next()方法迭代. 每个更改必须是以下之一: 在这种情况下, 排列变化 : wasPermutate ...

  4. jQuery绑定事件的三种常见方式(bind、one、【change、click、keydown、hover】)

    一.bind(type,[data],fn):为每个匹配元素的特定事件绑定对应的事件处理函数. 也可以同时给一个元素绑定多个事件,我们来看一下例子: <!DOCTYPE html> < ...

  5. Oracle CDC (Change Data Capture)更新数据捕获——概述

    Change Data Capture能高效识别并捕获数据的插入.修改和删除,使更新数据供个人或应用使用. CDC从oracle 9i开始引入,//TODO 在11G R2之后的版本里将取消支持,被O ...

  6. ORACLE HANDBOOK系列之十四:变化通知(Change Notification)

    在App开发的过程中,有些数据访问频率很高但是数据变化不大,我们一般会让它驻留内存以提高访问性能,但是此种机制存在一个问题,那就是如何监测数据的变化,Oracle 10g中引入的 Change Not ...

  7. 差异基因分析:fold change(差异倍数), P-value(差异的显著性)

    做基因表达分析时必然会要做差异分析(DE) DE的方法主要有两种: Fold change t-test fold change的意思是样本质检表达量的差异倍数,log2 fold change的意思 ...

  8. Error in setwd(***) : cannot change working directory

    Error in setwd(***) :   cannot change working directory 目录 Error in setwd(***) :   cannot change wor ...

  9. seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X Y Axis Labels to a Seaborn Plot)

    seaborn可视化散点图并自定义数据轴标签(X轴和Y轴的轴标签,Change X & Y Axis Labels to a Seaborn Plot) 目录

  10. seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot)

    seaborn可视化散点图并自定义可视化结果图像的大小(Change the Size of a Seaborn Plot) 目录 seaborn可视化散点图并自定义可视化结果图像的大小(Change ...

最新文章

  1. Android WebView使用与JavaScript使用
  2. Vue 数组中更新属性值后,视图不更新,等待其他元素更新后会触发的解决办法...
  3. python建立列表_python创建列表和向列表添加元素的实现方法
  4. 手动加支付宝遇到的错误--iOS
  5. PPT转换PDF格式怎么转换?后悔现在才知道
  6. 区块链技术与微服务架构之间有什么关系?
  7. Windows Azure Cloud Service (25) 使用Startup注册COM组件(下)
  8. 位说法的由来_南方土地庙有榕树的原因,为何会有榕树不容人的说法?
  9. 基于STM32F103驱动TM1640LED数码管代码实现
  10. 图像加密算法毕业论文【含代码】
  11. 一句批处理快速把优酷KUX转MP4
  12. 5W2H法分析用户流失内因
  13. 最新仿淘宝详细页头部渐变效果
  14. Oracle19c安装(有失败成功记录)
  15. 新唐M251 CORTEX-M23内核移植TencentOS tiny教程
  16. 腾讯云函数免费搭建onedrive网盘
  17. 微信公众号编辑文章发布时,弹出,图文消息中含有敏感词
  18. 灰狼优化算法训练多层感知神经网络研究(Matlab代码实现)
  19. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
  20. vue3中body有默认属性margin:8px如何去掉?

热门文章

  1. 数据分析学习日记 Day4
  2. ssm+vue+elementUI 基于微信小程序的游戏美术外包管理信息系统-#毕业设计
  3. HTML中图片无法显示的问题
  4. 【图解 HTTP】 读书笔记
  5. CSS深度学习 - 文本方向 direction 和 dir
  6. 投掷硬币(概率dp)
  7. 基于Python的Open3D库模型数据简单读取测试
  8. 生成全局唯一ID的3个思路
  9. 【C++ 程序】 Fractal Designer 0.2
  10. 美通企业日报 | 施耐德电气全球两大设计中心落户西安;托福全球开放下午场考试...