繁体   English   中英

Safari:通过DOM更新时,绝对定位的DIV不会移动

[英]Safari: Absolutely positioned DIVs not moving when updated via DOM

我正在尝试使用JS更新顶部和左侧CSS属性,在页面上为一些绝对定位的DIV制作动画。 在Chrome,FF甚至IE8中都不是问题,但在Safari 5中尝试它们只是坐在那里......奇怪的是,如果我调整Safari窗口的大小,它们将更新它们的位置......

你可以在这里看到它的演示:

http://www.bikelanebrakes.com/tests/flyingThing1.html

更新DIV的代码非常简单,只需要一点jQuery(也可以更新旋转,在Safari中运行正常):

$(this.elem).css({
 '-webkit-transform': 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)',
 '-moz-transform': 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)',
 'transform': 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)',
 'left': Math.round(this.xPos) + 'px',
 'top': Math.round(this.yPos) + 'px'
});

我添加了位置:相对于身体...我添加了'px'并向下舍入数字,因为Safari不喜欢长浮点值......没什么,他们只是坐在那里直到窗口调整大小。 ..

任何想法或帮助,非常赞赏!

谢谢,克里斯。

使用transform CSS属性translate子属性替换topleft 属性 对我来说,这解决了Safari 5中的问题。

另外, 不要使用字符串参数进行setInterval

演示: http//jsbin.com/okovov/2/

Bird.prototype.draw = function() {
    var transform = 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)' +
                    ' translate('+ this.xPos + 'px,' + this.yPos + 'px)';
    $(this.elem).css({
          '-webkit-transform': transform,
          '-moz-transform': transform,
          'transform': transform
    });
};
// ...
var timer1 = setInterval(function(){bird1.animate();}, 50);
var timer2 = setInterval(function(){bird2.animate();}, 50);
var timer3 = setInterval(function(){bird3.animate();}, 50);

50毫秒是一个非常小的延迟。 考虑优化您的函数,使动画执行更顺畅,例如,通过使用vanilla JavaScript替换jQuery方法:

Bird.prototype.draw = function() {
    this.elem.style.cssText = ['-webkit-', '-moz-', '', ''].join(
        'transform:rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)' +
        ' translate(' + this.xPos + 'px,' + this.yPos + 'px);'
    ); // Result: -webkit-transform: ...;-moz-transform:...;transform:...;
};

我知道这可能不是你想要的,但你可以尝试使用jQuery的.offset()来改变它们的位置,而不是手动改变它们的CSS属性。 您的代码看起来像这样:

$(this.elem).css({
 '-webkit-transform': 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)',
 '-moz-transform': 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)',
 'transform': 'rotate(' + (( this.angle * (180 / Math.PI) ) * -1) +'deg)'
})
.offset({
 top: Math.round(this.yPos),
 left: Math.round(this.xPos)
});

我希望有所帮助!

PS:如果你想设置相对位置,请使用jQuery的.position()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM