
在前端开发中,我们经常需要对html文档中的元素应用样式。然而,有时需求会变得复杂:我们可能希望为某个父元素下的所有子元素设置统一的样式,但同时又需要排除其中某个特定的子元素及其内部的所有内容。例如,在一个通用布局中,所有文本颜色默认为蓝色,但某个特定的警告区域及其内部的文本需要保持红色。此时,css的:not(否定伪类)选择器便成为一个强大的工具,允许我们精确地排除不希望被选中或应用样式的元素。
:not选择器用于匹配不符合其内部参数选择器的元素。它的基本语法是selector:not(sub-selector)。
例如,div:not(.special)会选中所有没有.special类的div元素。然而,当我们需要排除一个元素及其所有后代时,仅仅使用div *:not(.wrapper_1)是不够的。这个选择器只会排除div本身具有.wrapper_1类的元素,但不会排除wrapper_1内部的子元素。这些子元素仍然会被div *选中,并可能继承或应用父级规则。
考虑以下HTML结构:
<div class="container">
<div>
<div>
<div>
<span>This is the test content 1 .</span>
</div>
<div class="wrapper_1">
This is the test content 2
<br>
<span>This is the test content 3</span>
</div>
<span class="wrapper_2">This is the test content 4.</span>
</div>
</div>
</div>如果我们的目标是让.container内的所有文本默认为蓝色,但.wrapper_1及其内部的所有文本保持其原有样式(例如红色),那么一个简单的.container *:not(.wrapper_1)将无法达到目的。wrapper_1内的<br>和<span>元素仍然会被选中。
立即学习“前端免费学习笔记(深入)”;
要彻底排除一个特定元素及其所有嵌套子元素(即所有后代),我们需要在:not选择器中同时指定该元素本身和它的所有后代。
核心解决方案: 我们可以使用以下CSS规则来实现这一目标:
.container *:not(.wrapper_1, .wrapper_1 *) {
color: blue;
}让我们分解这个选择器:
通过将.wrapper_1和.wrapper_1 *结合在:not中,我们确保了wrapper_1元素本身及其内部的任何子元素、孙子元素等都不会被.container *的样式规则选中。
示例代码:
结合上述HTML结构和优化的CSS,我们可以看到其效果:
.wrapper_1 {
color: red; /* 确保wrapper_1及其内容默认是红色 */
}
/* 选中.container下所有后代,但排除.wrapper_1及其所有后代 */
.container *:not(.wrapper_1, .wrapper_1 *) {
color: blue;
}
.wrapper_2 {
color: green; /* 这是一个单独的规则,覆盖了.container *的蓝色 */
}效果分析:
注意:wrapper_1 > *与wrapper_1 *的区别
在某些情况下,可能只希望排除一个元素的直接子元素,这时可以使用wrapper_1 > *。然而,如果需求是排除所有嵌套子元素(即所有后代,无论层级多深),那么wrapper_1 *(后代选择器)才是正确的选择,因为它会匹配wrapper_1内的所有子元素、孙子元素、曾孙子元素等。本教程旨在解决“所有嵌套子元素”的问题,因此采用了更全面的wrapper_1 *。
以上就是CSS :not选择器深度解析:精确排除元素及其所有后代样式的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号