Как применять нечетные/четные стили к элементам при учете исключенных классов?
Как применить конкретный стиль CSS для каждого (ради аргумента) нечетного элемента в наборе элементов, принимая во внимание набор исключенных элементов?
Проблема реплицируется здесь (показана в кодефене):
http://codepen.io/houdmont/pen/VLOBBG
Применяется ряд элементов, которые имеют класс .foo
:
<a href="#" class="foo">1. Blue</a>
<a href="#" class="foo">2. Green</a>
<a href="#" class="foo">3. Blue</a>
<a href="#" class="foo bar">4. Hidden (blue)</a>
<a href="#" class="foo bar">5. Hidden (blue)</a>
<a href="#" class="foo bar">6. Hidden (blue)</a>
<a href="#" class="foo">7. Green</a>
Когда применяется класс .bar
, элемент скрыт.
Я бы хотел, чтобы оставшиеся элементы с .foo
применялись для стилизации нечетно/четно.
Попытайтесь сделать следующее:
.bar {
display: none;
}
/**
* This clearly doesn't work as I'd hoped it would.
*/
.foo:not(.bar):nth-of-type(even) {
color: green;
}
В идеале, я бы хотел, чтобы седьмой элемент был зеленым, хотя это был "нечетный" элемент, если бы я мог исключить элементы с классом .bar
, тогда он был бы четвертым элементом и поэтому считался бы "четным" ", установив цвет в зеленый цвет.
Возможно ли это с помощью CSS?
Ответы
Ответ 1
К сожалению, это невозможно. Ранее здесь ответил: fooobar.com/questions/384452/...
CSS полностью декларативный; каждый селектор - это простое условие, которое является истинным или ложным независимо от любой части селектора. Это не процедурный язык, на котором вы берете набор и обрабатываете его, сужая его с каждым шагом. Селекторный язык с процедурными правилами будет невосприимчив ко многим видам оптимизации и будет медленнее.
Итак, nth-of-type - это только позиция в родительском элементе, а не позиция в списке результатов до сих пор, потому что селектора CSS не имеют такой концепции. Механизм выбора мог бы проверить тест для nth-of-type, прежде чем сузить его, а не, поскольку правила не мешают друг другу.
Ответ 2
Как сказал Гефисток, нет никакого способа сделать это с помощью только css. С другой стороны, с javascript это очень просто:
var list = document.getElementsByClassName('foo');
var x=0;
for(i=0;i<list.length; i++){
if(x%2==1) list[i].style.color='green';
if(list[i].className.indexOf("bar")==-1) x++;
}