【发布时间】:2011-05-11 14:04:43
【问题描述】:
我知道直接通过 JavaScript 更改元素的样式会导致重排。但是,我想知道是否可以只用一次回流就可以在一批中更改多个样式值?
【问题讨论】:
标签: javascript dom layout
我知道直接通过 JavaScript 更改元素的样式会导致重排。但是,我想知道是否可以只用一次回流就可以在一批中更改多个样式值?
【问题讨论】:
标签: javascript dom layout
不是直接的,但这里有一些关于尽量减少回流影响的好建议:
http://dev.opera.com/articles/view/efficient-javascript/?page=3
简而言之,试试这样的:
第二种方法是定义一个新的 元素的样式属性, 而不是一个分配样式 一。大多数情况下,这适用于 动态变化,例如动画, 无法知道新样式的地方 提前。这是使用任一 样式的 cssText 属性 对象,或使用 setAttribute。 Internet Explorer 不允许 第二个版本,需要第一个。 一些较旧的浏览器,包括 Opera 8、需要第二种方法,并且做 第一个不明白。所以容易 方法是检查第一个版本是否 支持并使用它,然后跌倒 如果没有,则返回第二个。
var posElem = document.getElementById('animation');
var newStyle = 'background: ' + newBack + ';' +
'color: ' + newColor + ';' +
'border: ' + newBorder + ';';
if( typeof( posElem.style.cssText ) != 'undefined' ) {
posElem.style.cssText = newStyle; // Use += to preserve existing styles
} else {
posElem.setAttribute('style',newStyle);
}
如果你使用的是 jQuery,它有一个 .css 函数可以让你一次添加多个样式:
$('element').css({'color':'red', 'border':'#555 solid thin'});
【讨论】:
您可以将所有样式放在一个 CSS 类中
.foo { background:#000; color:#fff; ... }
然后将其分配给 className 属性
// javascript
var your_node = document.getElementById('node_id');
your_node.className = 'foo'
那应该只触发一次重绘/重排
【讨论】:
您可以将元素的可见性设置为“隐藏”,然后应用样式,然后再次使其可见。
【讨论】:
使用:
document.getElementById('elemnt_ID').setAttribute('style','color:white; margin:5px;');
【讨论】: