【问题标题】:Why doesn't this CSS :not() declaration filter down?为什么这个 CSS :not() 声明不过滤掉?
【发布时间】:2012-01-22 08:46:59
【问题描述】:

我想选择不是特定类的后代的跨度,我们称之为“否”。这是我的 CSS:

div:not(.no) span{background-color:#00f;}

这是 HTML

<div>
    <span>yes 1</span>
</div>
<div class="no">
        <span>no 1</span>
</div>
<div class="no">
    <div>
           <span>no 2</span>
    </div>
</div>

两个问题:

  1. 为什么我的 CSS 同时适用于 yes 1 和 no 2?
  2. 如果我切换到通用选择器,为什么整个事情都会中断?

    *:not(.no) span{background-color:#00f;}
    

这是 JSFiddle 中的代码:http://jsfiddle.net/stephaniehobson/JtNZm/

【问题讨论】:

标签: css css-selectors pseudo-class negation


【解决方案1】:
  1. span 元素的父 div 元素都没有 no 类,无论其他祖先是否有它:

    <div> <!-- This is div:not(.no), pretty much a given -->
        <span>yes 1</span>
    </div>
    
    <div class="no"> <!-- In this case, although this is div.no... -->
        <div>        <!-- ... this is div:not(.no)! -->
               <span>no 2</span>
        </div>
    </div>
    
  2. htmlbody,它们是 divspan 元素的祖先,在使用通用选择器时(或者更确切地说,在省略类型选择器时)满足 *:not(.no)。这会导致您的所有span 元素所有具有背景颜色。

一个解决方案是使用子组合器将否定过滤器锚定到 body 元素,如果您的顶级 div 元素将始终是 body 的子元素:

body > div:not(.no) span { background-color: #00f; }

jsFiddle demo

另一种解决方案是简单地使用覆盖样式。

【讨论】:

  • 这是一个更大的 jQuery 优化问题的一小部分,我无法确定 DOM 中任何元素之间的关系。这有点让我烦恼,但现在已经不是了:)
  • +1。谢谢。我终于明白我的问题是什么,这促使我提出了相关问题stackoverflow.com/questions/20869061/…
【解决方案2】:

BoltClock 是正确的。如果您像这样使用选择器,可能会更有意义:

选择任何span 元素
继承自 div 元素
class 值不包含单词no

您的示例中每个选定的spans 实际上都是div 的后裔,其class 值不包含单词no——事实上它们中的第二个也是从@ 派生的其class确实包含单词no 的987654329@ 不会否定(哈哈!)前面的语句。

有趣的是,我敢打赌,如果您将第二个 no 下移一级,第二个 span 仍然会匹配。 CSS 没有元素邻近的概念,因此任何祖先 div 都应该足以匹配选择器,无论它是否“更接近”span

【讨论】:

  • 我试过了,你是对的,如果我将第二个 no 向下移动一个级别,第二个 span 仍然匹配。比有趣更令人沮丧:P
  • 天哪,是埃里克·迈耶! :D
【解决方案3】:

我认为最好的选择是将你的陈述分成2份:

div span { background-color:#00f; }
.no span { background-color:#fff; }

你可以在这里看到效果:http://jsfiddle.net/JHTqp/

【讨论】:

  • 不幸的是,这只是一个更大的 jQuery 优化问题的一小部分,这只是我的测试用例。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多