CSS教程:1.4 複合選擇器
上一節介紹了3種基本的選擇器,以這3種基本選擇器為基礎,通過組合,還可以產生更多種類的選擇器,實現更強、更方便的選擇功能,複合選擇器就是基本選擇器通過不同的連線方式構成的。
複合選擇器就是兩個或多個基本選擇器,通過不同方式連線而成的選擇器。
一、“交集”選擇器
“交集”複合選擇器由兩個選擇器直接連線構成,其結果是選中二者各自元素範圍的交集。其中第一個必須是標記選擇器,第二個必須是類別選擇器或者ID選擇器。這兩個選擇器之間不能有空格,必須連續書寫,形式如下示例所示。
這種方式構成的選擇器,將選中同時滿足前後二者定義的元素,也就是前者所定義的標記型別,並且指定了後者的類別或者id的元素,因此被稱為“交集”選擇器。
例如,聲明瞭p、.spccial、p.special這3種選擇器,它們的選擇範圍如下示例所示。
下面舉一個實際案例,示例檔案位於網頁學習網CSS教程資源中“第1章\09.htm”。
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>選擇器.class</title>
- <
- p{ /* 標記選擇器 */
- color:blue;
- }
- p.special{ /* 標記.類別選擇器 */
- color:red; /* 紅色 */
- }
- .special{ /* 類別選擇器 */
- color:green;
- }
- </style>
- </head>
- <body>
- <p>普通段落文字</p>
- <h3>普通標題文字</h3>
- <pclass
- <h3class="special">指定了.special類別的標題文字</h3>
- </body>
- </html>
上面的程式碼中定義了<p>標記的樣式,也定義“.special”類別的樣式,此外還單獨定義了p.special.用於特殊的控制.而在這個p.special中定義的風格樣式僅僅適用於<p class="special">標記,而不會影響使用了.special的其他標記,顯示效果如圖1所示。
圖1 標記.類別選擇器示例
二、“並集”選擇器
與交集選擇器相對應,還有一種“並集”選擇器,它的結果是同時選中各個基本選擇器所選擇的範圍。任何形式的選擇器(包括標記選擇器、class類別選擇器、ID選擇器等)都可以作為並集選擇器的一部分。
並集選擇器是多個選擇器通過逗號連線而成的.在宣告各種CSS選擇器時,如果某些選擇器的風格是完全相同的,或者部分相同,這時便可以利用並集選擇器同時宣告風格相同的CSS選擇器。其效果如下示例所示。
下面舉一個實際案例,示例檔案位於網頁學習網CSS教程資源中“第1章\10.htm”。
- <html>
- <head>
- <title>並集選擇器</title>
- <styletype="text/css">
- h1, h2, h3, h4, h5, p{ /*並集選擇器*/
- color:purple; /* 文字顏色 */
- font-size:15px; /* 字型大小 */
- }
- h2.special, .special, #one{ /* 集體宣告 */
- text-decoration:underline; /* 下劃線 */
- }
- </style>
- </head>
- <body>
- <h1>示例文字h1</h1>
- <h2class="special">示例文字h2</h2>
- <h3>示例文字h3</h3>
- <h4>示例文字h4</h4>
- <h5>示例文字h5</h5>
- <p>示例文字p1</p>
- <pclass="special">示例文字p2</p>
- <pid="one">示例文字p3</p>
- </body>
- </html>
其顯示效果如圖2所示,可以看到所有行的顏色都是紫色,而且字型大小均為15px。這種集體宣告的效果與單獨宣告的效果完全相同,h2.special、.special和#one的宣告並不影響前一個集體宣告,第2行和最後兩行在紫色和大小為15px的前提下使用了下劃線進行突出。
圖2 集體宣告
另外,對於實際網站中的一些頁面,例如彈出的小對話方塊和上傳附件的小視窗等,希望這些頁面中所有的標記都使用同一種CSS樣式,但又不希望逐個來宣告的情況,可以利用全域性選擇器“*”,如下例所示,示洌檔案位於網頁學習網CSS教程資源中“第1章\11.htm”。
- <html>
- <head>
- <title>全域性宣告</title>
- <styletype="text/css">
- *{ /* 全域性宣告 */
- color:purple; /* 文字顏色 */
- font-size:15px; /* 字型大小 */
- }
- h2.special, .special, #one{ /* 集體宣告 */
- text-decoration:underline; /* 下劃線 */
- }
- </style>
- </head>
- <body>
- <h1>全域性宣告h1</h1>
- <h2class="special">全域性宣告h2</h2>
- <h3>全域性宣告h3</h3>
- <h4>全域性宣告h4</h4>
- <h5>全域性宣告h5</h5>
- <p>全域性宣告p1</p>
- <pclass="special">全域性宣告p2</p>
- <pid="one">全域性宣告p3</p>
- </body>
- </html>
其效果和圖2類似,與前面案例的效果完全相同,程式碼卻大大縮減了。WANGYEXX.COM
三、後代選擇器
在CSS選擇器中,還可以通過巢狀的方式,對特殊位置的HTML標記進行宣告,例如當<p>與</p>之間包含<span></span>標記時,就可以使用後代選擇器進行相應的控制。後代選擇器的寫法就是把外層的標記寫在前面,內層的標記寫在後面,之間用空格分隔。當標記發生巢狀時,內層的標記就成為外層標記的後代。
例如,假設有下面的程式碼:
- <p>這是最外層的文字,<span>這是中間層的文字,<b>這是最內層的文字,</b></span></p>
最外層是<p>標記,裡面嵌套了<span>標記,<span>標記中又嵌套了<b>標記,則稱span是p的子元素,b是span的子元素。
下面舉一個完整的例子,具體程式碼如下所示,示洌檔案位於CSS教程資源中“第1章\12.htm”。
- <html>
- <head>
- <title>後代選擇器</title>
- <styletype="text/css">
- p span{ /* 巢狀宣告 */
- color:red; /* 顏色 */
- }
- span{
- color:blue; /* 顏色 */
- }
- </style>
- </head>
- <body>
- <p>巢狀使<span>用CSS</span>標記的方法</p>
- 巢狀之外的<span>標記</span>不生效
- </body>
- </html>
通過將span選擇器巢狀在p選擇器中進行宣告,顯示效果只適用於<p>和</p>之間的<span>標記,而其外的<span>標記並不產生任何效果,如圖3所示,只有第1行中<span>和</span>之間的文字變成了紅色,而第2行文字中<span>和</span>之間的文字的顏色則是按照第2條CSS樣式規則設定的,即為藍色。
圖3 巢狀選擇器
後代選擇器的使用非常廣泛,不僅標記選擇器可以以這種方式組合,類別選擇器和ID選擇器都可以進行巢狀。下面是一些典型的語句:
- .special i{ /* 使用了屬性special的標記裡面的包含的i *//
- color:red;
- }
- #one li{ /* ID為one的標記裡面包含的<li> */
- color:green;
- }
- td.top .top1 strong{ /* 多層巢狀,同樣使用 */
- color:blue;
- }
上面的第3行使用了3層巢狀,實際上更多層的巢狀在語法上都是允許的。上面的這個3層巢狀表示的就是使用了.top類別的<td>標記中包含的.top1類別的標記,其中又包含了<strong>標記,一種可能的相對成的HTML為:
- <tdclass="top">
- <p>
- 其他內容<strong>CSS控制內容</strong>其他內容
- </p>
- </td>
經驗:選擇器的巢狀在CSS的縮寫中可以大大減少對class和id的宣告。因此在構建頁面HTML框架時通常只給外層標記(父標記)定義class或者id,內層標記(子標記)能通過巢狀表示的則利用巢狀的方式,而不需要再定義新的class或者專用id。只有當子標記無法利用此規則時,才單獨進行宣告,倒如一個<ul>標記中包含多個<li>標記,而需要對其中某個<li>單獨設定CSS樣式時才賦給該<li>一個單獨id或者類別,而其他<li>同樣採用“ul li{…}”的巢狀方式來設定。
需要注意的是,後代選擇器產生的影響不僅限於元素的“直接後代”,而且會影響倒它的“各級後代”。
例如,有如下的HTML結構:
- <p>這是最外層的文字,<span>這是中間層的文字,<b>這是最內層的文字,</b></span></p>
如果設定瞭如下CSS樣式:
- p span{
- color:blue;
- }
那麼“這是最外層的文字”這幾個字將以黑色顯示,即沒有設定樣式的顏色;後面的“這是中間層的文字”和“這是最內層的文字”,都屬於它的後代,因此都會變成藍色。
因此在CSS 2中,規範的制定者還規定了一種複合選擇器。稱為“子選擇器”,也就是隻對直接後代有影響的選擇器,而對“孫子”以及多個層的後代不產生作用。WANGYEXX.COM
子選擇器和後代選擇的語法區別是,使用大於號連線。例如,將上面的css設定為:
- p>span{
- color:blue;
- }
而IE 6中,不支援子選擇器,僅支援後代選擇。IE 7 IE 8和Firefox都既支援後代選擇器,也支援子選擇器。