【问题标题】:How do you add CSS with Javascript?如何使用 Javascript 添加 CSS?
【发布时间】:2010-10-16 23:49:49
【问题描述】:

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

【问题讨论】:

  • 同样的问题(答案是跨浏览器 jQuery)stackoverflow.com/a/266110/341744
  • @monkey :这是一个非常糟糕的解决方案,实际上并没有按照这里的要求做。例如:如果将新的<strong> 元素添加到文档中会发生什么。

标签: javascript css


【解决方案1】:

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

【讨论】:

  • 不应该附加到文档的头部而不是正文吗?
  • @bobince — 绝对符合 HTML 规范,但所有浏览器都能在任何地方识别它们。 document.body 也比 document.getElementsByTagName("head")[0] 键入更短,执行速度更快,并且避免了 insertRule/addRule 的跨浏览器问题。
  • 解决方案后面应该有一个很长的“duhhhh”。不敢相信我没想到。
  • 在所有最近的浏览器中,您可以只使用document.head.appendChild
  • 这个解决方案要好得多!假设您有多个样式表:使用@bobince 解决方案,您新添加的 CSS 可能会被第二个/第三个/等覆盖。页面上的样式表。使用 document.body.appendChild(css); 可以确保新的 CSS 始终是最后一条规则。
【解决方案2】:

您也可以使用 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。

【讨论】:

  • "color" .. 哦,是的,哎呀!谢天谢地,这只是一个例子。我怀疑可能有一个 DOM 方法,谢谢! +1
  • sheet 来自sheet = window.document.styleSheets[0](你必须至少有一个 在那里)。
  • 谢谢,Google 首先展示的所有示例都非常巨大,而我只需要刷新这两行的记忆。
  • 我知道已经有一段时间了,但是当我测试第一个时,我得到了SecurityError: The operation is insecure.
  • @user10089632 您正在访问的样式表需要从与父文档相同的主机上提供,才能正常工作。
【解决方案3】:

YUI 最近added a utility 专门为此而生。请在此处查看stylesheet.js

【讨论】:

  • 我目前正在使用 YUI 进行工作,并试图弄清楚如何编辑现有 css 规则的外部样式表。不知道这个实用程序,它似乎很完美!谢谢拉塞尔。
【解决方案4】:

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

例如:

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

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

this.className='classname';

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

【讨论】:

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

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

【讨论】:

【解决方案6】:

这是Chris Herring's solution 的略微更新版本,考虑到您也可以使用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 );
}

【讨论】:

【解决方案7】:

这是我的通用函数,它对 CSS 选择器和规则进行参数化,如果您希望添加到特定工作表(否则,如果您不提供 CSS),可以选择接收 css 文件名(区分大小写)文件名,它将创建一个新的样式元素并将其附加到现有的头部。它最多会创建一个新的样式元素并在以后的函数调用中重新使用它)。适用于 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);
    }
}

【讨论】:

    【解决方案8】:

    另一种选择是使用 JQuery 来存储元素的内联样式属性,附加到它,然后用新值更新元素的样式属性。如下:

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

    这可能不一定是最有效的方法(我对如何改进这一点持开放态度。:)),但它绝对有效。

    【讨论】:

      【解决方案9】:

      在 html 头部添加 &lt;style&gt; 的简单示例

      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
      

      来源Dynamic style - manipulating CSS with JavaScript

      【讨论】:

        【解决方案10】:

        这是我在最后一个样式表列表末尾添加 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 }");
        

        【讨论】:

          【解决方案11】:

          在 Jquery 中使用 .css,例如 $('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> 

          【讨论】:

          • javascript,OP 对 jQuery 只字未提
          【解决方案12】:

          这里有一个示例模板可帮助您入门

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

          函数是从上面的@Husky用户那里借来的

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

          // INJECTING THE HTML
          document.querySelector('body').innerHTML += '<div id="injection">Hello World</div>';
          
          // CSS INJECTION FUNCTION
          //https://stackoverflow.com/questions/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;}"
          )

          【讨论】:

            【解决方案13】:

            如果您知道页面中至少存在一个&lt;style&gt; 标签,请使用此功能:

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

            用法:

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

            【讨论】:

              【解决方案14】:

              最短的一条线

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-11
                • 1970-01-01
                相关资源
                最近更新 更多