![](/img/trans.png)
[英]Difference in applying CSS to html, body, and the universal selector *?
[英]Difference between universal and descending selector in CSS
我想知道是否有人可以告訴我何時使用通用選擇器以及何時使用 css 中的后代選擇器? 我四處尋找一個很好的解釋,但沒有找到一個很好的答案來解釋它們之間的區別以及何時使用一個或另一個:
div * .test{
color: red;
}
div .test{
color: red;
}
更新涵蓋所有場景:
div * .test{
color: red;
}
div *.test{
color: red;
}
div .test{
color: red;
}
一般規則是非常稀疏地使用通用選擇器,因為它對性能有不良影響。 你基本上幾乎從不使用它。
后代選擇器,顧名思義,目標是后代選擇器之前元素的后代。
請注意,您顯示的兩個選擇器並不完全相同。
從右到左閱讀選擇器很有幫助:
div * .test
目標
test
( .test
) 的項目
*
div
元素。看這個例子:
div * .test{ color: red; }
<div> <div class="test">test</div> </div>
現在與您的第二個選擇器進行比較:
div .test{ color: red; }
<div> <div class="test">test</div> </div>
編輯:您現在已經擴大了您的問題。
*.test
和.test
目標完全相同的元素,在這里明確使用通用選擇器沒有任何好處,我認為這是不好的編碼實踐。 隱式地,它已經是任何沒有元素選擇器的選擇器部分的一部分:
#foo
等同於*#foo
[foo]
等同於*[foo]
首先,請注意 CSS 中的 Child 組合符 ( >
) 表示直接的子關系。 而后代組合子 (
) 將適用於直接和間接子女。
考慮到這一點。 selectos div * .test
將采用類test
的元素,這些元素是div
元素子元素的子元素。 而且,由於我們使用的是后代組合器,因此它們可以是間接子代。
但是, div .test
將采用類test
元素,這些元素是div
孩子。
因此, div .test
將選擇span
在<div><span class="test">test</span></div>
然而, div * .test
不會,因為在div
和span
之間沒有另一個元素。
它們都將選擇span
中<div><p><span class="test">test</span></div>
在這種情況下*
匹配p
元素。 然而,沒有必要匹配它,因為我們使用的是后代組合器。 在這種情況下,使用*
會給瀏覽器帶來額外的工作。
請注意, div *
和div
沒有選擇相同的元素。 該div *
選擇的所有子div
。 而div
選擇所有div
。
順便說一句,作為一般規則,選擇器越簡單,瀏覽器就越容易檢查它。 瀏覽器的通常實現向后檢查這些選擇器(從匹配最右邊的部分開始)。 這意味着對於div *
,瀏覽器必須檢查頁面上的每個元素以查看它是否在div
。 因此,選擇器越短越具體越好。
例如,如果您只想要類test
是div
直接子級的元素,請使用div > .test
。 這樣,瀏覽器就不會爬 DOM 尋找是否有包含該元素的div
。
而且,當然,如果您可以使用.test
,那就更好了。
*.test
將采用類test
所有元素,這與.test
相同。
根據測試您的選擇,使用像border: 1px solid black
類的東西。 這將允許您區分何時選擇元素和何時選擇其父元素。
主要有 3 種類型的選擇器 wrt 你在問什么。
/* apply to every element */ * { padding: 4px; } div.parent { width: 100px; height: 100px; border: 2px solid green; background-color: lightblue; } /* apply to every element inside parent*/ .parnet * { border: 2px solid black; } /* apply to all immediate children element with class 'child1' inside parent*/ .parnet > .child1 { border: 2px solid red; background-color: lightgreen; } /* apply to all children element with class 'test' inside parent*/ .parnet .test { border: 2px solid blue; background-color: lightpink; }
<div class="parnet"> Parent <div class="child child1"> child 1 <div class="test">test 1</div> </div> <div class="child child2"> child 2 <div class="test">test 2</div> </div> </div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.