你如何用Javascript添加CSS?

nic*_*ckf 144 javascript css

如何strong { color: red }使用Javascript 添加CSS规则(例如)?

Ben*_*ank 196

简单直接的方法是创建并向style文档添加新节点.

// Your CSS as text
var styles = `
    .qwebirc-qui .ircwindow div { 
        font-family: Georgia,Cambria,"Times New Roman",Times,serif;
        margin: 26px auto 0 auto;
        max-width: 650px;
    }
    .qwebirc-qui .lines {
        font-size: 18px;
        line-height: 1.58;
        letter-spacing: -.004em;
    }

    .qwebirc-qui .nicklist a {
        margin: 6px;
    }
`

var styleSheet = document.createElement("style")
styleSheet.type = "text/css"
styleSheet.innerText = styles
document.head.appendChild(styleSheet)
Run Code Online (Sandbox Code Playgroud)

  • 它不应该附加到文件的头部而不是身体吗? (12认同)
  • 在所有最近的浏览器中,您只需使用`document.head.appendChild`即可. (8认同)
  • @bobince - 完全根据HTML规范,但所有浏览器都能在任何地方识别它们.`document.body`的输入时间也比`document.getElementsByTagName("head")[0]`更短,并且避免了insertRule/addRule的跨浏览器问题. (3认同)
  • 解决方案之后应该是一个长"duhhhh".简直不敢相信我没想到. (3认同)
  • 这在每个换行符之后的样式标记中给出了“<br>”元素,并且规则不起作用。 (3认同)
  • 这个解决方案要好得多!想象一下,你有多个样式表:使用@bobince解决方案,新添加的CSS可能会被第二个/第三个/等覆盖.页面上的样式表.使用`document.body.appendChild(css);`确保新CSS始终是最后一条规则. (2认同)

bob*_*nce 101

您也可以使用DOM Level 2 CSS接口(MDN)执行此操作:

var sheet = window.document.styleSheets[0];
sheet.insertRule('strong { color: red; }', sheet.cssRules.length);
Run Code Online (Sandbox Code Playgroud)

...除了(自然)IE之外的所有IE,它使用自己的略微不同的措辞:

sheet.addRule('strong', 'color: red;', -1);
Run Code Online (Sandbox Code Playgroud)

与createElement-set-innerHTML方法相比,这有一个理论上的优势,因为你不必担心在innerHTML中放入特殊的HTML字符,但在实践中,样式元素是遗留HTML中的CDATA,而'<'而且'''很少用在样式表中.

您需要一个样式表,然后才能开始像这样添加样式表.这可以是任何现有的活动样式表:外部,嵌入或空,无关紧要.如果没有,那么目前创建它的唯一标准方法是使用createElement.

  • sheet来自`sheet = window.document.styleSheets [0]`(你必须至少有一个<style type ="text/css"> </ style>). (13认同)
  • 谢谢,谷歌首先显示的所有示例都非常“巨大”,而我所需要的只是刷新我对这两行的记忆。 (2认同)
  • @ user10089632您要访问的样式表需要与父文档位于同一主机上才能工作。 (2认同)

Chr*_*ing 26

Ben Blank的解决方案对我来说不适用于IE8.

但是这在IE8中确实有效

function addCss(cssCode) {
var styleElement = document.createElement("style");
  styleElement.type = "text/css";
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = cssCode;
  } else {
    styleElement.appendChild(document.createTextNode(cssCode));
  }
  document.getElementsByTagName("head")[0].appendChild(styleElement);
}
Run Code Online (Sandbox Code Playgroud)

  • 好老IE总能让生活更轻松 (9认同)
  • 如果`cssCode`包含@ -directive,如`@ import`或`@ font-face`,你应该将元素追加到`head` _before_ setting` .cssText`,否则IE6-8会崩溃**,请参阅更新到http://www.phpied.com/dynamic-script-and-style-elements-in-ie/和http://stackoverflow.com/a/7952904 (2认同)

Hus*_*sky 24

这是Chris Herring解决方案的略微更新版本,考虑到您也可以使用innerHTML而不是创建新的文本节点:

function insertCss( code ) {
    var style = document.createElement('style');
    style.type = 'text/css';

    if (style.styleSheet) {
        // IE
        style.styleSheet.cssText = code;
    } else {
        // Other browsers
        style.innerHTML = code;
    }

    document.getElementsByTagName("head")[0].appendChild( style );
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该将元素附加到`head` _before_ setting` .cssText`,否则IE6-8将**崩溃**如果`code`包含@ -directive,如`@ import`或`@ font-face` ,请参阅更新到http://www.phpied.com/dynamic-script-and-style-elements-in-ie/和http://stackoverflow.com/a/7952904 (3认同)

chi*_*ens 16

最短的一个班轮

// One liner function:
const addCSS = s => document.head.appendChild(document.createElement("style")).innerHTML=s;

// Usage: 
addCSS("body{ background:red; }")
Run Code Online (Sandbox Code Playgroud)


a c*_*cat 7

在现代浏览器(caniuse)中,您可以使用document.adoptedStyleSheets添加CSS。

const sheet = new CSSStyleSheet();
sheet.replaceSync("strong { color: red; }");
document.adoptedStyleSheets.push(sheet);
Run Code Online (Sandbox Code Playgroud)

这种方法的一个优点是您不必等待<head>元素变得可用,这可能是很早运行的浏览器扩展代码中的一个问题。


小智 5

您可以逐个元素地添加类或样式属性。

例如:

<a name="myelement" onclick="this.style.color='#FF0';">text</a>
Run Code Online (Sandbox Code Playgroud)

你可以在哪里做 this.style.background、this.style.font-size 等。你也可以使用同样的方法来应用样式 ala

this.className='classname';
Run Code Online (Sandbox Code Playgroud)

如果您想在 javascript 函数中执行此操作,您可以使用 getElementByID 而不是 'this'。

  • 使用事件处理程序的内联 JavaScript 是一个非常糟糕的主意。您应该将您的内容与 JavaScript 中的功能和绑定事件处理程序分开 - 最好在外部文件中。 (5认同)