webkit-transform在Safari上打破了z-index

zer*_*llz 16 safari html5 webkit css3

问题

我试图让一个层看起来像是一堵墙倒塌,露出它背后的层.我已经设置了两个固定的div位置."Wall"div的z-index为9999,"Background"div的z-index为0;

在我测试的Webkit浏览器(Safari/IOS)中,似乎一旦动画在"墙"上开始,z索引就会丢失或被忽略,导致"墙"层突然消失在背景div后面.

关于如何保留图层的z索引的任何想法?提前致谢!

示例代码 (注意:底部的jsFiddle)

HTML代码

<div id="wall">
    This is the wall
</div>

<div id="background">
    This is the background
</div>

<button id="start" style="float: right;">
Flip Down
</button>
Run Code Online (Sandbox Code Playgroud)

一些javascript启用按钮

$('#start').click(function(){
    alert('Should Fall Down like a wall, revealing the background');
    $('#wall').addClass('animated flipDown');
});
Run Code Online (Sandbox Code Playgroud)

CSS代码(来自animate.css)

#wall{
    background-color: #F00;
    width: 100px;
    height: 100px;
    position:fixed;
    top:0;
    left:0;
    z-index: 9999;
}

#background{
    background-color: #00F;
    width: 100px;
    height: 100px; 
    position:fixed;
    top:0;
    left:0;
    z-index: 0;
}

.animated {
  -webkit-animation-duration: 1s;
  animation-duration: 1s;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;
}


/*** flipDown ***/

@-webkit-keyframes flipDown {
  0% {
    -webkit-transform: perspective(400px) rotateX(0deg);
    transform: perspective(400px) rotateX(0deg);
    -webkit-transform-style: flat;
    opacity: 1;
  }

  100% {
    -webkit-transform: perspective(400px) rotateX(90deg);
    transform: perspective(400px) rotateX(90deg);
    -webkit-transform-style: flat;
    opacity: 1;
  }
}

@keyframes flipDown {
  0% {
    -webkit-transform: perspective(400px) rotateX(0deg);
    -ms-transform: perspective(400px) rotateX(0deg);
    transform: perspective(400px) rotateX(0deg);
    opacity: 1;
  }

  100% {
    -webkit-transform: perspective(400px) rotateX(90deg);
    -ms-transform: perspective(400px) rotateX(90deg);
    transform: perspective(400px) rotateX(90deg);
    opacity: 0;
  }
}

.flipDown {
    -webkit-animation-name: flipDown;
    animation-name: flipDown;
    -webkit-backface-visibility: visible !important;
    -ms-backface-visibility: visible !important;
    backface-visibility: visible !important;
    -webkit-transform-origin: bottom;
    -ms-transform-origin: bottom;
    transform-origin: bottom;
}
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

http://jsfiddle.net/3mHe2/2/

查看Safari与Chrome之间的差异.

Kit*_*nde 22

我的旋转元素不适合与背景相邻,但我通过应用修复它

transform: translateZ(1000px);
transform-style: preserve-3d;
Run Code Online (Sandbox Code Playgroud)

到旋转元素的父节点.Safari现在认为它的背景是1000px.


zer*_*llz 13

找到了解决方案.希望这可以帮助将来的某个人.

事实证明,webkit的safari版本中存在"bug".播放3d css动画时,原始z索引将丢失.相反,似乎将动画片段放入单独的z-index"组"中,该组与DOM的其余z索引分开.

解决方案是将背景div和wall div连接到同一个z-index组中,方法是将它包装在一个带有webkit变换的div中,该变换不会改变任何东西.这使得背景和墙成为包装div的子元素,并且保留了相应子元素的z-indexing.

<div id="wrapper" style="-webkit-transform: translate3d(0px, 0px, 0px);">
    <div id="wall">
        This is the wall
    </div>

    <div id="background">
        This is the background
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我认为这与此相同或类似:

webkit转换translate3d后css z-index丢失


piz*_*r0b 6

我遇到了这个问题,直到我将透视图添加到应该位于其后的项目的父容器中之前,什么都无法解决。

.wrap{
    perspective: 1000px;
}
Run Code Online (Sandbox Code Playgroud)