【问题标题】:CSS :not pseudo-class not workingCSS:不是伪类不起作用
【发布时间】:2017-05-27 00:58:10
【问题描述】:

我正在学习 :not() 伪类,但它没有按预期工作。

我想将除.mind 之外的所有文本都涂成红色。出于某种原因,这并不能阻止 .mind 元素变为红色。

:not(.mind) {
  color: red
}
<div class='parent'>
  <div class='child'>One</div>
  <div class='child'>Two</div>
  <div class='child'>Three</div>
  <div class='child'>One</div>
  <div class='child'>Two</div>
  <div class='child'>Three</div>
  <div class='child'>One</div>
  <div class='mind'>mind</div>
  <div class='child'>Three</div>
  <div class='child'>
    <p>First paragraph</p>
  </div>
</div>

【问题讨论】:

    标签: html css css-selectors pseudo-class


    【解决方案1】:

    记住这一点:

    :not() 等价于*:not()

    :not() 伪类前缀没有选择器时,隐含通用选择器:

    6.2. Universal selector

    如果由* 表示的通用选择器(即没有命名空间 prefix) 不是一系列简单选择器的唯一组成部分 选择器或紧跟一个伪元素,然后是* 可以省略并暗示通用选择器的存在。

    因此,你的规则是:

    :not(.mind) {
      color: red
    }
    

    ... 是说将红色应用于除mind 类元素之外的所有元素。

    好的,除了在这种情况下,the color property is inheritable,所以即使红色没有应用到 .mind 元素,它仍然通过继承 .parent 元素获得红色。

    这是浏览器正在做的事情:

    测试此行为的一种快速方法是使用不可继承的border 属性。

    在下面的示例中,使用您的选择器,您会注意到边框没有应用于.mind,并且您的选择器按预期工作:

    :not(.mind) {
      color: red;
      border-bottom: 1px dashed black;
    }
    <div class='parent'>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='mind'>mind</div>
      <div class='child'>Three</div>
      <div class='child'>
        <p>First paragraph</p>
      </div>
    </div>

    为了您的特定目标:

    我想将除.mind 之外的所有文本都涂成红色。

    使用更具体的选择器。

    .parent > :not(.mind) {
      color: red;
    }
    <div class='parent'>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='mind'>mind</div>
      <div class='child'>Three</div>
      <div class='child'>
        <p>First paragraph</p>
      </div>
    </div>

    【讨论】:

    • Another comment repost:“根据我的经验,大多数作者都感到惊讶的是,伪类或伪元素可以单独出现,而无需伴随 [sic] 类型、id 或类选择器。并且当你告诉他们一个伪类或伪类可以像 id 或类选择器一样自行出现时,他们表现得好像他们刚刚顿悟了。所有这一切都是因为你很少找到单独的伪类或伪类生产 CSS 中的 -elts(我猜除了 :root 和 ::selection 之外)。”
    • 您可以向 www-style 报告拼写错误,但由于 css3-selectors 已经是 REC,并且 selectors-4 正在积极开发中,我不会打扰。还有许多其他的,例如特异性部分中的“发生”。
    【解决方案2】:

    您的选择器工作正常,因为 :not(.mind)*:not(.mind) 相同 - 这是一个通用选择器 - 但是 因为 .mind.parent 的子级,它会得到 color:red继承自.parent,这就是为什么你看到它是红色的。

    为了简化,在这种情况下不需要使用:not(),只需使用.child

    .child {
      color: red
    }
    <div class='parent'>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='mind'>mind</div>
      <div class='child'>Three</div>
      <div class='child'>
        <p>First paragraph</p>
      </div>
    </div>

    但是,如果您希望 .mind div 也具有 .child 类,在这种情况下,您可以像这样使用 :not()

    .child:not(.mind) {rules}
    

    片段

    .child:not(.mind) {
      color: red
    }
    <div class='parent'>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='child'>Two</div>
      <div class='child'>Three</div>
      <div class='child'>One</div>
      <div class='child mind'>mind</div>
      <div class='child'>Three</div>
      <div class='child'>
        <p>First paragraph</p>
      </div>
    </div>

    【讨论】:

    • 谢谢。目前我正在学习 :not() 伪类,想知道为什么我的代码不起作用。
    • div:not(.mind) 作为示例选择器在这里会更有意义。
    • 谢谢。我正在查看 MDN 上的语法,它不需要 not() 开头的 .child 之类的修饰符。它声明语法为:not( &lt;selector&gt;# ) { style properties }。我认为这让我感到困惑。 developer.mozilla.org/en-US/docs/Web/CSS/:not
    • @Mr.Alien 它会,但是.parent 中的color:red.mind 继承,因此.mind 将是红色的jsfiddle.net/6rh873zz
    • @dippas 同意了。只是为了有一个明确的例子。我们可以使用其他可能无法继承的属性。
    【解决方案3】:

    它以父选择器为目标,而子 (.mind) 正在继承它。如果.mind 没有从父级继承颜色,代码就可以正常工作。

    div:not(.mind) {
      color: red;
    }
    		<div class='child'>One</div>
    		<div class='child'>Two</div>
    		<div class='child'>Three</div>
    		<div class='child'>One</div>
    		<div class='child'>Two</div>
    		<div class='child'>Three</div>
    		<div class='child'>One</div>
    		<div class='mind'>mind</div>
    		<div class='child'>Three</div>
    		<div class='child'><p>First paragraph</p></div>

    在这种情况下,您需要专门为 .mind 定义规则。

    【讨论】:

      【解决方案4】:

      你可以使用:not如下:

      .parent :not(.mind){
          color:red;
      }
      

      代码:

      .parent :not(.mind){
      	color:red;
      }
      <div class='parent'>
      	<div class='child'>One</div>
      	<div class='child'>Two</div>
      	<div class='child'>Three</div>
      	<div class='child'>One</div>
      	<div class='child'>Two</div>
      	<div class='child'>Three</div>
      	<div class='child'>One</div>
      			  
      	<div class='mind'>mind</div>
      			  
      	<div class='child'>Three</div>
      	<div class='child'>
      		<p>First paragraph</p>
      	</div>
      </div>

      【讨论】:

        猜你喜欢
        • 2012-09-03
        • 2015-08-18
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 2020-08-23
        • 2012-07-31
        • 2011-01-05
        相关资源
        最近更新 更多