1. 程式人生 > >CSS選擇器及其用法

CSS選擇器及其用法

CSS的七種選擇器

  • 元素選擇器
  • 類選擇器
  • ID選擇器
  • 屬性選擇器
  • 後代選擇器
  • 子代選擇器
  • 相鄰兄弟選擇器

一、元素選擇器

元素選擇器是CSS最常見的選擇器,也就是說,文件的元素就是最基本的選擇器。在 W3C 標準中,元素選擇器又稱為型別選擇器(typeselector)。如果設定 HTML 的樣式,選擇器通常將是某個 HTML 元素,比如 p、h1、em、a,甚至可以是 html 本身,例如:

h1{
color:red;
}

元素選擇器可通過直接修改程式碼中的選擇器,將某樣式從一個元素切換到另一個元素中,例如,上面的例子,將h1選擇器修改為p選擇器,就可以直接將h1中選擇器樣式改為段落文字p中:

p{
color:red;
}

元素選擇器是各類選擇器中最簡單的一種了,其實也沒什麼好說的,用多了就上手了。

二、類選擇器

類選擇器允許以一種獨立於文件元素的方式來指定樣式。該選擇器可以單獨使用,也可以與其他元素結合使用。要應用樣式而不考慮具體設計的元素,最常用的方法就是使用類選擇器。

提示:只有適當地標記文件後,才能使用這些選擇器,以便類選擇器正常工作,所以使用這兩種選擇器通常需要先做一些構想和計劃。

為了將類選擇器的樣式與元素關聯,必須將 class指定為一個適當的值。即可通過設定class屬性的值選擇某一個類選擇器,進而修改元素的樣式。如下面的例子中,important就是類選擇器的一個標記

<h1 class="important">
This heading is very important.
</h1>

<p class="important">
This paragraph id very important.
</p>
其語法為:
*.important{color:red}
/*加上*表示為通用匹配選擇器,加或不加效果差不多,可根據自己的興趣自己選擇*/
.important {color:red;}

注1:結合元素選擇器(即類選擇器+元素選擇器)

類選擇器可以結合元素選擇器來使用。(其樣式作用與元素選擇器中的元素,並且class屬性為類選擇器的元素),如:

p.important{color:red;}
h1.important{color:blue;}
/*選擇器現在會匹配 class 屬性包含 important 的所有 p 元素,但是其他任何型別的元素都不匹配,不論是否有此 class 屬性。選擇器 p.important 解釋為:“其 class 屬性值為 important 的所有段落”。 因為 h1 元素不是段落,這個規則的選擇器與之不匹配,因此 h1 元素不會變成紅色文字。*/

注2:CSS多類選擇器

HTML 中,一個class值中可能包含一個詞列表,各個詞之間用空格分隔。例如,如果希望將一個特定的元素同時標記為重要(important)和警告(warning),就可以寫作:

<p class="important warning">
/*important 和warning的順序無關要緊,寫成 warning important 也可以*/
This paragraph is a very important warning.
</p>

我們假設 class important的所有元素都是粗體,而 class warning的所有元素為斜體,class中同時包含 important warning 的所有元素還有一個銀色的背景 。就可以寫作:

.important{font-weight:bold;}
.warning{font-style:italic;}
.important.warning{background:silver;}

通過把兩個類選擇器連結在一起,僅可以選擇同時包含這些類名的元素(類名的順序不限)。如果一個多類選擇器包含類名列表中沒有的一個類名,匹配就會失敗。其語法可以理解為:

.類選擇器1.類選擇器2{
;宣告
}

重要事項:在 IE7 之前的版本中,不同平臺的 Internet Explorer 都不能正確地處理多類選擇器。

三、ID選擇器

ID選擇器允許以一種獨立於文件元素的方式來指定樣式。

語法

1、ID 選擇器前面有一個 # 號 - 也稱為棋盤號或井號。

請看下面的規則:

*#intro {font-weight:bold;}

#intro {font-weight:bold;}

2、ID 選擇器引用 id 屬性中的值,即需要通過設定id屬性的值來選中ID選擇器。而元素選擇器和類選擇器都是通過設定class屬性的值來設定樣式。

以下是一個實際 ID 選擇器的例子:

<p id="intro">This is a paragraph of introduction.</p>

注:類選擇器與 ID選擇器的區別

在某些方面,ID 選擇器類似於類選擇器,不過也有一些重要差別。

在類選擇器這一章中我們曾講解過,可以為任意多個元素指定類。前一章中類名important 被應用到 p 和 h1 元素,而且它還可以應用到更多元素。

1:只能在文件中使用一次

與類不同,在一個 HTML 文件中,ID 選擇器會使用一次,而且僅一次

2:不能使用 ID 詞列表

不同於類選擇器,ID 選擇器不能結合使用,因為 ID 屬性不允許有以空格分隔的詞列表。

3:ID 能包含更多含義

類似於類,可以獨立於元素來選擇 ID。有些情況下,您知道文件中會出現某個特定 ID 值,但是並不知道它會出現在哪個元素上,所以您想宣告獨立的 ID 選擇器。例如,您可能知道在一個給定的文件中會有一個 ID 值為 mostImportant 的元素。您不知道這個最重要的東西是一個段落、一個短語、一個列表項還是一個小節標題。您只知道每個文件都會有這麼一個最重要的內容,它可能在任何元素中,而且只能出現一個。如在這種情況下,可以編寫如下規則:

/*這個規則會與以下各個元素匹配(這些元素不能在同一個文件中同時出現,因為它們都有相同的 ID值)*/
#mostImportant {color:red; background:yellow;}
<h1 id="mostImportant">This is important!</h1>
<em id="mostImportant">This is important!</em>
<ul id="mostImportant">This is important!</ul>

注意,類選擇器和 ID 選擇器可能是區分大小寫的。這取決於文件的語言。HTML 和 XHTML 將類和 ID 值定義為區分大小寫,所以類和 ID 值的大小寫必須與文件中的相應值匹配。

四、屬性選擇器

可以根據元素的屬性及屬性值來選擇元素。CSS 2引入了屬性選擇器。

1、簡單屬性選擇

如果希望選擇有某個屬性的元素,而不論屬性值是什麼,可以使用簡單屬性選擇器。還可以根據多個屬性進行選擇,只需將屬性選擇器連結在一起即可,必須為屬性1+屬性2即同時擁有屬性1和2的才可以應用樣式。

*[title] {color:red;}/* 把包含標題(title)的所有元素變為紅色*/
a[href] {color:red;}/* 只對有 href 屬性的錨(a 元素)應用樣式*/
a[href][title] {color:red;}/* 將同時有 href 和 title 屬性的 HTML 超連結的文字設定為紅色*/
可以採用一些創造性的方法使用這個特性。
img[alt] {border: 5px solid red;}/* 對所有帶有 alt 屬性的影象應用樣式,提示:上面這個特例更適合用來診斷而不是設計,即用來確定影象是否確實有效。*/

2、根據具體屬性值選擇除了選擇擁有某些屬性的元素,還可以進一步縮小選擇範圍,只選擇有特定屬性值的元素。

例1,假設希望將指向 Web 伺服器上某個指定文件的超連結變成紅色,可以這樣寫:

a[href="http://www.w3school.com.cn/about_us.asp"] {color: red;}

例2,與簡單屬性選擇器類似,可以把多個屬性-值選擇器連結在一起來選擇一個文件。

a[href="http://www.w3school.com.cn/"][title="W3School"] {color: red;}
/*這會把以下標記中的同時具備超連結和title屬性的第一個文字變為紅色,但是第二個或第三個連結不受影響:*/
<a href="http://www.w3school.com.cn/" title="W3School">W3School</a>
<a href="http://www.w3school.com.cn/css/" title="CSS">CSS</a>
<a href="http://www.w3school.com.cn/html/" title="HTML">HTML</a>

【注意】屬性與屬性值必須完全匹配

請注意,這種格式要求必須與屬性值完全匹配。

如果屬性值包含用空格分隔的值列表,匹配就可能出問題。

請考慮一下的標記片段:

<p class="important warning">This paragraph is a very important warning.</p>
/*如果寫成 p[class="important"],那麼這個規則不能匹配示例標記*/

要根據具體屬性值來選擇該元素,必須這樣寫:

p[class="important warning"] {color: red;}

3、根據部分屬性值選擇

如果需要根據屬性值中的詞列表的某個詞進行選擇,則需要使用波浪號(~)。即只要定義的屬性中包含後面class定義的屬性就可以應用這個樣式。

假設您想選擇 class 屬性中包含 important 的元素,可以用下面這個選擇器做到這一點:

p[class~="important"] {color: red;}

如果忽略了波浪號,則說明需要完成完全值匹配。

注:部分值屬性選擇器與點號類名記法的區別

該選擇器等價於我們在類選擇器中討論過的點號類名記法。也就是說,p.important 和 p[class="important"] 應用到 HTML 文件時是等價的。那麼,為什麼還要有 "~=" 屬性選擇器呢?因為它能用於任何屬性,而不只是 class。

例如,可以有一個包含大量影象的文件,其中只有一部分是圖片。對此,可以使用一個基於 title 文件的部分屬性選擇器,只選擇這些圖片:

img[title~="Figure"] {border: 1px solid gray;}

這個規則會選擇 title 文字包含 "Figure" 的所有影象。沒有 title 屬性或者 title 屬性中不包含 "Figure" 的影象都不會匹配。


五、後代選擇器

後代選擇器(descendant selector)又稱為包含選擇器。後代選擇器可以選擇作為某元素後代的元素。

1、根據上下文選擇元素

我們可以定義後代選擇器來建立一些規則,使這些規則在某些文件結構中起作用,而在另外一些結構中不起作用。

舉例來說,如果您希望只對 h1 元素中的 em 元素應用樣式,可以這樣寫:

h1 em {color:red;}
<h1>This is a <em>important</em> heading</h1>/*important會變紅色*/
<p>This is a <em>important</em> paragraph.</p>/*不會變成紅色*/

當然,您也可以在 h1 中找到的每個 em 元素上放一個 class 屬性,但是顯然,後代選擇器的效率更高。

2、語法解釋

元素1 元素2 {宣告;} /*元素2只有跟隨在元素1後面才會應用該樣式,不論元素2鑲嵌層次有多深*/

在後代選擇器中,規則左邊的選擇器一端包括兩個或多個用空格分隔的選擇器。選擇器之間的空格是一種結合符(combinator)。每個空格結合符可以解釋為“... 在 ... 找到”、“... 作為 ... 的一部分”、“... 作為 ... 的後代”,但是要求必須從右向左讀選擇器。

因此,h1 em 選擇器可以解釋為 “作為 h1 元素後代的任何 em 元素”。如果要從左向右讀選擇器,可以換成以下說法:“包含 em 的所有 h1 會把以下樣式應用到該 em”。

3、具體應用

後代選擇器的功能極其強大。有了它,可以使 HTML 中不可能實現的任務成為可能。

假設有一個文件,其中有一個邊欄,還有一個主區。邊欄的背景為藍色,主區的背景為白色,這兩個區都包含連結列表。不能把所有連結都設定為藍色,因為這樣一來邊欄中的藍色連結都無法看到。

解決方法是使用後代選擇器。在這種情況下,可以為包含邊欄的 div 指定值為 sidebar 的 class 屬性,並把主區的 class 屬性值設定為 maincontent。然後編寫以下樣式:

div.sidebar {background:blue;}
div.maincontent {background:white;}
div.sidebar a:link {color:white;}
div.maincontent a:link {color:blue;}

有關後代選擇器有一個易被忽視的方面,即兩個元素之間的層次間隔可以是無限的。

例如,如果寫作 ul em,這個語法就會選擇從 ul 元素繼承的所有 em 元素,而不論 em 的巢狀層次多深。

因此,ul em 將會選擇以下標記中的所有 em 元素:

<ul>
  <li>List item 1
    <ol>
      <li>List item 1-1</li>
      <li>List item 1-2</li>
      <li>List item 1-3
        <ol>
          <li>List item 1-3-1</li>
          <li>List item <em>1-3-2</em></li>
          <li>List item 1-3-3</li>
        </ol>
      </li>
      <li>List item 1-4</li>
    </ol>
  </li>
  <li>List item 2</li>
  <li>List item 3</li>
</ul>

六、子代選擇器

與後代選擇器相比,子元素選擇器(Child selectors)只能選擇作為某元素子元素的元素。

1、選擇子元素

如果您不希望選擇任意的後代元素,而是希望縮小範圍,只選擇某個元素的子元素,請使用子元素選擇器(Child selector)。

2、語法解釋

子選擇器使用大於號(子結合符)。子結合符兩邊可以有空白符,這是可選的,有或者沒有都沒關係。

例如,如果您希望選擇只作為 h1 元素子元素的 strong 元素,可以這樣寫:

/*如果從右向左讀,選擇器 h1 > strong 可以解釋為“選擇作為 h1 元素子元素的所有strong元素*/
h1 > strong {color:red;}
<h1>This is <strong>very</strong> <strong>very</strong> important.</h1>/*兩個strong元素變為紅色*/
<h1>This is <em>really <strong>very</strong></em> important.</h1>/*不變紅色,不受影響*/

3、結合後代選擇器和子選擇器

請看下面這個選擇器:

table.company td > p
/*會選擇作為 td 元素子元素的所有 p 元素,這個 td 元素本身從 table 元素繼承,該 table 元素有一個包含 company 的 class 屬性。*/

七、css相鄰兄弟選擇器

相鄰兄弟選擇器(Adjacent sibling selector)可選擇緊接在另一元素後的元素,且二者有相同父元素。

如果需要選擇緊接在另一個元素後的元素,而且二者有相同的父元素,可以使用相鄰兄弟選擇器(Adjacent sibling selector)。

例如,如果要增加緊接在 h1 元素後出現的段落的上邊距,可以這樣寫:

h1 + p {margin-top:50px;}/* 選擇緊接在 h1 元素後出現的段落,h1 和 p 元素擁有共同的父元素*/

語法解釋

相鄰兄弟選擇器使用了加號(+),即相鄰兄弟結合符(Adjacent sibling combinator)。

註釋:與子結合符一樣,相鄰兄弟結合符旁邊可以有空白符。

請看下面這個文件樹片段:

<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>

在上面的片段中,div 元素中包含兩個列表:一個無序列表,一個有序列表,每個列表都包含三個列表項。這兩個列表是相鄰兄弟,列表項本身也是相鄰兄弟。不過,第一個列表中的列表項與第二個列表中的列表項不是相鄰兄弟,因為這兩組列表項不屬於同一父元素(最多隻能算堂兄弟)。

請記住,用一個結合符只能選擇兩個相鄰兄弟中的第二個元素。請看下面的選擇器:

li + li {font-weight:bold;}
上面這個選擇器只會把列表中的第二個和第三個列表項變為粗體。第一個列表項不受影響。

結合其他選擇器

相鄰兄弟結合符還可以結合其他結合符:

html > body table + ul {margin-top:20px;}
/* 選擇緊接在 table 元素後出現的所有兄弟 ul 元素,該 table 元素包含在一個 body 元素中,body 元素本身是 html 元素的子元素*/