选择一个类的所有后代,除了另一个类中的后代(反之亦然)

Emi*_*ily 5 html css css-selectors

我想针对某个特定段落所有 后代段落class同时忽略一个中另一个段落所有 后代段落class(无论哪个类在哪个类中,这都应该有效)。为此,我必须使用 4 个选择器,如下所示:

* {
  margin: 0.2em 0;
  width: fit-content;
}

div {
  margin-left: 1em
}

/* == 4 selectors to achieve desired effect = */

.orange p {
  background: orange;
}

.cyan .orange p {
  background: orange;
}

.cyan p {
  background: cyan;
}

.orange .cyan p {
  background: cyan;
}
Run Code Online (Sandbox Code Playgroud)
<div class="orange">
        <p>Orange</p>
        <div>
          <p>Orange</p>
          <div>
            <p>Orange</p>
            <div class="cyan">
              <p>Cyan</p>
              <div>
                <p>Cyan</p>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="cyan">
        <p>Cyan</p>
        <div>
          <p>Cyan</p>
          <div>
            <p>Cyan</p>
            <div class="orange">
              <p>Orange</p>
              <div>
                <p>Orange</p>
              </div>
            </div>
          </div>
        </div>
      </div>
Run Code Online (Sandbox Code Playgroud)

问题是:这可以仅使用两个选择器来实现吗?[这两个选择器的顺序应该能够在不改变效果的情况下改变。]

我试过选择器,如:

.orange:not(.cyan) p {
  background: orange;
}

.cyan:not(.orange) p {
  background: cyan;
}
Run Code Online (Sandbox Code Playgroud)

但它并没有很好地针对最后一个,因为它继承了第一个的风格。我正在寻找两个匹配这些情况的选择器,而在样式表中没有任何特定的顺序。

Tem*_*fif 2

这是一个使用 CSS 变量的简单解决方案。检查以下问题以获取更多详细信息:CSS 作用域自定义属性在用于计算外部作用域中的变量时被忽略

* {
  margin: 0.2em 0;
  width: fit-content;
}

div {
  margin-left: 1em
}

p {
  background: var(--c);
}
.cyan {
  --c:cyan;
}
.orange {
  --c:orange;
}
Run Code Online (Sandbox Code Playgroud)
<div class="orange">
  <p>Orange</p>
  <div>
    <p>Orange</p>
    <div>
      <p>Orange</p>
      <div class="cyan">
        <p>Cyan</p>
        <div>
          <p>Cyan</p>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="cyan">
  <p>Cyan</p>
  <div>
    <p>Cyan</p>
    <div>
      <p>Cyan</p>
      <div class="orange">
        <p>Orange</p>
        <div>
          <p>Orange</p>
        </div>
      </div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

您可以将其缩放为任意数量的着色,因为每种颜色只需要一个选择器,并且顺序无关紧要:

* {
  margin: 0.2em 0;
  width: fit-content;
}

div {
  margin-left: 1em
}

p {
  background: var(--c);
}
.cyan {
  --c:cyan;
}
.orange {
  --c:orange;
}
.blue {
  --c:lightblue;
}
Run Code Online (Sandbox Code Playgroud)
<div class="orange">
  <p>Orange</p>
  <div>
    <p>Orange</p>
    <div>
      <p>Orange</p>
      <div class="cyan">
        <p>Cyan</p>
        <div class="blue">
          <p>Blue</p>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="cyan">
  <p>Cyan</p>
  <div class="blue">
    <p>Blue</p>
    <div>
      <p>Blue</p>
      <div class="orange">
        <p>Orange</p>
        <div>
          <p>Orange</p>
        </div>
      </div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)