javascript - 为什么使用CSSOM的insertRule后样式不可见,样式标签不能重新追加

标签 javascript html css cssom

如果我使用 insertRule 通过 CSSOM 添加样式我注意到两件事。

在 Firebug 中查看时,添加的样式不会出现在 html 中。

如果样式标签被附加(例如:从头部移动到 body )到另一个元素(发生在 Firefox 和 Chrome 中),则添加的样式不起作用。

如果样式是在附加标签之后添加的,那么它们就可以工作。它们仍然没有显示在 Firebug 中。附加工作表时必须重新分配(重新获取?)这使得它看起来更奇怪。

对于在 Firebug 中不显示这可能是 Firebug 的一个怪癖,但未动态添加的常规样式会显示。

对于在附加后不起作用的样式,我想知道这是否是标准,因为这发生在 Firefox 和 Chrome 中。查看标准,我没有看到任何关于此的内容。除非我不理解它们。

var style = document.createElement('style'),
    sheet = style.sheet;
document.head.appendChild(style);
//When line 6 is un-commented the styles work
//if line 8 is also commented out.
//document.querySelector('.container').appendChild(style);
//Get the sheet when line 6 is un-commented
sheet = style.sheet
sheet.insertRule('.test{color: red}');
document.querySelector('.container').appendChild(style);
//styles don't apply after the previous line

为清楚起见编辑:

如果您附加 <style></style>标记到 <head></head>您可以使用 style.sheet.insertRule(styleString) 应用样式的 html , 添加的样式将应用于文档。

如果您已经附加了 <style></style><head></head>喜欢<head><style></style></head> , 并尝试附加 <style></style>其他地方,比如 <div><style></style></div>样式全部丢失,请勿再次应用。

这正常吗?

代码流程:

作品:

  1. 追加<style>任何地方
  2. 使用 style.sheet.insertRule(styleString) 添加样式

不起作用:

  1. 追加<style>任何地方
  2. 使用 style.sheet.insertRule(styleString) 添加样式至 <style>
  3. 附加相同的<style>别处

我的另一个问题是添加到 <style></style> 的样式不要出现在 Firebug 中即使他们已经申请了文件。

编辑更清晰:

如果我重新附加 style元素没有修改样式表,样式保持不变:

var style = document.querySelector('style');
document.head.appendChild(style);
* {color: red}
<p>Hello world</p>

但是如果我用 JS 更改了样式表,更改将被撤消:

var style = document.querySelector('style'),
    sheet = style.sheet;
sheet.insertRule('* {color: red}', 0);
document.head.appendChild(style); //Comment this line out, and this works.
/* CSS rules will be inserted with JS */
<p>Hello world</p>

最佳答案

这是因为<style>元素只有一个 sheet附加到文档时的属性。
因此,当您移动它或将其从文档中删除时,它们的 sheet属性设置回 null .您使用 insertRule 应用于它的每条规则方法将消失,因为它们不在 <style> 中的 innerHTML .


the specs的相关部分:

The update a style block algorithm for CSS (text/css) is as follows:

  1. Let element be the style element.

  2. If element has an associated CSS style sheet, remove the CSS style sheet in question.

  3. If element is not in a Document, then abort these steps.

  4. If the Should element's inline behavior be blocked by Content Security Policy [...] then abort these steps. [CSP]

  5. Create a CSS style sheet with the following properties: ...

如您所见,每次 <style>元素更新后,将创建一个新的 CSS 样式表(仅当 .3.4 未阻止该过程时)。


小演示:

var style = document.createElement('style');
console.log('before being appended : '+ style.sheet)
document.body.appendChild(style); 
console.log('after being appended : '+ style.sheet)
document.body.removeChild(style);
console.log('after being removed : '+ style.sheet)

关于javascript - 为什么使用CSSOM的insertRule后样式不可见,样式标签不能重新追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638076/

相关文章:

javascript - 用于重新加载包含 php 的 div 内容的按钮

javascript - 无法将 animate() 放入脚本中

javascript - 如何获取分配给 html 表格的 CSS 属性?

css - 字体(Wisdom Script)渲染问题

css - 引导日期选择器上的粘性问题

html - 将代码块对齐到给定区域的中心

JavaScript 硬刷新当前页面

javascript - 如何用div缩放div的内容?

javascript - jquery 在选项更改时循环选择标签

javascript - 如何阻止 Bootstrap div/thumbnail 根据屏幕进行调整