1. 程式人生 > >CSS基礎學習八:派生選擇器

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 元素的子元素。