& 巢狀選擇器
CSS & 巢狀選擇器 在使用 CSS 巢狀時,明確地說明了父規則和子規則之間的關係。它使得巢狀的子規則選擇器相對於父元素。如果沒有 & 巢狀選擇器,子規則選擇器會選擇子元素。子規則選擇器的 特異性 權重與它們在 :is() 中時的權重相同。
注意: 子規則 不意味著 子元素選擇器。子規則可以根據是否使用 & 巢狀選擇器來針對父元素或子元素。
如果不在巢狀樣式規則中使用,& 巢狀選擇器代表 作用域根。
語法
parentRule {
/* parent rule style properties */
& childRule {
/* child rule style properties */
}
}
& 巢狀選擇器和空格
考慮以下在沒有 & 巢狀選擇器的情況下進行巢狀的程式碼。
.parent-rule {
/* parent rule properties */
.child-rule {
/* child rule properties */
}
}
當瀏覽器解析巢狀選擇器時,它會自動在選擇器之間新增空格,以建立新的 CSS 選擇器規則。以下程式碼顯示了等效的非巢狀規則
.parent-rule {
/* parent rule style properties */
}
.parent-rule .child-rule {
/* style properties for .child-rule descendants for .parent-rule ancestors */
}
當巢狀規則需要(沒有空格)附加到父規則時,例如使用 偽類 或建立 複合選擇器 時,必須立即在前面加上 & 巢狀選擇器才能達到預期效果。
考慮一個示例,我們想要樣式化一個元素,提供始終應用的樣式,並且還巢狀一些僅在懸停時應用的樣式。如果未包含 & 巢狀選擇器,則會新增空格,最終得到一個規則集,該規則集將巢狀樣式應用於父規則選擇器的任何懸停後代。然而,這並不是我們想要的。
.parent-rule {
/* parent rule properties */
:hover {
/* child rule properties */
}
}
/* the browser parses the above nested rules as shown below */
.parent-rule {
/* parent rule properties */
}
.parent-rule *:hover {
/* child rule properties */
}
在沒有空格的情況下新增 & 巢狀選擇器後,父規則匹配的元素在懸停時將被樣式化。
.parent-rule {
/* parent rule properties */
&:hover {
/* child rule properties */
}
}
/* the browser parses the above nested rules as shown below */
.parent-rule {
/* parent rule properties */
}
.parent-rule:hover {
/* child rule properties */
}
附加 & 巢狀選擇器
& 巢狀選擇器也可以附加到後面,以反轉規則的上下文。
.card {
/* .card styles */
.featured & {
/* .featured .card styles */
}
}
/* the browser parses above nested rules as */
.card {
/* .card styles */
}
.featured .card {
/* .featured .card styles */
}
& 巢狀選擇器可以放置多次
.card {
/* .card styles */
.featured & & & {
/* .featured .card .card .card styles */
}
}
/* the browser parses above nested rules as */
.card {
/* .card styles */
}
.featured .card .card .card {
/* .featured .card .card .card styles */
}
不能表示偽元素
& 選擇器等同於 :is() 選擇器,並且具有相同的限制,即它不能表示偽元素。
例如,對於以下樣式規則,即使巢狀在 <div class="important"> 中,也不會將任何生成的文字樣式化為紅色,因為 .important :is(.foo::before) 無法匹配任何內容。
.foo::before {
content: "Hello";
.important & {
color: red;
}
}
此限制也適用於 巢狀 @ 規則,其屬性隱式地包裹在 & 選擇器中。例如,對於以下規則,即使在小螢幕上,也不會將任何生成的文字樣式化為紅色,因為 color: red 屬性隱式地包裹在 & 選擇器中,在本例中為 :is(.foo::before)。
.foo::before {
content: "Hello";
@media (width < 600px) {
color: red;
}
}
示例
以下兩個示例產生相同的輸出。第一個使用普通的 CSS 樣式,第二個使用 & 巢狀選擇器。
使用普通 CSS 樣式
此示例使用普通 CSS 樣式。
HTML
<p class="example">
This paragraph <a href="#">contains a link</a>, try hovering or focusing it.
</p>
CSS
.example {
font-family: system-ui;
font-size: 1.2rem;
}
.example > a {
color: tomato;
}
.example > a:hover,
.example > a:focus {
color: ivory;
background-color: tomato;
}
結果
在巢狀 CSS 樣式中使用 &
此示例使用巢狀 CSS 樣式。
HTML
<p class="example">
This paragraph <a href="#">contains a link</a>, try hovering or focusing it.
</p>
CSS
.example {
font-family: system-ui;
font-size: 1.2rem;
& > a {
color: tomato;
&:hover,
&:focus {
color: ivory;
background-color: tomato;
}
}
}
結果
在巢狀規則之外使用 &
如果不在巢狀樣式規則中使用,& 巢狀選擇器代表 作用域根。
<p>Hover over the output box to change document's background color.</p>
& {
color: blue;
font-weight: bold;
}
&:hover {
background-color: wheat;
}
結果
在這種情況下,所有樣式都適用於 文件。
規範
| 規範 |
|---|
| CSS 巢狀模組 # nest-selector |
瀏覽器相容性
載入中…