【问题标题】:Does the :not() pseudo-class support parent elements?:not() 伪类是否支持父元素?
【发布时间】:2015-07-29 08:59:30
【问题描述】:

在 CSS 中,您能否定位一个元素,然后根据 DOM 更高层的父包装元素排除它的实例?

例如:

HTML

<div class="wrap">
    <ul>
         <li>link</li>
         <li>link</li>
         <li>link</li>
    </ul>
</div>
<ul>
     <li>link</li>
     <li>link</li>
     <li>link</li>
</ul>

CSS

li {
    color:red;
}
li:not(.wrap li) {
    colour:blue;
}

所以在这种情况下,我想根据它们的父包装器排除第一系列的&lt;li&gt; 标签。这可以通过 CSS 实现吗? (我的意思不是只定位 .wrap li 并在那里应用所需的样式,因为在我的情况下,我必须排除

【问题讨论】:

标签: html css css-selectors


【解决方案1】:

在 CSS 中,您能否定位一个元素,然后根据 DOM 更高层的父包装元素排除它的实例?

不,不是您尝试的方式:

li:not(.wrap li)

不过,您可以改用一种更简单的方法来设置所有 &lt;li&gt; 元素的样式,然后使用 wrap 类名专门设置祖先的后代元素:

li {
    /* generic styles for <li> elements */
}
.wrap li {
    /* specific styles for <li> elements that are
       descendants of elements with a class of '.wrap' */
}

li {
  color: blue;
}
.wrap li {
  color: red;  
}
<div class="wrap">
    <ul>
         <li>link</li>
         <li>link</li>
         <li>link</li>
    </ul>
</div>
<ul>
     <li>link</li>
     <li>link</li>
     <li>link</li>
</ul>

请注意,由于其脆弱性,以下内容已从答案的上述部分中删除 - 必须转义选择器中的句点,并且它可能会被 any 意外覆盖具有'wrap' 类名的祖先:

:not(\.wrap) li

li {
  color: red;
}
div:not(\.wrap) li {
  color: blue;  
}
<div class="wrap">
    <ul>
         <li>link</li>
         <li>link</li>
         <li>link</li>
    </ul>
</div>
<ul>
     <li>link</li>
     <li>link</li>
     <li>link</li>
</ul>

【讨论】:

  • 对于任何想知道的人,在\.wrap 中转义句点的真正作用是将其从类选择器转换为类型选择器。由于一种类型的元素不能是另一种类型,这使得div:not(\.wrap) 类似于div:not(p),即保证匹配所有 div 元素,尽管with slightly increased specificity。类属性完全从等式中删除。如果将第二个 ul 包装在它自己的 div 中,则选择器将匹配所有 li 元素。
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 2011-10-28
  • 2011-11-01
  • 2022-08-22
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多