Does transform/opacity property invoke paint step in the browser conveyor(变换/不透明属性是否调用浏览器传送带中的绘制步骤)
问题描述
在调查浏览器的呈现工作原理时,我注意到,在启用了标志的Chrome开发工具中,paint flashing
触发器在更改transform/opacity
属性时会触发绘制步骤。
查看这些带有代码的屏幕截图:
示例1(transform/opacity
属性)
let elem = document.querySelector(".newLayer");
let count = 0;
function anim(){
elem.style.transform = `translate(${count}px,0)`;
/// interchangeable
/// elem.style.opacity = `${count/500}`;
if(count++ < 500)
requestAnimationFrame(anim);
}
anim();
.newLayer{
position:relative;
width:150px;
height:150px;
background-color: red;
}
<div class="newLayer">I am a new Layer</div>
示例2(transform/opacity
具有will-change
的属性)
let elem = document.querySelector(".newLayer");
let count = 0;
function anim(){
elem.style.transform = `translate(${count}px,0)`;
/// interchangeable
/// elem.style.opacity = `${count/500}`;
if(count++ < 500)
requestAnimationFrame(anim);
}
anim();
.newLayer{
will-change: transform;
position:relative;
width:150px;
height:150px;
background-color: red;
}
<div class="newLayer">I am a new Layer</div>
它把我搞糊涂了,因为我看过this one和this one来源,他们说当您使用transform/opacity
时,忽略了绘制阶段。那是什么呢?为什么我们在第一个例子中看到了油漆,而在第二个例子中没有呢?哪一个在撒谎?
有趣的一个包含2个绘制操作的示例:
let elem = document.querySelector(".newLayer");
let count = 0;
function anim(){
elem.style.left = `${count}px`;
if(count++ < 500)
requestAnimationFrame(anim);
}
anim();
.newLayer{
position:relative;
width:150px;
height:150px;
background-color: red;
}
<div class="newLayer">I am a new Layer</div>
will-change
的示例。这是什么意思(我说的是细小条纹长度的油漆)?
小漆挡路跟栅格线有关吗,大的呢?
推荐答案
两个示例都没有说谎。
浏览器最大限度地减少了合成所需的层数。它只有在有理由相信会有好处的情况下才会创建一个层。
如果您使用CSS过渡、CSS动画或Web动画设置变换或不透明度动画,浏览器会提前知道元素正在以一种可能通过创建层进行优化的方式进行动画制作,因此Chrome会在动画持续时间内创建一个动画。
如果使用RAF设置动画,浏览器就没有这种预见性。will-change
作为一种提示浏览器应根据更改的属性为此元素创建层的方式而存在。
这些都是提示,并不保证浏览器会创建层。有些浏览器还会在其他情况下创建层,例如当另一个元素需要在层上绘制时,以及在其他一些CSS(如transform: translateZ(…)
)的情况下。
这篇关于变换/不透明属性是否调用浏览器传送带中的绘制步骤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:变换/不透明属性是否调用浏览器传送带中的绘制步骤
基础教程推荐
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 动态更新多个选择框 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 在for循环中使用setTimeout 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01