如何使用 Javascript 创建 <style> 标签?

IT技术 javascript html css
2021-01-31 07:12:11

我正在寻找一种<style>使用 JavaScript标签插入 HTML 页面的方法。

迄今为止我发现的最好方法:

var divNode = document.createElement("div");
divNode.innerHTML = "<br><style>h1 { background: red; }</style>";
document.body.appendChild(divNode);

这适用于 Firefox、Opera 和 Internet Explorer,但不适用于 Google Chrome。<br>对于 IE 来说,前面的内容也有点难看

有谁知道一种创建<style>标签的方法

  1. 更好

  2. 适用于 Chrome?

或者可能

  1. 这是我应该避免的非标准事情

  2. 三个可用的浏览器都很棒,但谁还在使用 Chrome?

6个回答

尝试将style元素添加head而不是body

这是在 IE (7-9)、Firefox、Opera 和 Chrome 中测试的:

var css = 'h1 { background: red; }',
    head = document.head || document.getElementsByTagName('head')[0],
    style = document.createElement('style');

head.appendChild(style);

style.type = 'text/css';
if (style.styleSheet){
  // This is required for IE8 and below.
  style.styleSheet.cssText = css;
} else {
  style.appendChild(document.createTextNode(css));
}
在访问style.styleSheet.cssText. 在它被附加之前style.styleSheet是空的。
2021-03-10 07:12:11
仅供参考,document.head所有主要浏览器都支持。
2021-03-12 07:12:11
为什么不直接使用document.querySelector("head")这是 IE8支持的事件
2021-03-17 07:12:11
@RobW - IE8 及以下不支持。现代浏览器支持它,但不是所有主要浏览器。
2021-03-23 07:12:11
@allenhwkim:答案早于querySelector(); 今天,我可能会选择document.head,自 IE9 起可用
2021-03-27 07:12:11

<style>标签应该放在<head>元素内,每个添加的标签都应该添加到<head>标签的底部

使用insertAdjacentHTML将样式标签注入文档head 标签

原生 DOM:

document.head.insertAdjacentHTML("beforeend", `<style>body{background:red}</style>`)


jQuery:

$('<style>').text("body{background:red}").appendTo(document.head)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

同意,这是最好且简单的,但如果您无法控制它,请注意严重注入的 css!
2021-03-14 07:12:11

这是一个脚本,它将 IE 样式createStyleSheet()addRule()方法添加到没有它们的浏览器中:

if(typeof document.createStyleSheet === 'undefined') {
    document.createStyleSheet = (function() {
        function createStyleSheet(href) {
            if(typeof href !== 'undefined') {
                var element = document.createElement('link');
                element.type = 'text/css';
                element.rel = 'stylesheet';
                element.href = href;
            }
            else {
                var element = document.createElement('style');
                element.type = 'text/css';
            }

            document.getElementsByTagName('head')[0].appendChild(element);
            var sheet = document.styleSheets[document.styleSheets.length - 1];

            if(typeof sheet.addRule === 'undefined')
                sheet.addRule = addRule;

            if(typeof sheet.removeRule === 'undefined')
                sheet.removeRule = sheet.deleteRule;

            return sheet;
        }

        function addRule(selectorText, cssText, index) {
            if(typeof index === 'undefined')
                index = this.cssRules.length;

            this.insertRule(selectorText + ' {' + cssText + '}', index);
        }

        return createStyleSheet;
    })();
}

您可以通过添加外部文件

document.createStyleSheet('foo.css');

并通过动态创建规则

var sheet = document.createStyleSheet();
sheet.addRule('h1', 'background: red;');
这对我尝试在奇怪的 CMS 上下文中加载外部 CSS 文件非常有帮助。我确实在 addRule / removeRule 部分遇到了一些麻烦,所以我只是消除了它们,一切正常。
2021-03-21 07:12:11

我假设您想要插入一个style标签而不是一个link标签(引用外部 CSS),所以这就是以下示例的作用:

<html>
 <head>
  <title>Example Page</title>
 </head>
 <body>
  <span>
   This is styled dynamically via JavaScript.
  </span>
 </body>
 <script type="text/javascript">
   var styleNode = document.createElement('style');
   styleNode.type = "text/css";
   // browser detection (based on prototype.js)
   if(!!(window.attachEvent && !window.opera)) {
        styleNode.styleSheet.cssText = 'span { color: rgb(255, 0, 0); }';
   } else {
        var styleText = document.createTextNode('span { color: rgb(255, 0, 0); } ');
        styleNode.appendChild(styleText);
   }
   document.getElementsByTagName('head')[0].appendChild(styleNode);
 </script>
</html>

另外,我在您的问题中注意到您正在使用innerHTML. 这实际上是一种将数据插入页面的非标准方式。最佳做法是创建一个文本节点并将其附加到另一个元素节点。

关于你的最后一个问题,你会听到一些人说你的工作应该在所有浏览器上工作。这一切都取决于你的观众。如果您的听众中没有人使用 Chrome,请不要担心;但是,如果您希望吸引尽可能多的受众,那么最好支持所有主要的 A 级浏览器

附加文本节点在 IE 中不起作用。但是将样式元素放在头部使我的解决方案在 Chrome 中起作用!:-)
2021-03-11 07:12:11
是的,你是对的,我也不一定提倡这样做(因此整体而言:“如果你想接触尽可能多的观众,那么最好支持所有主要的 A 级浏览器”)但知道您的平台的受众很重要。
2021-03-16 07:12:11
对于 IE,使用 styleNode.styleSheet.cssText = ...
2021-03-19 07:12:11
(很晚的评论)“这完全取决于您的受众。如果您的受众中没有人使用Chrome,那么不要担心”这种态度导致人们在IE7甚至IE8可用后多年被锁定在IE6中. “但我必须使用的 Web 应用程序只能在 IE6 中运行”
2021-03-27 07:12:11
这与我的解决方案基本相同;它们都不适用于 IE!
2021-04-04 07:12:11

一个适用于所有浏览器的示例:

var ss = document.createElement("link");
ss.type = "text/css";
ss.rel = "stylesheet";
ss.href = "style.css";
document.getElementsByTagName("head")[0].appendChild(ss);
哪些呢link元素有问题怎么办?OP要求style元素。这个答案与问题无关
2021-03-15 07:12:11
错误的元素:style没有relhref属性 - 你的意思是link
2021-03-24 07:12:11
@vsyncstyle用于添加内联样式,link适用于样式表源,这具有避免跨浏览器问题的优点。
2021-04-04 07:12:11