如何使用JavaScript添加CSS?


154

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


同样的问题(答案是跨浏览器的jQuery)stackoverflow.com/a/266110/341744
ninMonkey 2012年

18
@monkey:这是一个很差的解决方案,实际上并没有执行此处要求的操作。例如:如果将新<strong>元素添加到文档中会发生什么。
尼克

Answers:


115

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

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

...(除了(自然)IE8和更早版本以外的所有版本),它使用自己的略有不同的措辞:

sheet.addRule('strong', 'color: red;', -1);

与createElement-set-innerHTML方法相比,此方法具有理论上的优势,因为您不必担心在innerHTML中放置特殊的HTML字符,但实际上样式元素是旧HTML中的CDATA,而'<'无论如何,“&”和“&”很少在样式表中使用。

在开始像这样添加到样式表之前,确实需要有一个样式表。可以是任何现有的活动样式表:外部,嵌入式或空,都没关系。如果没有,则目前唯一的标准创建方法是使用createElement。


“颜色” ..哦,是的,哎呀!幸运的是,这只是一个例子。我怀疑可能为此使用了DOM方法,谢谢!+1
nickf

14
工作表来自sheet = window.document.styleSheets[0] (您必须至少有一个<style type =“ text / css”> </ style>)。
AJP 2013年

1
谢谢,当我需要在这两行刷新内存时,Google首先显示的所有示例都非常庞大
ElDoRado1239

1
我知道已经有一段时间了,但是当我测试第一个时,我得到了SecurityError: The operation is insecure.
user10089632

3
@ user10089632您正在访问的样式表需要与父文档位于同一主机上才能工作。
bobince

225

简单直接的方法是创建一个新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)

12
是否应该将其附加到文档的头部而不是正文?
bobince

3
@bobince —绝对根据HTML规范,但是所有浏览器都可以在任何地方识别它们。与避免和出现insertRule / addRule的跨浏览器问题document.body相比document.getElementsByTagName("head")[0],它的类型更短,执行速度更快。
本·布兰克

4
解决方案后应加长的“ duhhhh”。不敢相信我没想到。
乔治·莫尔

8
在所有最新的浏览器中,您都可以使用document.head.appendChild
朱斯

2
这个解决方案好多了!假设您有多个样式表:使用@bobince解决方案,您新添加的CSS可能会被第二/第三/等覆盖。页面上的样式表。使用document.body.appendChild(css);新的CSS确保始终是最后一条规则。
AvL

27

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);
}

12
好的旧IE总是会让生活更轻松
Alex W

2
您应该将元素添加到head before设置之前.cssText,否则如果IE6-8 包含@ 指令(如或),则IE6-8将崩溃,请参阅phpied.com/dynamic-script-and-style-elements-in-iestackoverflow中的更新.com / a / 7952904cssCode@import@font-face
韩汉城,

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 );
}

3
您应该将元素添加到head before设置之前.cssText,否则如果IE6-8 包含@ 指令(如或),则IE6-8将崩溃,请参阅phpied.com/dynamic-script-and-style-elements-in-iestackoverflow中的更新.com / a / 7952904code@import@font-face
韩汉城,

5

最短一线

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

// Usage: 
addCSS("body{ background:red; }")


3

您可以在逐个元素的基础上添加类或样式属性。

例如:

<a name="myelement" onclick="this.style.color='#FF0';">text</a>

您可以在其中执行this.style.background,this.style.font-size等的位置。也可以使用相同的方法来应用样式ala

this.className='classname';

如果要在javascript函数中执行此操作,则可以使用getElementByID而不是“ this”。


5
使用事件处理程序的内联JavaScript是一个非常糟糕的主意。您应该将内容与功能分离,并在JavaScript中(最好是在外部文件中)绑定事件处理程序。
庞斯上校12年

3

这个简单的例子,添加<style>在html头中

var sheet = document.createElement('style');
sheet.innerHTML = "table th{padding-bottom: 0 !important;padding-top: 0 !important;}\n"
+ "table ul {    margin-top: 0 !important;    margin-bottom: 0 !important;}\n"
+ "table td{padding-bottom: 0 !important;padding-top: 0 !important;}\n"
+ ".messages.error{display:none !important;}\n"
+ ".messages.status{display:none !important;} ";

document.body.appendChild(sheet); // append in body
document.head.appendChild(sheet); // append in head

动态样式-使用JavaScript处理CSS



2

这是我在最后一个样式表列表的末尾添加css规则的解决方案:

var css = new function()
{
    function addStyleSheet()
    {
        let head = document.head;
        let style = document.createElement("style");

        head.appendChild(style);
    }

    this.insert = function(rule)
    {
        if(document.styleSheets.length == 0) { addStyleSheet(); }

        let sheet = document.styleSheets[document.styleSheets.length - 1];
        let rules = sheet.rules;

        sheet.insertRule(rule, rules.length);
    }
}

css.insert("body { background-color: red }");

1

另一种选择是使用JQuery存储元素的内联样式属性,将其追加到该属性之后,然后使用新值更新元素的style属性。如下:

function appendCSSToElement(element, CssProperties)
        {
            var existingCSS = $(element).attr("style");

             if(existingCSS == undefined) existingCSS = "";

            $.each(CssProperties, function(key,value)
            {
                existingCSS += " " + key + ": " + value + ";";
            });

            $(element).attr("style", existingCSS);

            return $(element);
        }

然后使用新的CSS属性作为对象执行它。

appendCSSToElement("#ElementID", { "color": "white", "background-color": "green", "font-weight": "bold" });

这可能不一定是最有效的方法(我愿意就如何改进此方法提出建议。:)),但绝对可以。


1

这是一个示例模板,可帮助您入门

需要0个库,并且仅使用javascript注入HTML和CSS。

该功能是从上述用户@Husky借用的

如果您想运行篡改脚本并想在网站上添加切换覆盖(例如,例如笔记应用),则很有用

// INJECTING THE HTML
document.querySelector('body').innerHTML += '<div id="injection">Hello World</div>';

// CSS INJECTION FUNCTION
///programming/707565/how-do-you-add-css-with-javascript
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 );
}

// INJECT THE CSS INTO FUNCTION
// Write the css as you normally would... but treat it as strings and concatenate for multilines
insertCss(
  "#injection {color :red; font-size: 30px;}" +
  "body {background-color: lightblue;}"
)


1

如果您知道页面中至少<style>存在一个标签,请使用以下功能:

CSS=function(i){document.getElementsByTagName('style')[0].innerHTML+=i};

用法:

CSS("div{background:#00F}");

0

这是我的通用函数,它对CSS选择器和规则进行参数化,并且如果您希望添加到特定工作表中,则可以选择使用CSS文件名(区分大小写)(否则,如果您不提供CSS文件名,它将将创建一个新的样式元素并将其附加到现有的head上。最多将创建一个新的样式元素并在以后的函数调用中重新使用它)。适用于FF,Chrome和IE9 +(可能也更早,未经测试)。

function addCssRules(selector, rules, /*Optional*/ sheetName) {
    // We want the last sheet so that rules are not overridden.
    var styleSheet = document.styleSheets[document.styleSheets.length - 1];
    if (sheetName) {
        for (var i in document.styleSheets) {
            if (document.styleSheets[i].href && document.styleSheets[i].href.indexOf(sheetName) > -1) {
                styleSheet = document.styleSheets[i];
                break;
            }
        }
    }
    if (typeof styleSheet === 'undefined' || styleSheet === null) {
        var styleElement = document.createElement("style");
        styleElement.type = "text/css";
        document.head.appendChild(styleElement);
        styleSheet = styleElement.sheet;
    }

    if (styleSheet) {
        if (styleSheet.insertRule)
            styleSheet.insertRule(selector + ' {' + rules + '}', styleSheet.cssRules.length);
        else if (styleSheet.addRule)
            styleSheet.addRule(selector, rules);
    }
}

-1

.css在jQuery中使用像$('strong').css('background','red');

$('strong').css('background','red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<strong> Example
</strong> 


1
JavaScript,OP对jQuery没说什么
agapitocandemor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.