Изменение стиля всего класса CSS с помощью javascript

Есть ли способ изменить атрибут класса CSS с помощью javascript?

<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>

Я хочу изменить отображение: блок для отображения: none для ВСЕХ <select> элементов после функции вызова пользователя changeCSS().

Это выглядит просто, но я не могу найти способ сделать это...

Ответы

Ответ 1

Ключ должен определить дополнительные правила для дополнительных классов и добавить эти классы к элементам, а не переписывать правила для данного правила стиля.

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;
}

Ответ 2

Я получаю доступ к классам CSS напрямую, чтобы одновременно настроить высоту кучи div. Вот как я это делаю:

function cssrules(){
  var rules={}; var ds=document.styleSheets,dsl=ds.length;
  for (var i=0;i<dsl;++i){
    var dsi=ds[i].cssRules,dsil=dsi.length;
    for (var j=0;j<dsil;++j) rules[dsi[j].selectorText]=dsi[j];
  }
  return rules;
};
function css_getclass(name,createifnotfound){
  var rules=cssrules();
  if (!rules.hasOwnProperty(name)) throw 'todo:deal_with_notfound_case';
  return rules[name];
};

а затем вы можете сделать что-то вроде css_getclass('.classname').style.background="blue". Я только пробовал это на хром для Windows, удачи в других браузерах.

Ответ 3

Вы можете изменять правила стиля, но обычно это не лучшее дизайнерское решение.

Чтобы получить доступ к правилам стиля, определенным таблицами стилей, вы получаете доступ к коллекции document.styleSheets. Каждая запись в этой коллекции будет иметь свойство, называемое cssRules или rules, в зависимости от браузера. Каждый из них будет CSSRule. Вы можете изменить правило, изменив его свойство cssText.

Но опять же, это, вероятно, не лучший способ решить проблему. Но это буквальный ответ на ваш вопрос.

Лучший способ решить проблему - это, вероятно, иметь еще один класс в вашей таблице стилей, который отменяет настройки предыдущего правила, а затем добавлять этот класс либо к элементам select, либо к их контейнеру. Так, например, у вас могут быть правила:

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

... и если вы хотите скрыть выбранные объекты, добавьте класс "bar" в контейнер с классом "fool".

Альтернативно, применяйте информацию стиля CSS непосредственно к элементам.

Ответ 4

Чтобы получить тот же эффект, вы можете создать другой стиль:

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

и измените класс <p> на foolnone.

В противном случае вам придется пройти через каждый из дочерних элементов <p> и изменить класс. Если вы так захотите, вероятно, лучше всего использовать какую-либо библиотеку, например jquery. С его помощью вы можете сделать что-то вроде:

<style>
.fool select.displaynone {
   display: none
}

$('.fool>select').toggleClass('displaynone')

См. этот jsfiddle для рабочего примера:

Здесь показаны оба вышеуказанных подхода (т.е. скрытие целого <p> и скрытие каждого из <select> s.

Ответ 5

Вот как бы я это сделал:

//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>

Ответ 6

 for(var elements = document.getElementsByTagName('select'), i = elements.length; i--)
     elements[i].style.display = "none";