對於後端程式起家的我, 以前我對CSS的選擇器selector
大概就只知道id
、class
、*
,一直到前17年初我真正踏入前端的領域後才知道原來選擇器可以有這麼多的使用方式。
資料來源:w3cschol
類別選擇器
html
// html
<div class="foo bar">
Hello CSS
</div>
selector
.foo {
color: red;
}
.foo.bar {
color: blue;
}
補充說明
以上範例最終Hello CSS將會呈現藍色,特別注意.foo
與.bar
在css
裡我刻意地將他們連在一起
這意義代表通時擁有.foo
與.bar
類的元素顏色才會被定義於藍色。
而如果我們將CSS範例改成以下
.foo {
color: red;
}
.foo .bar {
color: blue;
}
其差異只在於.foo
與.bar
的定義用空白隔開,但實際意義去大大不同
當這兩個類使用空白分開時代表CSS將會定義其.bar
類屬於.foo
類的子元素時才改變顏色
所以由於以上html
範例標籤div
雖然帶有.bar
類,但與.foo
類屬於同一層級,並不符合父子關係
所以color: blue
並不會對這個div
生效。
這個定義對於當初不熟悉的我來說覺得有點繞,搞不太清楚為甚麼要這樣解釋。
原因在於這句話同時解釋了CSS的運作
CSS將會從選擇器的最右邊開始往左邊解讀
當CSS看到.foo .bar
這樣的定義時,會先找出文件裡帶有.bar
類的element
元素,然後如果左邊沒有其他類的定義,就會套用定義,但!如果左邊還有其他選擇器就會在近一步的搜尋是否屬於.foo
類,依此類推依序向文件頂點html
做查找,由此可知若把選擇器寫的越詳細、越深,其實效能越是低下
html
<div id="foo" class="bar">
Hello CSS
<div>
selector
#foo {
color: red;
}
.bar {
color: blue;
}
補充說明.id
選擇器其特定度
相當高僅次於!important
與行內定義
以這個範例來說,雖然.bar
類定義於id#bar
之後,但由於類特定度
低於id,因此.bar
類的color
雖然成功定義但不會被瀏覽器所使用。
更多特定度的解釋歡迎大家查看我在鐵人邦Day 2. CSS 特定度 Specificity這篇文章。
html
<div>
Hello CSS
<div>
<p class="foo">I love CSS3</p>
selector
div, .foo {
color: red;
}
補充說明
使用逗號可以將選擇器
分隔,使定義對每個選擇器
都生效
html
<div>
I love HTML
<p>I love CSS</p>
</div>
<p>I love JavaScript</p>
selector
p {
color: blue;
}
div p {
color: red;
}
補充說明>
符號代表定義該選擇器
的第一層子元素且符合選擇器
規則的對象樣式
以上範例 I love HTML 會是黑色, I love CSS會是紅色,而I love JavaScript會是藍色
定義樣式於緊接在selector1
之後的selector2
html
<div>I love HTML</div>
<p>I love CSS</p>
<p>I love JavaScript</p>
selector
div + p {
color: red;
}
補充說明
在這個範例中只有符合緊接在div
元素之後的p
元素會改變顏色,因此只有I love CSS變成了紅色。
屬性選擇器
html
<div foo>I love HTML</div>
<div foo="bar">I love HTML</div>
<input type="text" value="I love CSS">
<input type="number" value="10">
selector
[foo] {
color: blue;
}
input[type="text"] {
color: red;
}
補充說明
在這個範例中首先選擇器[foo]
將帶有foo
屬性的元素改變文字顏色為藍色
不管該屬性的值為何,甚至是沒有值,所以此範例的兩個I love HTM都會變為藍色!
接著將帶有type
屬性且屬性值為text的元素文字改變成紅色
因此雖然第二個input
帶有屬性type
但值不符合text所以文字顏色不會被改變