Одним из решений является разделение определений CSS.Начните с предположения, что текст всегда будет красным, если в какой-то момент за .a
следует .c
, затем укажите, что вы хотите сбросить все, если .b
находится в пути в любой точке.
.a .c {
color: red;
background-color: gray;
display: inline-block;
padding: 2em;
animation-name: spin;
animation-duration: 4000ms;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(-360deg);
}
}
.a .b .c {
all: unset;
}
<div class="a">
<div class="g">
<div class="c">i should be red and spinning</div>
</div>
</div>
<div class="a">
<div class="c">i should be red and spinning</div>
</div>
<div class="a">
<div class="g">
<div class="f">
<div class="c">i should be red and spinning</div>
</div>
</div>
</div>
<div class="a">
<div class="b">
<div class="c">i should not be red or spinning</div>
</div>
</div>
<div class="a">
<div class="g">
<div class="b">
<div class="f">
<div class="c">i should not be red or spinning</div>
</div>
</div>
</div>
</div>
<div class="a">
<div class="g">
<div class="d">
<div class="b">
<div class="f">
<div class="e">
<div class="c">i should not be red or spinning</div>
</div>
</div>
</div>
</div>
</div>
</div>
Примечание: all
не работает в IE.Кроме того, анимация вращения взята из здесь - я просто вставил это, чтобы продемонстрировать, как all
перезаписывает все, включая любые анимации.