【问题标题】:Dynamically change CSS rules in JavaScript or jQuery在 JavaScript 或 jQuery 中动态更改 CSS 规则
【发布时间】:2012-08-12 23:24:22
【问题描述】:

我正在寻找一种方法来更改文档中导入的样式表的 CSS 规则。所以我有一个外部样式表和一些classdiv 里面的属性。我想用 JavaScript 或 jQuery 更改规则之一。

这是一个例子:

.red{
    color:red;
}

所以想法是在 JavaScript 中做一些事情,HTML 知道现在 color 是另一种颜色,如下所示:

.red{
    color:purple;
}

但是我希望将来通过附加的方式添加的每个元素都有这个规则。因此,如果我在 CSS 类 .red 中添加 span,则文本必须是紫色而不是红色。

我希望我说清楚了。

【问题讨论】:

    标签: javascript jquery css dynamic stylesheet


    【解决方案1】:

    如果要添加规则,可以使用CSSStyleSheet.insertRule(),而不是直接编辑每个元素的样式。它有两个参数:作为字符串的规则,以及插入规则的位置。

    来自上述链接的示例:

    // push a new rule onto the top of my stylesheet
    myStyle.insertRule("#blanc { color: white }", 0);
    

    在这种情况下,myStylestyle 元素的.sheet 成员。

    据我所知,style 元素必须先插入到文档中,然后才能抓取它的工作表,并且它不能是外部工作表。您也可以从document.styleSheets 获取一张工作表,例如

    var myStyle = document.styleSheets[1]; // Must not be a linked sheet.
    myStyle.insertRule("#blanc { color: white }", 0);
    

    注意:页面建议通过更改其类来修改元素,而不是修改规则。

    【讨论】:

      【解决方案2】:

      你用 jQuery .css() 方法来做到这一点。

      $('.red').css('color', 'purple');
      

      对于多个规则:

      $('.red').css({
          'color': 'purple',
          'font-size': '20px'
      });
      

      当你以后通过追加的方式将动态元素添加到DOM时,只需给这些元素一些classid并在追加它们后编写CSS规则,它们将应用于所有动态创建的元素.

      Working sample

      注意

      在我看来,添加动态规则并不是一个好的解决方案。而不是你可以加载一些外部CSS 文件。

      但如果你需要动态规则添加方法,那么:

      $('head').append(
        $('<style/>', {
          id: 'mystyle',
          html: '.red {color: purple }'
        })
      );
      

      并供将来使用:

      $('#mystyle').append(' .someother { color: green; font-size: 13px } ');
      

      Working sample

      【讨论】:

      • 这会满足“但是我希望对每个元素都有这个规则,而不是通过追加的方式在未来添加”?
      • 你需要在 'myrule' 后面加一个逗号,我想。最后一部分肯定会使 .css() 的东西变得多余吗?
      • 嗯,这不起作用(至少在 Chrome 中)。您需要在样式标签中添加.red { color: purple; },而不仅仅是color: purple;。这样做也会使append() 停止工作(除非你附加了第二个 .red 声明,我猜)。
      • 完美运行!!再次感谢 !!这正是我需要的,再次感谢您!抱歉这么晚回复,但我不在电脑前!再次感谢您!
      • 顺便说一句,我在发布问题之前尝试使用 .css 但它不起作用,所以我想覆盖我的 css 看看它是否可以工作! :) 再次感谢@thecodeparadox !!
      【解决方案3】:

      您可以将样式声明注入 DOM。

      $("head").append('<style>.red { color: purple }</style>');
      

      【讨论】:

      • IMO 这样做通常是一个坏主意,但我会赞成,因为它完全符合 OP 的要求,为所有元素添加样式,包括以后添加到 DOM 中的元素。
      • 有趣 - 为什么你认为这是一个坏主意 - 因为它很难逆转?
      • @Grim... 它也可能很难追踪:根据 JS 的复杂性,很难调试为什么某些东西没有按照您期望的方式出现。不过在某些情况下这很有用——我提出这个问题是因为我需要知道如何为 Greasemonkey 脚本执行此操作...
      猜你喜欢
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      相关资源
      最近更新 更多