:not() pseudo-class 是否支持父元素?

Does the :not() pseudo-class support parent elements?

在 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;
}

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

In CSS, can you target an element, then exclude instances of it based on parent wrapper elements higher up the DOM?

不,不是您尝试的方式:

li:not(.wrap li)

不过,您可以改用一种更简单的方法来设置所有 <li> 元素的样式,然后专门设置那些具有 wrap class 祖先元素的样式-姓名:

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' class-名字的祖先:

: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>