使用CSS动画缩放居中div时的不稳定行为

时间:2012-04-12 16:40:24

标签: html css css3 css-transitions

我有一个垂直+水平居中的div,在使用CSS动画调整大小时显示不稳定的抖动。

div绝对定位,具有固定的宽度/高度和负边距。

动画本身只是两组不同的固定宽度/高度和负边距值之间的切换,并设置了自定义过渡属性。

几乎感觉负边距在宽度和高度的不同速度下都会被动画化。

我尝试使用jQuery animate()而不是css()更改使用的CSS转换(线性,夸脱等),但它们会产生相同的结果。

是否有人能够解释为什么会发生这种情况并且可能是更好的方法,只要它适用于IE> = 8?

示例:
http://jsfiddle.net/p4B3S/1/

HTML

<div class="outer">
    <div class="inner">
        +
    </div>
</div>
<button>toggle</button>​

CSS:

.outer {
    /* easeOutQuart */
    -webkit-transition: all 750ms cubic-bezier(0.165, 0.840, 0.440, 1.000); 
       -moz-transition: all 750ms cubic-bezier(0.165, 0.840, 0.440, 1.000); 
        -ms-transition: all 750ms cubic-bezier(0.165, 0.840, 0.440, 1.000); 
         -o-transition: all 750ms cubic-bezier(0.165, 0.840, 0.440, 1.000); 
            transition: all 750ms cubic-bezier(0.165, 0.840, 0.440, 1.000);

    position: absolute;

    width: 200px;
    height: 200px;

    left: 50%;
    top: 50%;

    margin-left: -100px;
    margin-top: -100px;

    outline: 1px solid red;       
}

.inner {
    position: absolute;

    width: 40px;
    height: 40px;

    top: 50%;
    left: 50%;    

    margin-left: -20px;
    margin-top: -20px;

    text-align: center;

    line-height: 40px;

    outline: 1px solid blue;    
}

button {
    width: 100px;
    height: 50px;
}

的jQuery

$button = $('button');
$outer = $('.outer');

$button.toggle(function() {
    $outer.css({
        'width': '100px',
        'height': '100px',
        'margin-left': '-50px',
        'margin-top': '-50px'
    });
}, function() {
    $outer.css({
        'width': '200px',
        'height': '200px',
        'margin-left': '-100px',
        'margin-top': '-100px'        
    });    
});

2 个答案:

答案 0 :(得分:0)

我没有代表简单评论,所以我会在这里给你我的意见。 IE8.0.7601.17514 64位没有转换。无论是大型还是小型......在1920x1080&amp;运行时,我的FF11上的转换似乎完美无缺。但是,当我使用Web Developer Toolbar插件调整屏幕大小调整到1280x720并按下切换按钮时,红色框转换,蓝色框保持静止,并且小黑色十字准线振动并在整个地方反弹;在800x600时,红色盒子正常转换,但是中间的蓝色盒子在之前的静态振动并且可能被称为摇摇欲坠,在640x480时,一切都振动并反弹。基于此,我将不得不推断它必须做使用您的px定义的大小和相对于屏幕大小/分辨率的固定位置,而不是其他任何内容。

答案 1 :(得分:0)

我认为答案在于实现舍入子像素值。

据我所知,Chrome 27.0似乎没有这个问题,但对于大多数其他浏览器,我认为它仍然没有解决。

  

渲染引擎应该如何发挥这种行为不是由CSS规范决定的,而是让它留给实现来按照它认为合适的方式进行渲染。

以上引用来自John Resig,他在子喷气机上发表了一篇有趣的帖子 - 以及关于这是否真的是一种理想的浏览器行为的热烈评论:http://ejohn.org/blog/sub-pixel-problems-in-css/