首页 文章

如何在JavaScript中动态创建CSS类并应用?

提问于
浏览
245

我需要在JavaScript中动态创建一个CSS样式表类,并将其分配给某些HTML元素,如div,table,span,tr等,以及某些控件,如asp:Textbox,Dropdownlist和datalist .

可能吗?

一个样本会很好 .

13 回答

  • 3

    虽然我不确定您为什么要使用JavaScript创建CSS类,但这里有一个选项:

    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = '.cssClass { color: #F00; }';
    document.getElementsByTagName('head')[0].appendChild(style);
    
    document.getElementById('someElementId').className = 'cssClass';
    
  • 5

    找到了更好的解决方案, works across all browsers.
    使用document.styleSheet添加或替换规则 . 接受的答案简短而方便,但这适用于IE8,也不太常见 .

    function createCSSSelector (selector, style) {
      if (!document.styleSheets) return;
      if (document.getElementsByTagName('head').length == 0) return;
    
      var styleSheet,mediaType;
    
      if (document.styleSheets.length > 0) {
        for (var i = 0, l = document.styleSheets.length; i < l; i++) {
          if (document.styleSheets[i].disabled) 
            continue;
          var media = document.styleSheets[i].media;
          mediaType = typeof media;
    
          if (mediaType === 'string') {
            if (media === '' || (media.indexOf('screen') !== -1)) {
              styleSheet = document.styleSheets[i];
            }
          }
          else if (mediaType=='object') {
            if (media.mediaText === '' || (media.mediaText.indexOf('screen') !== -1)) {
              styleSheet = document.styleSheets[i];
            }
          }
    
          if (typeof styleSheet !== 'undefined') 
            break;
        }
      }
    
      if (typeof styleSheet === 'undefined') {
        var styleSheetElement = document.createElement('style');
        styleSheetElement.type = 'text/css';
        document.getElementsByTagName('head')[0].appendChild(styleSheetElement);
    
        for (i = 0; i < document.styleSheets.length; i++) {
          if (document.styleSheets[i].disabled) {
            continue;
          }
          styleSheet = document.styleSheets[i];
        }
    
        mediaType = typeof styleSheet.media;
      }
    
      if (mediaType === 'string') {
        for (var i = 0, l = styleSheet.rules.length; i < l; i++) {
          if(styleSheet.rules[i].selectorText && styleSheet.rules[i].selectorText.toLowerCase()==selector.toLowerCase()) {
            styleSheet.rules[i].style.cssText = style;
            return;
          }
        }
        styleSheet.addRule(selector,style);
      }
      else if (mediaType === 'object') {
        var styleSheetLength = (styleSheet.cssRules) ? styleSheet.cssRules.length : 0;
        for (var i = 0; i < styleSheetLength; i++) {
          if (styleSheet.cssRules[i].selectorText && styleSheet.cssRules[i].selectorText.toLowerCase() == selector.toLowerCase()) {
            styleSheet.cssRules[i].style.cssText = style;
            return;
          }
        }
        styleSheet.insertRule(selector + '{' + style + '}', styleSheetLength);
      }
    }
    

    功能如下使用 .

    createCSSSelector('.mycssclass', 'display:none');
    

    请注意,即使函数名称是createClass,它实际上也会创建一个选择器 . 所以别忘了在你的 class 名字之前加上 . (句号) . 无需提及您也可以使用此功能创建其他选择器 .

  • 1

    简而言之,这是“兼容所有浏览器”(特别是IE8 / 7):

    function createClass(name,rules){
        var style = document.createElement('style');
        style.type = 'text/css';
        document.getElementsByTagName('head')[0].appendChild(style);
        if(!(style.sheet||{}).insertRule) 
            (style.styleSheet || style.sheet).addRule(name, rules);
        else
            style.sheet.insertRule(name+"{"+rules+"}",0);
    }
    createClass('.whatever',"background-color: green;");
    

    最后一位将类应用于元素:

    function applyClass(name,element,doRemove){
        if(typeof element.valueOf() == "string"){
            element = document.getElementById(element);
        }
        if(!element) return;
        if(doRemove){
            element.className = element.className.replace(new RegExp("\\b" + name + "\\b","g"));
        }else{      
            element.className = element.className + " " + name;
        }
    }
    

    这是一个小测试页面:https://gist.github.com/shadybones/9816763

    关键的一点是,样式元素具有“styleSheet”/“sheet”属性,您可以使用它来添加/删除规则 .

  • 24

    有一个轻量级jQuery插件,允许生成CSS声明:jQuery-injectCSS

    实际上,它使用JSS(JSON描述的CSS),但是为了生成动态css样式表,它很容易处理 .

    $.injectCSS({
        "#test": {
            height: 123
        }
    });
    
  • 7

    YUI到目前为止我已经看到了最好的stylesheet utility . 我鼓励你看一下,但这里有一个味道:

    // style element or locally sourced link element
    var sheet = YAHOO.util.StyleSheet(YAHOO.util.Selector.query('style',null,true));
    
    sheet = YAHOO.util.StyleSheet(YAHOO.util.Dom.get('local'));
    
    
    // OR the id of a style element or locally sourced link element
    sheet = YAHOO.util.StyleSheet('local');
    
    
    // OR string of css text
    var css = ".moduleX .alert { background: #fcc; font-weight: bold; } " +
              ".moduleX .warn  { background: #eec; } " +
              ".hide_messages .moduleX .alert, " +
              ".hide_messages .moduleX .warn { display: none; }";
    
    sheet = new YAHOO.util.StyleSheet(css);
    

    显然有其他更简单的方法可以动态改变样式,例如这里建议的那些 . 如果它们对你的问题有意义,那么它们可能是最好的,但肯定有理由为什么修改css是一个更好的解决方案 . 最明显的情况是需要修改大量元素 . 另一个主要案例是如果您需要更改样式以涉及级联 . 使用dom修改元素将始终具有更高的优先级 . 它是大锤的方法,相当于直接在html元素上使用style属性 . 这并不总是预期的效果 .

  • 104

    从IE 9开始 . 您现在可以加载文本文件并设置style.innerHTML属性 . 所以基本上你现在可以通过ajax加载一个css文件(并获得回调),然后只需在这样的样式标签内设置文本 .

    这适用于其他浏览器,不知道有多远 . 但只要你不需要支持IE8那么它就可以了 .

    // RESULT: doesn't work in IE8 and below. Works in IE9 and other browsers.
    $(document).ready(function() {
        // we want to load the css as a text file and append it with a style.
        $.ajax({
            url:'myCss.css',
            success: function(result) {
                var s = document.createElement('style');
                s.setAttribute('type', 'text/css');
                s.innerHTML = result;
                document.getElementsByTagName("head")[0].appendChild(s);
            },
            fail: function() {
                alert('fail');
            }
        })
    });
    

    然后你可以让它拉一个像myCss.css这样的外部文件

    .myClass { background:#F00; }
    
  • 3

    这是Vishwanath的解决方案略有改写评论:

    function setStyle(cssRules, aSelector, aStyle){
        for(var i = 0; i < cssRules.length; i++) {
            if(cssRules[i].selectorText && cssRules[i].selectorText.toLowerCase() == aSelector.toLowerCase()) {
                cssRules[i].style.cssText = aStyle;
                return true;
            }
        }
        return false;
    }
    
    function createCSSSelector(selector, style) {
        var doc = document;
        var allSS = doc.styleSheets;
        if(!allSS) return;
    
        var headElts = doc.getElementsByTagName("head");
        if(!headElts.length) return;
    
        var styleSheet, media, iSS = allSS.length; // scope is global in a function
        /* 1. search for media == "screen" */
        while(iSS){ --iSS;
            if(allSS[iSS].disabled) continue; /* dont take into account the disabled stylesheets */
            media = allSS[iSS].media;
            if(typeof media == "object")
                media = media.mediaText;
            if(media == "" || media=='all' || media.indexOf("screen") != -1){
                styleSheet = allSS[iSS];
                iSS = -1;   // indication that media=="screen" was found (if not, then iSS==0)
                break;
            }
        }
    
        /* 2. if not found, create one */
        if(iSS != -1) {
            var styleSheetElement = doc.createElement("style");
            styleSheetElement.type = "text/css";
            headElts[0].appendChild(styleSheetElement);
            styleSheet = doc.styleSheets[allSS.length]; /* take the new stylesheet to add the selector and the style */
        }
    
        /* 3. add the selector and style */
        switch (typeof styleSheet.media) {
        case "string":
            if(!setStyle(styleSheet.rules, selector, style));
                styleSheet.addRule(selector, style);
            break;
        case "object":
            if(!setStyle(styleSheet.cssRules, selector, style));
                styleSheet.insertRule(selector + "{" + style + "}", styleSheet.cssRules.length);
            break;
        }
    
  • 2

    https://jsfiddle.net/xk6Ut/256/

    在JavaScript中动态创建和更新CSS类的一个选项:

    • 使用样式元素创建CSS部分

    • 使用样式元素的ID,以便我们可以更新CSS

    .....

    function writeStyles(styleName, cssText) {
        var styleElement = document.getElementById(styleName);
        if (styleElement) 
                 document.getElementsByTagName('head')[0].removeChild(
            styleElement);
        styleElement = document.createElement('style');
        styleElement.type = 'text/css';
        styleElement.id = styleName;
        styleElement.innerHTML = cssText;
        document.getElementsByTagName('head')[0].appendChild(styleElement);
    }
    

    ...

    var cssText = '.testDIV{ height:' + height + 'px !important; }';
        writeStyles('styles_js', cssText)
    
  • 1

    一个可以帮助你完成任务的有趣项目是JSS .

    JSS是一种比CSS更好的抽象 . 它使用JavaScript作为一种语言,以声明和可维护的方式描述样式 . 它是一个高性能的JS到CSS编译器,它在运行时在浏览器和服务器端工作 .

    JSS库允许您使用 .attach() 函数注入DOM / head部分 .

    Repl online version进行评估 .

    进一步information on JSS .

    一个例子:

    // Use plugins.
    jss.use(camelCase())
    
    // Create your style.
    const style = {
      myButton: {
        color: 'green'
      }
    }
    
    // Compile styles, apply plugins.
    const sheet = jss.createStyleSheet(style)
    
    // If you want to render on the client, insert it into DOM.
    sheet.attach()
    
  • 333

    使用谷歌关闭:

    你可以使用ccsom模块:

    goog.require('goog.cssom');
    var css_node = goog.cssom.addCssText('.cssClass { color: #F00; }');
    

    将css节点放入文档头时,javascript代码尝试跨浏览器 .

  • 1

    看看答案,最明显和最直接的缺失:使用 document.write() 写出你需要的一大块CSS .

    这是一个例子(在codepen上查看:http://codepen.io/ssh33/pen/zGjWga):

    <style>
       @import url(http://fonts.googleapis.com/css?family=Open+Sans:800);
       .d, body{ font: 3vw 'Open Sans'; padding-top: 1em; }
       .d {
           text-align: center; background: #aaf;
           margin: auto; color: #fff; overflow: hidden; 
           width: 12em; height: 5em;
       }
    </style>
    
    <script>
       function w(s){document.write(s)}
       w("<style>.long-shadow { text-shadow: ");
       for(var i=0; i<449; i++) {
          if(i!= 0) w(","); w(i+"px "+i+"px #444");
       }
       w(";}</style>");
    </script> 
    
    <div class="d">
        <div class="long-shadow">Long Shadow<br> Short Code</div>
    </div>
    
  • 13
    function createCSSClass(selector, style, hoverstyle) 
    {
        if (!document.styleSheets) 
        {
            return;
        }
    
        if (document.getElementsByTagName("head").length == 0) 
        {
    
            return;
        }
        var stylesheet;
        var mediaType;
        if (document.styleSheets.length > 0) 
        {
            for (i = 0; i < document.styleSheets.length; i++) 
            {
                if (document.styleSheets[i].disabled) 
                {
                    continue;
                }
                var media = document.styleSheets[i].media;
                mediaType = typeof media;
    
                if (mediaType == "string") 
                {
                    if (media == "" || (media.indexOf("screen") != -1)) 
                    {
                        styleSheet = document.styleSheets[i];
                    }
                } 
                else if (mediaType == "object") 
                {
                    if (media.mediaText == "" || (media.mediaText.indexOf("screen") != -1)) 
                    {
                        styleSheet = document.styleSheets[i];
                    }
                }
    
                if (typeof styleSheet != "undefined") 
                {
                    break;
                }
            }
        }
    
        if (typeof styleSheet == "undefined") {
            var styleSheetElement = document.createElement("style");
            styleSheetElement.type = "text/css";
            document.getElementsByTagName("head")[0].appendChild(styleSheetElement);
            for (i = 0; i < document.styleSheets.length; i++) {
                if (document.styleSheets[i].disabled) {
                    continue;
                }
                styleSheet = document.styleSheets[i];
            }
    
            var media = styleSheet.media;
            mediaType = typeof media;
        }
    
        if (mediaType == "string") {
            for (i = 0; i < styleSheet.rules.length; i++) 
            {
                if (styleSheet.rules[i].selectorText.toLowerCase() == selector.toLowerCase()) 
                {
                    styleSheet.rules[i].style.cssText = style;
                    return;
                }
            }
    
            styleSheet.addRule(selector, style);
        }
        else if (mediaType == "object") 
        {
            for (i = 0; i < styleSheet.cssRules.length; i++) 
            {
                if (styleSheet.cssRules[i].selectorText.toLowerCase() == selector.toLowerCase()) 
                {
                    styleSheet.cssRules[i].style.cssText = style;
                    return;
                }
            }
    
            if (hoverstyle != null) 
            {
                styleSheet.insertRule(selector + "{" + style + "}", 0);
                styleSheet.insertRule(selector + ":hover{" + hoverstyle + "}", 1);
            }
            else 
            {
                styleSheet.insertRule(selector + "{" + style + "}", 0);
            }
        }
    }
    
    
    
    
    
    createCSSClass(".modalPopup  .header",
                                     " background-color: " + lightest + ";" +
                                      "height: 10%;" +
                                      "color: White;" +
                                      "line-height: 30px;" +
                                      "text-align: center;" +
                                      " width: 100%;" +
                                      "font-weight: bold; ", null);
    
  • 0

    为了搜索者的利益;如果您使用的是jQuery,则可以执行以下操作:

    var currentOverride = $('#customoverridestyles');
    
    if (currentOverride) {
     currentOverride.remove();
    }
    
    $('body').append("<style id=\"customoverridestyles\">body{background-color:pink;}</style>");
    

    显然你可以将内部css改为你想要的任何东西 .

    欣赏一些人更喜欢纯JavaScript,但它的工作原理非常强大,可以动态地编写/覆盖样式 .

相关问题