从 Javascript 更改 CSS 规则集

IT技术 javascript css
2021-01-10 19:51:38

是否可以动态更改 CSS 规则集(即某些 JS 会在用户单击小部件时更改 CSS 规则集)

这个特殊的 CSS 规则集应用于页面上的许多元素(通过类选择器),我想在用户单击小部件时修改它,以便所有具有的元素都发生变化。

6个回答

可以,但是比较麻烦。关于如何做到这一点的最佳参考是以下文章:Totally Pwn CSS with Javascript网络存档链接)。

我设法让它与 Firefox 和 IE 一起使用 - 我不能在 Chrome 中,虽然它似乎支持 DOM 方法。ricosrealm报告说它也适用于 Chrome。

2021-03-17 19:51:38
这个答案已经过时了。在此处查看现代解决方案
2021-03-23 19:51:38
那个指南太棒了!!!我已经在最新的 Firefox 和 Chrome 上对其进行了测试,它的效果非常棒!!!
2021-03-24 19:51:38
在 Chrome 11 中测试。效果很好。
2021-04-05 19:51:38
链接已断开(数据库关闭),但看起来有人将其变成了 library
2021-04-08 19:51:38

这是一个基于 Totally Pwn CSS 和 Javascript 的现代版本。这是 ES6 我希望不要介意。

function getCSSRule(ruleName) {
    ruleName = ruleName.toLowerCase();
    var result = null;
    var find = Array.prototype.find;

    find.call(document.styleSheets, styleSheet => {
        result = find.call(styleSheet.cssRules, cssRule => {
            return cssRule instanceof CSSStyleRule 
                && cssRule.selectorText.toLowerCase() == ruleName;
        });
        return result != null;
    });
    return result;
}

此函数返回一个 CSSStyleRule,您可以像这样使用它:

var header = getCSSRule('#header');
header.style.backgroundColor = 'red';

还有document.styleSheets列出 CSSStylesSheets 对象的引用。访问页面中特定 sytleSheet 的其他方法是为 html 代码中样式链接元素分配一个id,并使用document.getElementById('my-style').sheet在 javascript 中获取它这是一些有用的方法:

主要浏览器和 IE9+: insertRule()、deleteRule()、removeProperty()。

主要浏览器,Firefox?和 IE9+: setProperty()。

<stye id="my-style" ...
....
var myStyle = document.getElementById('my-style').sheet
myStyle.insertRule('#header { background: red; }', 0);

也可以动态创建一个新的样式元素来存储动态创建的样式,我认为应该是避免冲突的方法。

这很好用!我只是styleSheet.cssRules在调用 find 之前添加检查是否存在
2021-03-29 19:51:38

您可以按如下方式在文档样式表中编辑 CLASS

[...document.styleSheets[0].cssRules].find(x=> x.selectorText=='.box')
     .style.background= 'red';

我通过@alex-gyoshev 评论中的链接尝试了代码,但它不起作用

  1. 它在 Chrome 中使用 Google 字体的 CSS 规则失败
  2. 它在 FireFox 安全检查中失败

所以我稍微改变了它,但删除了delete功能,因为我不需要它。在 IE 11、FireFox 32、Chrome 37 和 Opera 26 中检查。

function getCSSRule(ruleName) { // Return requested style object
  ruleName = ruleName.toLowerCase(); // Convert test string to lower case.
  var styleSheet;
  var i, ii;
  var cssRule = false; // Initialize cssRule. 
  var cssRules;
  if (document.styleSheets) { // If browser can play with stylesheets
    for (i = 0; i < document.styleSheets.length; i++) { // For each stylesheet
      styleSheet = document.styleSheets[i];
      if (!styleSheet.href) {
        if (styleSheet.cssRules) { // Browser uses cssRules?
          cssRules = styleSheet.cssRules; // Yes --Mozilla Style
        } else { // Browser usses rules?
          cssRules = styleSheet.rules; // Yes IE style. 
        } // End IE check.
        if (cssRules) {
          for (ii = 0; ii < cssRules.length; ii++) {
            cssRule = cssRules[ii];
            if (cssRule) { // If we found a rule...
              // console.log(cssRule);
              if (cssRule.selectorText) {
                console.log(cssRule.selectorText);
                if (cssRule.selectorText.toLowerCase() == ruleName) { //  match ruleName?
                  return cssRule; // return the style object.
                }
              }
            }
          }
        }
      }
    }
  }
  return false; // we found NOTHING!
}
css 规则不区分大小写?
2021-04-03 19:51:38
google.ru/search?q=CSS+case+sensitive -> w3.org/TR/CSS2/syndata.html#characters “所有 CSS 语法在 ASCII 范围内(即 [az] 和 [AZ]是等效的),但不受 CSS 控制的部分除外。”
2021-04-07 19:51:38

遗憾的是,用于使用 JS 编辑样式表的 API 在浏览器之间并不一致。YUI样式工具试图抚平这些差异,所以你可以只使用它。如果您不想使用 YUI 本身,您还可以查看源代码以了解它是如何工作的。

它在网站上说“已弃用”和“不要将其用于新项目”,所以我最好的猜测是否定的。
2021-03-14 19:51:38
这仍然有效吗?
2021-03-24 19:51:38