Вы не можете достичь того, чего хотите, потому что это не так, как работает CSS. Оба ваших утверждения будут иметь одинаковую специфику, поэтому CSS определяет, какое правило выиграет в соответствии с порядком в файле CSS. Для внутренних стилей вам понадобится утверждение, которое имеет большую специфику. Это может быть достигнуто либо путем перечисления всех комбинаций классов, либо, например, с помощью селектора дочерних элементов (>
).
Я подумал, что поделюсь улучшением вашего решения. Он по-прежнему использует 4 CSS операторов (для 2 цветов), но не требует, чтобы вы записывали все возможные комбинации (в случае более чем 2 классов, это требует меньше усилий; см. Пример ниже).
Сначала вы раскрашиваете любой дочерний элемент <p>
голубого элемента в цвет cyan
. Затем вы перезаписываете это поведение дочерним селектором, который нацелен только на прямые дочерние элементы вашего элемента. .orange > p
затем перезаписывает .cyan p
. То же самое касается оранжевого / голубого.
* { font-family: sans-serif; }
.cyan p {
background: cyan;
}
.orange p {
background: orange;
}
.red p {
background: red;
}
.cyan > p {
background: cyan;
}
.orange > p {
background: orange;
}
.red > p {
background: red;
}
<ul>
<li class="orange">
<ul>
<li class="cyan"><p>.orange >> .cyan</p></li>
<li class="red"><p>.orange >> red</p></li>
<li><p>.orange >> –</p></li>
</ul>
</li>
<li class="cyan">
<ul>
<li class="orange"><p>.cyan >> .orange</p></li>
<li class="red"><p>.cyan >> .red</p></li>
<li><p>.cyan >> –</p></li>
</ul>
</li>
<li class="red">
<ul>
<li class="orange"><p>red >> orange</p></li>
<li class="cyan"><p>red >> cyan</p></li>
<li><p>.red >> –</p></li>
</ul>
</li>
</ul>