首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换/不透明度属性是否调用浏览器传输程序中的绘制步骤?

转换/不透明度属性是否调用浏览器传输程序中的绘制步骤?
EN

Stack Overflow用户
提问于 2022-02-10 20:45:34
回答 1查看 214关注 0票数 2

在研究浏览器的呈现工作方式时,我注意到在带有启用标志的chrome工具中,paint flashing触发了更改transform/opacity属性的画图步骤。

使用代码查看这些屏幕截图:

示例1 (**transform/opacity** 属性)

代码语言:javascript
复制
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();
代码语言:javascript
复制
.newLayer{
  position:relative;
  width:150px;
  height:150px;
  background-color: red;
}
代码语言:javascript
复制
<div class="newLayer">I am a new Layer</div>

带有will-change**)**的示例2 (**transform/opacity** 属性)

代码语言:javascript
复制
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();
代码语言:javascript
复制
.newLayer{
  will-change: transform;
  position:relative;
  width:150px;
  height:150px;
  background-color: red;
}
代码语言:javascript
复制
<div class="newLayer">I am a new Layer</div>

这让我感到困惑,因为我已经看到了这一个这一个的来源,他们说当你使用transform/opacity时,油漆阶段已经结束了。那么这是什么呢?为什么我们在第一个例子中看到油漆,而在第二个例子中看不到?哪一个在撒谎?

有趣的一个例子,有两个油漆操作:

代码语言:javascript
复制
let elem = document.querySelector(".newLayer");
let count = 0;
function anim(){
  elem.style.left = `${count}px`;
  if(count++ < 500)
    requestAnimationFrame(anim);
  }
anim();
代码语言:javascript
复制
.newLayer{
  position:relative;
  width:150px;
  height:150px;
  background-color: red;
}
代码语言:javascript
复制
<div class="newLayer">I am a new Layer</div>

是的,有使用的定位属性,但是看看油漆操作,一条大条,一条小条,比如在没有will-change的示例中。这是什么意思(我指的是带有小条纹长度的油漆)?

小油漆块和光栅线有关吗?大的怎么样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-13 08:29:06

这两个例子都不是谎言。

浏览器最大限度地减少了组合在一起所需的层数。只有当它有理由相信会有好处时,它才会创建一个图层。

如果您使用CSS转换、CSS动画或web动画来动画转换或不透明,浏览器会提前知道元素是以一种可能通过创建层来优化的方式动画的,因此Chrome会在动画期间创建一个。

如果您使用rAF动画,浏览器就没有这个远见。will-change的存在是为了向浏览器提示它应该为这个元素创建一个层,这取决于不断变化的属性。

这些都是提示,浏览器不能保证创建一个层。在其他情况下,有些浏览器会创建一个层,例如当另一个元素需要在一个层的顶部绘制时,以及在其他一些CSS (如transform: translateZ(…) )的情况下。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71072045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档