使用 javascript 更改整个 CSS 类的样式

IT技术 javascript html css
2021-02-27 19:38:29

有没有办法使用 javascript 更改 CSS 类的属性?

<style type="text/css">
  .fool select {
    display: block;
  }
</style>

<p class="fool">
  <select id="a" onchange="changeCSS()"> ... </select>
  <select id="b" > ... </select>
  <select id="c" > ... </select>
</p>

我想<select>在用户调用函数 changeCSS() 后将所有元素的display:block 更改为 display:none

看起来很简单,但我找不到办法做到这一点......

6个回答

可以修改样式规则,但这通常不是最佳设计决策。

要访问由样式表定义的样式规则,您需要访问document.styleSheets集合。该集合中的每个条目都将有一个属性,要么被调用,cssRules要么rules取决于浏览器。每一个这些将是一个CSSRule实例。您可以通过更改其cssText属性来更改规则

但同样,这可能不是解决问题的最佳方法。但它是你问题的字面答案。

解决此问题的最佳方法可能是在样式表中添加另一个类来覆盖上一条规则的设置,然后将该类添加到select元素或元素的容器中。因此,例如,您可以制定规则:

.fool select {
    display: block;
}
.fool.bar select {
    display: none;
}

...当您想隐藏选择时,将该"bar"添加到具有该类的容器中"fool"

或者,将 CSS 样式信息直接应用于元素。

@peterh:是的,虽然我最后一次尝试这个(几周前,试图回答一个不同的问题),但似乎规则已经成为只读的。我从来没有时间跟进...
2021-05-06 19:38:29
完美的好答案 - 你解释说,这通常不是最好的决定,但与其试图出于哲学原因禁止某事,不如解释说,如果需要,如何做到这一点。一个例子,因为它可能很有用:你在 DOM 中有很多对象,修改类(并让硬计数工作到浏览器的 C++ 代码中)会产生更好的应用程序,因为通过类选择器循环元素(并从 JS 做艰苦的工作)。
2021-05-09 19:38:29
修改规则在有大量要更改的元素的类中有意义,它比一个一个更改元素要快得多(这是任何基于选择器的函数必须执行的操作)。将更改委托给父级也非常快。
2021-05-12 19:38:29

关键是为额外的类定义额外的规则并将这些类添加到元素中,而不是为给定的样式规则重写规则。

JS

function changeCSS() {
  var selects = document.getElementsByTagName("select");
  for(var i =0, il = selects.length;i<il;i++){
     selects[i].className += " hidden";
  }
}

CSS

.fool select.hidden, select.hidden {
   display: none;
}

或者对于一个真正有效的方法(但也可能需要一些更具体的样式规则)

JS

function changeCSS() {
  document.getElementsByTagName("body")[0].className += " hideAllSelects"
}

CSS

body.hideAllSelects select {
   display: none;
}
谢谢!这对我有用: var selects = document.getElementsByTagName("select"); for(var i =0, il = selects.length;i<il;i++){ selects[i].style.display="none"; }
2021-05-10 19:38:29
而不是 ie.className += " hidden"你可以使用.classList.Add("hidden"). 它具有更高的性能和更好的可维护性。
2021-05-12 19:38:29

我直接访问 CSS 类以同时调整一堆 div 的高度。这就是我的做法:

function cssrules() {
    var rules = {};
    for (var i=0; i<document.styleSheets.length; ++i) {
        var cssRules = document.styleSheets[i].cssRules;
        for (var j=0; j<cssRules.length; ++j)
            rules[cssRules[j].selectorText] = cssRules[j];
    }
    return rules;
}

function css_getclass(name) {
    var rules = cssrules();
    if (!rules.hasOwnProperty(name))
        throw 'TODO: deal_with_notfound_case';
    return rules[name];
}

然后你可以做类似的事情css_getclass('.classname').style.background="blue"我只在 chrome for windows 上试过这个,祝其他浏览器好运。

这在 Firefox 21、opera 12.12 和 ie 10 中运行良好。更详细的选择器规则也适用。 css_getclass('td:first-child a img').style.width=this.value+"em";
2021-04-22 19:38:29
此外,重要的是要注意,从 chrome 64 开始,这将不再在本地工作,但它似乎仍在 Edge 40 中工作
2021-04-24 19:38:29
说明兼容,你需要改变dsi=ds[i].cssRules,以dsi=ds[i].cssRules||ds[i].rules和注意,如果在先前存在的styleSheet相同selectorText的funcion将overwritte规则。
2021-04-28 19:38:29
我不确定这是否是原因,但在我看来,这仅在该类存在于单独的样式表文件(而不是 html 标记中)中时才有效,并且它似乎不适用于kbd.myclass.
2021-05-05 19:38:29

这是我的做法:

//Broken up into multiple lines for your convenience
setTimeout
(
  function()
  {
    document.getElementById('style').innerHTML = 'p.myclass{display: none}';
  }, 5000
);
<!--Should this be separated into "<head>"?-->
<style id="style"></style>

<p>After 5 seconds:</p>
<p>This text won't be hidden,</p>
<p class="myclass">But this will,</p>
<p class="myclass">And so will this.</p>

<script>
	style = document.getElementById('style');
	setTimeout(function(){style.innerHTML = 'p.myclass{display: none}'}, 5000);
</script>

聪明而简单。此外,它适用于 ios 12、iPhone (WKWebView)。+1
2021-04-19 19:38:29

您可以编辑样式表,但我认为您只需创建一个新类即可。如果你真的需要这样做,试试这个。

    ss=document.styleSheets[0]

cssRules 是样式表规则

    ss.cssRules
    ss.cssRules[0]

第一条规则的选择器

    ss.cssRules[0].selectorText

    ".channel > li"

阅读第一条规则的样式

    ss.cssRules[0].style

    CSS2Properties { "margin-left" → "0px"}

改变风格

    ss.cssRules[0].style.marginLeft="15px"

    ss.cssRules[0].style

CSS2Properties { "margin-left" → "15px" }