例1(满分MDN Nesting Selector分):

.card {
  /* .card styles */
  .featured & {
    /* .featured .card styles */
  }
}

/* the browser parses above nested rules as */

.card {
  /* .card styles */
}

.featured .card {
  /* .featured .card styles */
}

转换后的版本有一个介于.featured.card之间的空格字符.

例2(满分MDN Nesting Selector分):

.card {
  padding: 0.5rem;
  border: 1px solid black;
  border-radius: 0.5rem;
  & h2 {
    /* equivalent to `.card h2` */
    color: slateblue;
    .featured & {
      /* equivalent to `.featured.card h2` */
      color: tomato;
    }
  }
}

.featured.card之间没有空格.

w3 doc表示&相当于:is().这与第一个例子是一致的,但第二个例子不是.

我测试过这两个例子,它们都是绝对正确的!

我试着go 掉示例2中&周围的空格.如果我移go 左边的空格,它就不再起作用了.如果我从右边移走,也没什么不同.

使用&时,我找不到多层嵌套 Select 器的任何文档.有人能解释这种行为吗?

推荐答案

如果你遵循替换为:is()的逻辑,你会得到以下结果

.card {
  padding: 0.5rem;
  border: 1px solid black;
  border-radius: 0.5rem;
}

:is(.card) h2 {
  color: slateblue;
}

.featured :is(:is(.card) h2) {
  color: tomato;
}
<article class="card">
  <h2>Card 1</h2>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>
<article class="card featured">
  <h2>Card 2</h2>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>
<article class="card">
  <h2>Card 3</h2>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>

现在,第二个 Select 器中的诀窍是,您将 Select 一个既是.featured的后代又是.card的后代的h2元素..card h2.featured h2的组合,在文档中他们说它相当于.card.featured h2,这是不准确的,因为你也可以有以下内容

.card {
  padding: 0.5rem;
  border: 1px solid black;
  border-radius: 0.5rem;
}

:is(.card) h2 {
  color: slateblue;
}

.featured :is(:is(.card) h2) {
  color: tomato;
}
<article class="card">
  <h2>Card 1</h2>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>
<article class="card">
 <div class="featured">
  <h2>Card 2</h2>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
  </div>
</article>
<article class="card">
  <h2>Card 3</h2>
  <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit.</p>
</article>

请注意,我如何将.featured移到另一个元素中,而 Select 器仍然有效.

因此, Select 器工作得很好,并且等价性对于特定情况是正确的,但不是在一般情况下.他们可能应该更新解释,以避免混淆.


同样需要注意的是,以下内容并不等同

.featured :is(:is(.card) h2)
.featured .card h2

Related: This CSS :is() Selector Isn't Working As I Think It Should

Html相关问答推荐

Vue.js复选框对齐问题:在表格单元格中居中复选框

当在双引号|Angular .html文件中使用时,Pretier会将单引号字符替换为&;Quot;

每次在视口中运行动画

如何修复与导航栏重叠的css网格?

在CSS中旋转排除的蒙版图像

无法从路径参数获取ID

如果DIV没有特定的sibling 姐妹,则以CSS为目标

为什么 `::before` 在使用内容 `url(svg)` 时会增加一些高度

一旦大于最大限制,JQuery 取消 Select 复选框

对齐列表项内的文本,使其不在元素装饰下

Tailwind 网格行高度可防止拉伸到最高行的所有相同高度

如何使用html css将图像显示为附加形状

当悬停时,同时影响相邻的两侧div

如何使文本区域自动扩展到最大高度?

如何将自定义图像插入 Shiny plot header?

如何在div中设计伪元素?

提交前的验证表单未显示任何验证消息?

html tailwindcss 给 li 标签添加边框

我正在try 向我预先存在的导航栏添加响应式汉堡包导航,但由于某种原因它没有显示

将固定/绝对伪元素放置在相对 div(具有滚动条)内,始终位于底部