Safari:绝对定位的DIV在通过DOM更新时不会移动
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不喜欢长浮点值。。。什么都没有,他们只是坐在那里,直到调整窗口大小。。。
任何想法或帮助,非常感谢!
谢谢,克里斯。
将top
和left
属性替换为transform
CSS属性的translate
子属性。对我来说,这解决了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毫秒是一个非常小的延迟。考虑优化您的函数,使动画执行更流畅,例如,用普通的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().
相关文章:
- 从angularjs中的javascript更新dom
- Javascript没有't更新DOM,直到用户交互
- 如何让React JS点击处理程序在执行时更新DOM
- Ionic:AngularJS变量未使用$scope更新DOM
- 使用Javascript通过ajax回调更新DOM
- Angular JS根据搜索结果和点击事件更新DOM元素
- 我如何告诉javascript立即更新DOM
- 引导复选框-x 选中时未正确更新 DOM - 如何验证表单
- 通过Javascript重复更新DOM后,网页变得很慢
- jQuery更新DOM并运行change()方法
- 使用Angular Directive用$scope属性更新DOM-只要指令运行(无需等待事件)
- AngularJS:在长时间循环期间强制更新DOM(即进度指示器)
- Polymer:当数组中的对象被外部代码修改时,更新dom重复元素
- Javascript 复杂的附加和更新 DOM,因此可以使用 remove(); 将其删除
- ng-show 不更新 DOM 元素
- 浏览器如何从内部HTML属性更新DOM
- 更新 DOM 中的标签
- 是否有模板引擎可以在数据更改时更新 DOM
- 在 AngularJS 中使用从 websockets 动态获取的外部 JSON 数据自动更新 DOM
- 更新 DOM 后“鼠标向上”出现问题