当第一个.b:is()之间的空格肯定是子代组合符时,为什么CSS Select 器.a ~ .b :is(body .b .c .d)在下面的简单HTML标记中匹配.d,所以 Select 器应该try Select 任何.d,该.d.c的子代,而.cbody的子代,而body的子代(由于.b:is之间的空格)是作为.a的后续sibling 的任何.b的子代?

body不是.b的后代,但 Select 了.d,并将.d的S背景色设置为黄绿色.

我认为:is():where()中的 Select 符列表是相对的,如果它以组合符开头(例如+>~),否则它会被赋予一个隐含的后代组合符.因此,只有当它们是.b中的descendants(.c .d不是,但不是.b .c .dbody .b .c .d)时,body .b .c .d才应该匹配.

<div class="a"></div>
<div class="b">
  <div class="c">
    <div class="d"></div>
    </div>
</div>
.a {--bc: red;}
.b {--bc: green;}
.c {--bc: blue;}
.d {--bc: orange;}

:is(.a,.b,.c,.d) {
  aspect-ratio:1;
  border: 3px solid var(--bc);
  margin: 20px;
  width: 100px;
}

.a ~ .b :is(body .b .c .d) /* this colours .d but why? */
/* .a ~ .b :is(.b .c .d) -- so does this */
{
  background-color: chartreuse;
}

我try 了上面的Html和CSS,并希望.d不会被选中,然而,它是一个事实,拉了我的"如何我认为CSS的工作方式"地毯下我.

Note:我知道:is不一定只有一个 Select 器列表,最初开始研究这一点的CSS确实在:is()中有多个 Select 器列表,但在开始添加更多 Select 器之前,我首先需要了解这个 Select 器列表发生了什么.

推荐答案

你对:is()的理解并不是:is()%正确的.

.a ~ .b :is(body .b .c .d)

表示 Select 与 Select 符匹配的任何元素

.a ~ .b *

并且还匹配 Select 器

body .b .c .d

:is()的内部与外部没有关系,这是每个人都会犯的一个常见错误,因为你认为 Select 器是:

.a ~ .b :body .b .c .d

但事实并非如此.

因此,您将 Select 既是.b子代又是body .b .c子代的任何.d元素


另一个可以看出区别的例子是:

.a > .b > .c {
  /* I will select the .c element */
}

.a > :is(.b > .c) {
  /* I will select nothing! */
}
<div class="a">
 <div class="b">
  <div class="c">
   </div>
  </div>
</div>

这两个 Select 器并不相同.第二个意思是 Select .a的任何直系后代,即.c元素和.b的直系后代.

了解更多细节的好读物:https://www.bram.us/2023/01/17/using-is-in-complex-selectors-selects-more-than-you-might-initially-think/

Css相关问答推荐

Css扩展搜索栏,如何添加图标结束?

显示Reaction组件上的问题.使用FlexBox时的意外大小

可折叠/可展开的数据表行:如何使Shadcn数据表中的可折叠内容全宽?

我应该在哪里放置expo /Reaction本地项目的CSS重置文件?

将CSS栅格行高设置为其余视口高度

如何让 v-col 变成可滚动的?

使用CSS Grid是否可以跳过下一列?

将重复的线性渐变锚定到元素的顶部

更改行数时更改 CSS 网格列

使用 mixin 在 SCSS 中进行媒体查询

如何使用 TailwindCSS 水平设置输入和按钮

Bootstrap 类似乎没有任何作用

:required 或 [required] CSS Select 器

Tailwind:如何设置网格的自动填充?

CSS如何防止键盘向上移动内容?

如何强制 div 出现在下方而不是旁边?

悬停时如何在图像上显示文字?

如果容器 div 较小,如何将子 div 扩展到 100% 屏幕宽度?

bootstrap.css 和 bootstrap-theme.css 有什么区别?

如何让 flexbox 在计算中包含填充?