问题 Google Chrome无法在3d转换后的元素上应用不透明度转换


我有以下标记:

<div class="cube trigger cuberotate">
    <div class="face init f z"></div>
    <div class="face init l y"></div>
    <div class="face init b z"></div>
    <div class="face init r y"></div>
    <div class="face init u x"></div>
    <div class="face init d x"></div>
</div>

它类似于一个三维立方体,每个面都旋转并转换到它们的正确位置,我让立方体在面部的父级上使用动画旋转。

这是相关的css:

.cube {
  position: absolute;
  cursor: pointer;

  width: 120px;
  height: 120px;

  top: 0;
  left: 0;

  transform-origin: 50% 50%;
  transform-style: preserve-3d;
}

.face {
  position: absolute;

  width: 120px;
  height: 120px;

  border: 0px solid #fff;
  background: #c82222;

  transform-origin: 50% 50%;

  opacity: 1;
  padding: 0px;

  -webkit-touch-callout: none;
  user-select: none;

  transition: all 0.5s ease-out;    
}

我想让文件准备好时立方体出现在一张脸上,所以我只是扔了一些javascript,基本上是每500毫秒的一个间隔,它只是删除了 .init 超越的类 opacity: 1 价值 .face 类。

(function($) {
  'use strict';

  // Some selectors and shit...
  var $face = $('.face').first(),
      speed = 500,
      timer = null;

  $(document).ready(function(){
    // Start showing faces
    timer = window.setInterval(function(){
      var $next = $face.next();

      $face.removeClass('init');

      if(!$next.hasClass('face')) {
        window.clearInterval(timer);
      }

      $face = $next;
    }, speed);

  });


})(jQuery);


// And the additional CSS below
.face.init {
  opacity: 0;
}

在一个理想的世界中,这段代码应该有效,但是我在Google Chrome上面临一个问题,在删除类后,不透明度不会转换回1,从而使多维数据集完全不可见。如果右键单击并检查它再次可见。

好奇地在Safari上,这也是一个基于webkit的浏览器,这根本不会发生,而且这些面孔在他们应该做的时候会显示出一个。

我试着用两者 .animate() 来自jquery,还尝试了jquery插件 过境

  • 现在,Safari和Chrome不应该以相同的方式运行,或者尽管渲染引擎是相同的,但是引擎盖下是否存在重大差异?
  • 这是我做错了吗?
  • 这有一个解决方法吗?

这是我的笔: http://codepen.io/luigimannoni/pen/FstKG/

谢谢

更新:

我在Mac上以及Windows 7上的Chrome上都尝试过,它们的行为方式相同(不同的机器也是如此)

还尝试了Firefox,它像Safari一样无缝地工作,除了没有发生的旋转动画(但我不考虑Firefox,因为它是一个不同的浏览器)。

其他更新:

移动设备上的Chrome(iOS和Android)在桌面上的工作和行为类似于Safari。

另一个更新:

在四处玩耍之后,我发现它可能是一个浏览器错误,Chrome Canary可以正常运行。 我在facebook上发布了这个,我从开发人员那里得到了一些很好的解决方法,我觉得这很有创意。

参与的第一个具有rgba()背景颜色并进行alpha更改而不是在不透明度上进行转换: http://codepen.io/anon/pen/IjsBL

第二个涉及一些javascript编码,迫使浏览器重绘每个帧的面: http://codepen.io/anon/pen/Hofzb

我正在开始赏金,看看stackoverflow可以在这做什么!


1144
2018-04-29 15:49


起源

对于遇到此问题的其他用户发布这些解决方法会很好(虽然这个错误是在金丝雀中修复的,但应该在不久的将来纳入稳定) - Gabriele Petrioli
我是在Facebook上提供变通方法的开发人员。我现在就给他们写一个答案。虽然 opacity: 0.01; 伤害了我一点:| - Sethi


答案:


您可以尝试将0.01分配给 opacity

.face.init {
  opacity: 0.01;
}

6
2018-05-02 02:49



这完全是扁平的,我应该为不考虑这个而感到羞耻 - MacK
我接受这是正确的答案,因为这是解决这个问题的最简单方法。除此之外,我正在退出Web开发。 - MacK


看起来像是一个 记录回归错误

对于Safari和Chrome的区别,您应该知道Chrome使用的 一个webkit fork)作为自版本28以来的渲染引擎。


3
2018-05-01 16:49





这个问题在Facebook上引起了我的注意。根据要求,我会发布我最初的思考过程。

初步思考:积极的GPU使用/硬件加速

最初,我认为Chrome正在看关键帧中的3D变换 - 动画和硬件加速动画 - 这是我们所期望的 - 但是当试图通过JavaScript进行干涉时,并没有中断GPU的执行。

解决方法1:

首先使用单独的关键帧 - 动画同时为不透明度和旋转设置动画,然后启动当前动画,仅动画旋转以无限延续。

看到这个 codepen

解决方法2:

然后我立刻意识到他希望每张脸都按顺序独立地淡入。知道javascript没有打断CSS动画,我试着动画了 .face使用关键帧动画。用一个 animation-delay 错开每一张脸。

看到这个 codepen。但由于某种原因,它在第一张脸后停止:(

解决方法3:

此时我抓着稻草,想着要拨动 perspective: 500px 至 perspective: 501px在一个 requestAnimationFrame 回调,希望它会破坏硬件加速,但没有运气。

解决方法3.1:

但是用过了 requestAnimationFrame,我决定我可以使用javascript执行第一次旋转和预期的淡入淡出,然后触发CSS动画。

看到这个 codepen。这是预期的视觉效果。

解决方法4:

虽然其他任何人都会完成并且拂去灰尘,但仍然使用javascript让我陷入困境 - 尽管我喜欢JS,但CSS更加流畅(现在)。

然后它打了我!我可以动画 background-color: rgba(...); 而不是 opacity: ...;

最后,我使用纯CSS制作了预期的动画。

看到这个 codepen

这是基于 解决方法2。我不得不创建3个额外的动画:每种颜色一个 .face 通过课程确定 .x.y 和 .z

我使用SCSS来说明我使用的是原始颜色(因此 rgba(#c82222,0);并且还要保存自己无论如何必须将其转换为RGB值。


希望有所帮助 任何人 :)


2
2018-05-08 10:02



现在注意到,如果标签失去焦点或者根本没有焦点,你发布的3.1就会停止工作。例如,如果您按CTRL +单击以在新选项卡中打开,然后在页面之后打开它,它的加载看起来就像是在开始时卡住了。 - MacK
是啊。该 requestAnimationFrame 窗口/选项卡未聚焦/激活时,不会调用回调。可以通过应用来解决这个问题 opacity: 1 到了 .faces in time >= duration 科。或处理 window.onblur/window.onfocus 暂停/取消暂停动画的事件。 - Sethi


请尝试使用更多转换值从零开始不透明度。


0
2018-05-08 07:21



对不起,我并不完全明白你的意思。你能举个例子来扩展你的答案吗? - MacK


CSS位置相对修复问题:

.fullscreen {
  position: relative;

http://codepen.io/anon/pen/oekyt

它让我想起了你必须设置的旧IE漏洞

*zoom: 1;

对于元素。它使元素“真正呈现”,而不仅仅是“光渲染”。


0
2018-05-08 13:14



显然这个解决方案也不起作用,它的行为就像我发布的原始解决方案一样。 - MacK