CSS基礎學習八:派生選擇器
CSS語法中通過依據元素在其位置的上下文關係來定義樣式,你可以使標記更加簡潔。
在CSS1中,通過這種方式來應用規則的選擇器被稱為上下文選擇器(contextual selectors),這是由於它們依賴於
上下文關係來應用或者避免某項規則。在CSS2中,它們稱為派生選擇器,但是無論你如何稱呼它們,它們的作用都
是相同的。派生選擇器允許你根據文件的上下文關係來確定某個標籤的樣式。通過合理地使用派生選擇器,我們可以
使HTML程式碼變得更加整潔。
舉一個例子來說,你希望列表中的 strong 元素變為斜體字,而不是通常的粗體字,可以這樣定義一個派生選擇
器:
<span style="font-size:18px;">li strong {
font-style: italic;
font-weight: normal;
}</span>
請注意標記為<strong>的程式碼的上下文關係:<span style="font-size:18px;"><p><strong>我是粗體字,不是斜體字,因為我不在列表當中,所以這個規則對我不起作用</strong></p> <ol> <li><strong>我是斜體字。這是因為 strong 元素位於 li 元素內。</strong></li> <li>我是正常的字型。</li> </ol></span>
在上面的例子中,只有 li 元素中的 strong 元素的樣式為斜體字,無需為 strong 元素定義特別的 class 或 id,代
碼更加簡潔。
我們可以看以執行的結果為:
接下來我們來看看常見的派生選擇器。
一後代(包含)選擇器
後代選擇器又稱為包含選擇器。後代選擇器可以選擇作為某元素後代的元素。選擇某元素後代的元素,並設定一
些樣式。
(1)根據上下文選擇元素
我們可以定義後代選擇器來建立一些規則,使這些規則在某些文件結構中起作用,而在另外一些結構中不起作
用。上述的例子就是一個標準的後代選擇器的演示。
(2)語法解釋
在後代選擇器中,規則左邊的選擇器一端包括兩個或多個用空格分隔的選擇器。選擇器之間的空格是一種結合
符。每個空格結合符可以解釋為“... 在 ... 找到”、“... 作為 ... 的一部分”、“... 作為 ... 的後代”,但是要求必須從右向左
讀選擇器。語法:選擇器 選擇器 [選擇器...] {}。有關後代選擇器有一個易被忽視的方面,即兩個元素之間的層次間隔
可以是無限的。
比如:h1 span{ } span巢狀在h1中
<span style="font-size:18px;"><span style="font-size:18px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文件</title>
<style type="text/css">
h1 span { color:red;}
</style>
</head>
<body>
<h1>12345<span>12345</span></h1>
<span>12345</span>
<h1>12345<div><p><span>12345</div></p></span></h1>
</body>
</html></span></span>
執行的結果為:
(3)也有些複雜的選擇器組合成的後代選擇器: .test img{}和#header .btn{}等等。
二子元素選擇器
與後代選擇器相比,子元素選擇器(Child selectors)只能選擇作為某元素子元素的元素。比後代選擇器更嚴
格,選擇某元素子元素的元素,並設定一些樣式。
(1)選擇子元素
如果您不希望選擇任意的後代元素,而是希望縮小範圍,只選擇某個元素的子元素,請使用子元素選擇器。
例如,如果您希望選擇只作為 h1 元素子元素的 strong 元素,可以這樣寫:
<span style="font-size:18px;">h1 > strong {color:red;}</span>
這個規則會把第一個 h1 下面的 strong 元素變為紅色,但是第二個 strong 不受影響:
<span style="font-size:18px;"><h1>This is <strong>very</strong> important.</h1>
<h1>This is <em>really <strong>very</strong></em> important.</h1></span>
執行的結果為:
(2)語法解釋
您應該已經注意到了,子選擇器使用了大於號(子結合符)。子結合符兩邊可以有空白符,這是可選的。因此
,以下寫法都沒有問題:
<span style="font-size:18px;">h1 > strong
h1> strong
h1 >strong
h1>strong</span>
如果從右向左讀,選擇器 h1 > strong 可以解釋為“選擇作為 h1 元素子元素的所有 strong 元素”。
(3)結合後代選擇器和子選擇器
請看下面這個選擇器:
<span style="font-size:18px;">table.company td > p {}</span>
下面的選擇器會選擇作為 td 元素子元素的所有 p 元素,這個 td 元素本身從 table 元素繼承,該 table 元素有一個
包含 company 的 class 屬性。
三CSS 相鄰兄弟選擇器
相鄰兄弟選擇器可選擇緊接在另一元素後的元素,且二者有相同父元素。
(1)選擇相鄰兄弟
如果需要選擇緊接在另一個元素後的元素,而且二者有相同的父元素,可以使用相鄰兄弟選擇器。
例如,如果要增加緊接在 h1 元素後出現的段落的上邊距,可以這樣寫:
<span style="font-size:18px;">h1 + p { color:#FF0000;}</span>
這個選擇器讀作:“選擇緊接在 h1 元素後出現的段落,h1 和 p 元素擁有共同的父元素”。
<span style="font-size:18px;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文件</title>
<style type="text/css">
h1 + p { color:#FF0000;}
</style>
</head>
<body>
<h1>This is a heading.</h1>
<p>This is paragraph.</p>
<p>This is paragraph.</p>
<p>This is paragraph.</p>
<p>This is paragraph.</p>
<p>This is paragraph.</p>
</body>
</html></span>
執行的結果為:
(2)語法解釋
相鄰兄弟選擇器使用了加號(+),即相鄰兄弟結合符。註釋:與子結合符一樣,相鄰兄弟結合符旁邊可以有空
白符。
請看下面這個文件樹片段:
<span style="font-size:18px;"><div>
<ul>
<li>List item 1</li>
<li>List item 2</li>
<li>List item 3</li>
</ul>
<ol>
<li>List item 1</li>
<li>List item 2</li>
<li>List item 3</li>
</ol>
</div></span>
在上面的片段中,div 元素中包含兩個列表:一個無序列表,一個有序列表,每個列表都包含三個列表項。這兩
個列表是相鄰兄弟,列表項本身也是相鄰兄弟。不過,第一個列表中的列表項與第二個列表中的列表項不是相鄰兄
弟,因為這兩組列表項不屬於同一父元素(最多隻能算堂兄弟)。
請記住,用一個結合符只能選擇兩個相鄰兄弟中的第二個元素。請看下面的選擇器:
<span style="font-size:18px;">li + li {font-weight:bold;}</span>
上面這個選擇器只會把列表中的第二個和第三個列表項變為粗體。第一個列表項不受影響。
執行的結果為: (3)結合其他選擇器相鄰兄弟結合符還可以結合其他結合符:
<span style="font-size:18px;">html > body table + ul {margin-top:20px;}</span>
這個選擇器解釋為:選擇緊接在 table 元素後出現的所有兄弟 ul 元素,該 table 元素包含在一個 body 元素中,
body 元素本身是 html 元素的子元素。