【问题标题】:CSS :not() how do I not select any element if it's a child of container with class="foo"?CSS :not() 如果它是具有 class="foo" 的容器的子元素,我如何不选择任何元素?
【发布时间】:2020-10-05 01:53:17
【问题描述】:

我正在尝试在 SASS 中为一个 WordPress 网站创建 CSS 代码,我在该网站上为名为“.entry-content”的容器中显示的内容编写了我的样式。

我创建了一些自定义块,并为它们提供了一个名为“.mnk-block”的标准类。

我想要的是,我的块中的元素(例如 <h2><p>),如果放置在该容器内,则不要使用父“.entry-content”样式。我认为使用 :not() 伪类是合适的方法,但它不起作用。

<div class="entry-content">
  <h2>My title</h2>
  <div class="mnk-block">
    <h2>My block title</h2>
  </div>
</div>

在 sass 中我写了这样的代码

.mnk-block {
  h2 {
    color: red;
  }
}
.entry-content {
  h2:not(.mnk-block h2) {
    color: blue;
  }
}

但这最终根本没有选择任何东西。我的“.mnk-block”显示正确,因为它使用了在其他地方声明的样式,但我的“.entry-content”样式没有在任何地方应用。

然后我尝试了这个:

.mnk-block {
  h2 {
    color: red;
  }
}

.entry-content {
  :not(.mnk-block) {
    h2 {
      color: blue;
   }
  }

但这会选择在.entry-content 中匹配的任何内容,覆盖或与我的.mnk-block CSS 样式发生冲突。

如何声明不应用于我的特定类的样式?这真的让我很困惑 - 很难在这里解释它。任何帮助表示赞赏。

【问题讨论】:

    标签: css sass css-selectors pseudo-element


    【解决方案1】:

    CSS 的顺序也很重要。

    由于这里的 sn-ps 不接受 SASS,我使用的是常规 CSS:如果您首先在 .entry-content 中为 h2(或任何其他元素)定义规则,然后添加h2 作为 .mnk-block 的子级的规则,它将覆盖前一个:

    .entry-content h2 {
      color: blue;
    }
    .mnk-block h2 {
      color: red;
    }
    <div class="entry-content">
      <h2>My title</h2>
      <div class="mnk-block">
        <h2>My block title</h2>
      </div>
    </div>

    【讨论】:

    • 正如我在下面评论的那样,这是一个我没有想到的好观点,你们都陈述了相同的(正确的)观点。但是如何通过不使用 :not() 选择子元素来做到这一点? (请参阅我在@Alan Lins 回复中留下的评论)谢谢!
    • 好吧,.entry-content :not(.mnk-block) h2 将是一个有效的选择器,但它的问题是:在这种情况下,has 必须是 some 元素之间.entry-content h2 - 它不适用于h2,它是.entry-content直接 子级。所以你可能会使用.entry-content :not(.mnk-block) h2, .entry-content &gt; h2 { ... } ,但我怀疑这是否不那么复杂
    • 好的,谢谢,我认为与其让这些更简单,我只是尝试使用 :not() 来复杂化它 - 我会使用你的建议。
    【解决方案2】:

    我将使用纯 css 中的示例来解释它。 Css 优先于声明的最后一条指令。因此,如果您将“.mnk-block”移动到底部,它将覆盖 .mnk-block 中的 entry-content h2。如果您尝试下面的代码 entry-content h2 将是蓝色的,而 mnk-block h2 将是红色的

    .entry-content h2{
        color: blue;
    }
    
    .mnk-block h2{
        color: red;  
    }
    

    但是,你使用下面这段代码,一切都会是蓝色的,因为最后一条指令是 entry-content h2

    .mnk-block h2{
        color: red;  
    }
    
    .entry-content h2{
        color: blue;
    }
    

    另外,如果你只想申请entry-content的第一个child h2并呈现所有嵌套的children,可以使用>。

    .entry-content > h2{
        color: blue;
    }
    

    【讨论】:

    • 这是一个我没有想到的好点,因为我在试图理解 :not() 伪类时迷失了方向。但是,我将如何使用 :not() 来不在孩子中应用样式?我这样说是因为我们编写了很多块,并且重新声明这些子元素中的所有样式以覆盖它们似乎更耗时。
    【解决方案3】:

    请试试这个

    CSS

    .mnk-block h2{
      color: red;  
    }
    .entry-content:not(h2){
      color: blue;
    }
    

    SCSS

    .mnk-block h2{
      color: red;  
    }
    .entry-content:not(h2){
      color: blue;
    }
    

    两者都一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      相关资源
      最近更新 更多