我想知道CSS是否会改变DOM.我问这个问题的原因是,每当我用CSS改变一个Element时,我在 "Element".style属性中没有看到它的值被改变。
不,CSS不会改变DOM。
不,CSS不会改变DOM。使用:after或:before注入的内容也不会改变DOM。
事实上......有一些情况下,CSS可以 更改DOM但这有点牵强,因为它不会改变DOM树的结构,除了在一个更牵强的情况下...。
有一个 成了 的定义,在某些情况下确实会影响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树被修改的一种情况,涉及到一个内部Document的DOM树。当一个<object>或一个<embed>元素的样式被设置为 display:none
, 按规格的情况下,应重新加载其内部文档。
当出现以下情况之一时
[...]
- 该元素从 成了 到不被呈现,反之亦然。
...用户代理必须在给定对象元素的DOM操作任务源上排队一个元素任务,以运行以下步骤来(重新)确定对象元素所代表的内容。
所以这意味着,简单地切换 成了 这样的<object>或<embed>元素的状态应该是完全重载其内部的Document,也就是其DOM树。
现在,只有Safari有这样的行为,Firefox从来没有实现这样的行为,而 Chrome浏览器最近确实改变了他们的 以配合FF的一个,对照规格。对于Safari用户。琴瑟和鸣 展示它。