立即读取元素'CSS更改后的视觉属性
Immediately read an element's visual properties after a CSS change?
我正在尝试使用CSS更改HTML页面上的一个元素,然后立即读取其视觉属性。然而,CSS强制样式要到稍后(下一个"帧")才能应用。
CSS:
.node {
width: 10px;
}
JavaScript:
// Create element
var element = document.createElement("div");
element.className = "node";
document.body.appendChild(element);
console.log(element.clientWidth);
上面的log
调用的输出应该是10
,但如果立即调用它,它就是NaN
(但在一帧之后它被正确地读取为10
)。
使用getComputedStyle()
可以得到类似的结果:
var style = getComputedStyle(element);
console.log(element.style);
第一次运行时输出为",但在第一帧之后输出为"10px"(正确)。
我假设我必须等待一次浏览器的重新布局,直到我可以读取属性。有没有办法强制浏览器计算该元素的尺寸?或者这可能是一种糟糕的做法;有没有一种简单的方法可以读取CSS的width属性?
换句话说,这里的最佳做法是什么?
注意:尽量避免在这里使用jQuery或其他库。
请尝试访问computedStyle
。
var computedStyle = document.defaultView ? document.defaultView.getComputedStyle(element, null) : element.currentStyle;
然后读取
console.log( computedStyle.width);
示例:http://jsfiddle.net/mGCT5/1/
您说得对,浏览器必须执行回流,然后才能确定更改后的属性的效果(从而读取更改后的值)。我相信你知道,JavaScript是由浏览器的内部事件循环执行的。直到当前事件的JS代码被完全执行后才会执行回流。
为了解决您的问题,您可以使用setImmediate()
。这允许您对要尽快处理的新事件进行排队。你基本上是"屈服"的,允许回流发生,然后跳回来完成代码的其余部分:
var element = document.createElement("div");
element.className = "node";
document.appendChild(element);
setImmediate(function() {
console.log(element.clientWidth);
});
请注意,到目前为止,很少有流行的浏览器支持setImmediate
。作为一种变通方法,您可以使用延迟为0
:的setTimeout
setTimeout(function() {
console.log(element.clientWidth);
}, 0);
下面是一个工作示例:jsbin.com/ehigor
还要记住,放在setTimeout
块之后的任何代码都将在块内部的代码之前执行,在当前"帧"结束之前执行,因此在回流之前执行。
更新:
jAndy的回答是对的;getComputedStyle
将解决OP的问题。在这种情况下,不需要回流,因为您所要做的只是按照设置读取CSS属性。
之所以需要getComputedStyle
,是因为JavaScript中没有设置样式规则。与element.style
不同,getComputedStyle
将考虑外部CSS文件中设置的样式规则以及浏览器的默认样式规则。
在某些情况下,getComputedStyle
不够,需要回流:当样式规则的值与样式的实际最终值不直接相关时。最显著的情况是相对维度和位置。如果将width
设置为(例如)50%
,但要读取元素的宽度(以像素为单位),则只能通过让浏览器执行回流来找出该值(在这种情况下setTimeout
很有用)。另一方面,如果您想知道width
被设置为"50%"
;使用CCD_ 22。
在检查宽度之前,可以使用setTimeout等待半秒钟?
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- 锚点元素的href属性自动更改
- 自定义CSS复选框jQuery诱导的“;“已检查”;属性不't在视觉上”;“检查”;复选框
- 立即读取元素'CSS更改后的视觉属性