我在想CSS是否会改变DOM。
我问这个问题的原因是,每当我用CSS更改一个元素时,我并没有看到它的值在“element”.style属性中发生变化。
不,CSS 不会改变 DOM。 使用 :after 或 :before 注入的内容也不会改变 DOM。
实际上...有一些情况下CSS可以改变DOM,但这有点牵强,因为它不会改变DOM树的结构,除非在一个更加牵强的情况下...
在HTML规范中有一个正在渲染的定义,在某些情况下会影响DOM的行为,基于CSS计算样式。
例如,
width
和height
IDL属性值的改变是否正在渲染来改变:onload = (evt) => {
console.log( 'rendered', document.getElementById( 'disp' ).width );
console.log( 'not rendered', document.getElementById( 'no-disp' ).width );
}
img { width: 100px; }
#no-disp { display: none; }
<img id="disp" src="https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png">
<img id="no-disp" src="https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png">
document.getElementById( 'rendered' ).focus();
console.log( document.activeElement ); // <input id="rendered">
document.getElementById( 'rendered' ).blur();
document.getElementById( 'not-rendered' ).focus();
console.log( document.activeElement ); // <body>
#not-rendered {
display: none;
}
<input id="rendered">
<input id="not-rendered">
而唯一一种情况下,DOM树被修改的是关于内部文档的DOM树:当一个<object>或<embed>元素的样式设置为display:none
时,根据规范, 它的内部文档应该重新加载:
每当发生以下条件之一时
[...]
- 元素从渲染状态变为非渲染状态,或者反之
...用户代理必须在DOM操作任务源上为对象元素排队一个元素任务,以执行以下步骤来(重新)确定对象元素代表什么。
这意味着简单地切换这样一个<object>或<embed>元素的渲染状态就会完全重新加载其内部文档,也就是它的DOM树。
现在,只有Safari的行为是这样的,Firefox从未实现过这种行为,而Chrome最近更改了他们的以与FF的一致,违反规范。
对于Safari用户,这里有一个展示它的示例。