复杂的Webkit Bug?相对位置+ Z-Index +溢出隐藏+ CSS3变换

时间:2013-07-30 14:26:22

标签: jquery html html5 css3 webkit

与其他现代浏览器相比,下面的代码(JSFiddle Preview)会在Webkit中产生意外结果:

<script type="text/javascript">
jQuery(document).ready(function($) {
    RunFunction();

    $('.ColorSquare').click(function() {
        $('#Lightbox').css('display','block');
        $('#ShowColorSquare').css('display','block');
        $('#ShowColorSquare').css('z-index','10');
        $('#ShowColorSquare').css('left',$('#ShowColorSquare').parent().width() / 2 - 50);
        $('#ShowColorSquare').css('top',$('#ShowColorSquare').parent().height() / 2 - 50);
        $('#ShowColorSquare').html('The color is: ' + $(this).css('background-color'));
    });
    $('#ShowColorSquare').click(function() {
        $('#Lightbox').css('display','none');
        $('#ShowColorSquare').css('display','none');
        $('#ShowColorSquare').html('');
    });
    $('#Lightbox').click(function() {
        $('#Lightbox').css('display','none');
        $('#ShowColorSquare').css('display','none');
        $('#ShowColorSquare').html('');
    });
});
function RunFunction() {
    $('#slide1').animate({
        left: '-=310'
    }, 3000);
    $('#slide2').animate({
        left: '-=310'
    }, 3000);
    $('#slide3').animate({
        left: '-=310'
    }, 3000, function() {
        if($('#slide1').css("left") == '-310px') {
            $('#slide1').css("left",620);
        }
        if($('#slide2').css("left") == '-310px') {
            $('#slide2').css("left",620);
        }
        if($('#slide3').css("left") == '-310px') {
            $('#slide3').css("left",620);
        }   
        RunFunction(); 
    });
}
</script>
<style>
#Spin {
    width:50px;
    height:50px;
    margin: 15px 0px 15px 15px;
    background-color:#960;
    animation-name:Spin;
    animation-duration:5s;
    transform-origin:50% 50%;
    animation-iteration-count:infinite;

    -webkit-animation-name:Spin;
    -webkit-animation-duration:5s;
    -webkit-transform-origin:50% 50%;
    -webkit-animation-iteration-count:infinite;
}
@keyframes Spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}
@-webkit-keyframes Spin {
    0% { -webkit-transform: rotate(0deg); }
    100% { -webkit-transform: rotate(360deg); }
}
.ColorSquare {
    height:100px;
    width:100px;
    position:absolute;
}
#ShowColorSquare {
    height:100px;
    width:100px;
    position:absolute;
    background-color:white;
    display:none;
}
#Lightbox {
    background-color:#000;
    width:100%;
    height:100%;
    position:fixed;
    top:0px;
    left:0px;
    opacity:.8;
    display:none;
    z-index:5;
}
.Panel {
    width:225px;
    height:250px;
    position:absolute;
    background-color:#6C6C6C;
}
</style>

<div id="Spin"></div>

<div style="height:260px;width:500px;overflow-x:hidden;background:#CCC;">
    <div style="height:250px;width:500px;position:relative;">
        <div id="slide1" class="Panel" style="top:0px;left:0px;">
            <div>Slide 1</div>
            <div style="position:relative;margin-top:10px;width:225px;height:200px;">
                <div class="ColorSquare" style="background-color:#093;left:0px;top:0px;"></div>
                <div class="ColorSquare" style="background-color:#C9F;left:100px;top:100px;"></div>
            </div>
        </div>
        <div id="slide2" class="Panel" style="top:0px;left:310px;">
            <div>Slide 2</div>
            <div style="position:relative;margin-top:10px;width:225px;height:200px;">
                <div class="ColorSquare" style="background-color:#CF9;left:0px;top:0px;"></div>
                <div class="ColorSquare" style="background-color:#C63;left:100px;top:100px;"></div>
            </div>
        </div>
        <div id="slide3" class="Panel" style="top:0px;left:620px;">
            <div>Slide 3</div>
            <div style="position:relative;margin-top:10px;width:225px;height:200px;">
                <div class="ColorSquare" style="background-color:#696;left:0px;top:0px;"></div>
                <div class="ColorSquare" style="background-color:#F96;left:100px;top:100px;"></div>
            </div>
        </div>
        <div id="ShowColorSquare"></div>
    </div>
</div>
<div id="Lightbox"></div>

预期结果:它应该有3个DIV(幻灯片)在循环中连续动画到左边,包括幻灯片中受尊重的彩色框。如果单击彩色框,则会显示一个灯箱,其中在所关注的幻灯片中单击了彩色框的RBG颜色。再次单击以关闭灯箱。在浅灰色父DIV之前应用3D变换,同时隐藏溢出的位置,Jquery在绝对定位幻灯片DIV上设置动画。

Webkit中的结果:在您调整桌面上的浏览器窗口大小或单击平板电脑上的JSFiddle面板大小调整手柄(或捏/ zoon)之前,幻灯片中的彩色框似乎根本不会移动/渲染。在不同的调试注释中,如果3D变换动画没有循环,则当动画停止时,DIV将按预期进行渲染。

显示Webkit错误的测试结果:

  • Win7 IE10:传递
  • Win7 Chrome:传递
  • Win7 FF:传递
  • Win7 Safari:失败
  • Win8 IE11:传递
  • Android Chrome:失败
  • iOS Safari:失败
  • iOS Chrome:失败
  • MacOS Safari:失败
  • MacOS Chrome:失败

注意(JSFiddle Preview)没有3D变换,代码可以工作,尽管桌面上的动画不流畅。灯箱工作正常。

注意(JSFiddle Preview)在父DIV之后使用3D变换,动画是平滑的,灯箱工作正常。

注意(JSFiddle Preview -webkit-transform:rotate(0deg)应用于带有溢出的父DIV,平板电脑上的动画不稳定,但3D转换可以存在在父DIV之前或在幻灯片DIV中。但是创建了另一个问题。父溢出DIV的z-index低于灯箱,使得暗灯箱DIV显示在父DIV内的白色对话框DIV上方。

我知道这是一个非常奇怪的例子,但这是一个更私密的复杂代码的淡化例子。 3D变换必须在父DIV之前或幻灯片中。灯箱对话框必须位于父DIV或幻灯片内,但显示在暗灯箱DIV上方,不能在父DIV内,因为隐藏的溢出不会使暗灯箱DIV显示为完整的浏览器屏幕。

感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

如果您在Chrome http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome中阅读GPU加速合成,您会发现renderLayer会在以下情况下获得自己的合成图层:

  1. 图层具有3D或透视变换CSS属性
  2. 使用加速视频解码的视频元素使用图层
  3. 图层由具有3D或2D上下文的canvas元素使用
  4. Layer使用CSS动画作为其不透明度或使用动画webkit转换
  5. 图层有一个具有合成图层的后代
  6. 图层有一个较低z-index的兄弟,它有一个合成图层(换句话说,图层在合成图层上呈现)
  7. 添加或删除3D变换时,您会得到不同的结果,因为代码要么通过GPU加速路径,要么通过软件渲染路径。 GPU加速路径对你拥有的GPU /驱动程序非常敏感,如果你看到任何奇怪的图形故障,你应该检查的第一件事是当你在chrome中关闭硬件加速时它们是否仍然存在://标志/

    所有三个示例都适用于Chrome OSX,因此这可能是特定图形卡的浏览器错误。如果你能找到一个基本案例,我会建议用你的GPU信息向chrome项目报告这个bug。

答案 1 :(得分:0)

我认为硬件加速可能是个问题.. 你可以看一下这个问题和接受的答案......

Chk this

尝试chrome://gpu并寻找差异..