CSS選擇器

jopen 10年前發布 | 41K 次閱讀 CSS 前端技術

CSS是對網頁設計師可用的最強大的工具之一。使用它我們可以在幾分鐘內改變一個網站的界面,而不用改變頁面的標簽。但是盡管事實上,我們每個人也都意識到了它是有用的,CSS 選擇器遠未發揮它們的潛力,有的時候我們還趨向于使用過多的和無用的class、id、div、span等把我們的HTML搞的很凌亂。   避免讓這些“瘟疫”在你的標簽中傳播并保持其簡潔和語義化的最佳方式,就是使用更復雜的CSS選擇器,它們可以定位于指定的元素而不用使用額外的 class或id,而且通過這種方式也可以讓我們的代碼和樣式更加靈活。一、基本選擇器

</tr>

</tr>

</tr>

</tr>

</tr> </tbody> </table>

比如:

* { margin:0; padding:0; }

p { font-size:2em; }

.info { background:#ff0; }

p.info { background:#ff0; }

p.info.error { color:#900; font-weight:bold; }

p#info { background:#ff0; }



二、多元素的組合選擇器

選擇器 描述 CSS版本
E 標簽選擇器,匹配所有使用E標簽的元素  
* 通用元素選擇器,匹配任何元素  
.info class選擇器,匹配所有class屬性中包含info的元素  
#footer id選擇器,匹配所有id屬性等于footer的元素  
選擇器 描述 CSS版本
E,F 多元素選擇器,同時匹配所有E元素或F元素,E和F之間用逗號隔開
 
E F
后代元素選擇器,匹配所有屬于E元素后代的F元素,E和F之間用空格分隔  
E>F 子元素選擇器,匹配所有E元素的兒子元素F  
E+F
毗鄰元素選擇器,匹配所有緊隨E元素之后的同級元素F  
E~F 匹配任何E標簽之后的同級F標簽 3

比如:

div,p { color:#f00; }
#nav,li { display:inline; }
#nav a { font-weight:bold; }
div>strong { color:#f00; }
p+p { color:#f00; }
p~ul { color:#f00; }



1、并列選擇器(E,F,G,...)

  這類選擇器之間用逗號作分割,能匹配選擇器列出的所有標簽元素。

2、后代選擇器(E F; E>F)

  E F,標簽之間用空格隔開,表示匹配E標簽內所有F標簽,所匹配的F標簽不僅僅是E標簽的兒子,還有可能是E標簽的孫子,或者曾孫、從孫等等。

  E>F標簽匹配所有為E標簽兒子的F標簽。

3、兄弟選擇器(E+F;E~F)

  E~F選擇其中F標簽無需緊緊跟隨E標簽后面第一個,如果需要實現這樣的一個功能可以用E+F選擇器。對于IE瀏覽器來說只有IE6以上的版本才支持該選擇器。

三、屬性選擇器

選擇器 描述 CSS版本
E[attribute] 匹配所有具有attribute屬性的E元素,不考慮它的值。(注意:E在此處可以省略,比如“[cheacked]”。以下同。)  2.1
E[attribute=value] 匹配所有attribute屬性等于“value”的E元素  2.1
E[attribute~=value] 匹配所有attribute屬性具有多個空格分隔的值、其中一個值等于“value”的E元素  2.1
E[attribute|=value] 匹配這類E元素,它具有attribute屬性的就是“value”或者以“value”開始并立即跟上一個“-”字符,也就是“value-”,主要用于lang屬性,比如“en”、“en-us”、“en-gb”等等  2.1
E[attribute^=value] 匹配所有attribute屬性值是以“value”開始的E元素  3
E[attribute$=value] 匹配所有attribute屬性值包含有“value”的E元素  3
E[attribute*=value] 匹配所有attribute屬性值是以"value"結束的E元素  3

比如: 

CSS
p[title] { color:#f00; }

div[class=error] { color:#f00; }

td[headers~=col1] { color:#f00; }

p[lang|=en] { color:#f00; }

blockquote[class=quote][cite] { color:#f00; }

div[id^="nav"] { background:#ff0; }

div[id$="nav"] { background:#ff0; }


a[href*=".jpg"] {
                        background: url(jpeg.gif) no-repeat left 50%;
            padding: 2px 0 2px 20px;
           }



四、偽類選擇器

選擇器 描述 CSS版本
E:first-child 匹配父元素的第一個子元素E 2.1
E:link 匹配所有未被點擊的鏈接 2.1
E:visited 匹配所有已被點擊的鏈接 2.1
E:active 匹配鼠標已經其上按下、還沒有釋放的E元素 2.1
E:hover 匹配鼠標懸停其上的E元素 2.1
E:focus 匹配獲得當前焦點的E元素 2.1
E:lang(c) 匹配lang屬性等于c的E元素 2.1
E:enabled 匹配表單中激活的元素 3
E:disabled 匹配表單中禁用的元素 3
E:checked 匹配表單中被選中的radio或者checkbox元素 3
E::selection 匹配用戶當前選中的元素 3
E:root 匹配文檔的根元素,對于HTML文檔,就是HTML元素 3
E:nth-child(n) 匹配其父元素的第n個子元素,n從1開始計算 3
E:nth-last-child(n) 匹配其父元素的倒數第n個子元素,第一個編號為1 3
E:nth-of-type(n) 與:nth-child(n)作用類似,用作匹配使用同種標簽的第n個元素 3
E:nth-last-of-type 與:nth-last-child作用類似,用作匹配同種標簽的最后一個元素
3
E:last-child 匹配父元素的最后一個子元素,等同于E:nth-last-child(1) 3
E:first-of-type 匹配父元素下使用同種標簽的第一個元素,等同于E:nth-of-type(1) 3
E:last-of-type 匹配父元素下使用同種標簽的最后一個元素,等同于E:nth-last-of-type(1) 3
E:only-child 匹配父元素下僅有的一個子元素,等同于E:first-child:last-child或者E:nth-child(1):nth-last-child(1) 3
E:only-of-type 匹配父元素下使用相同標簽的唯一一個子元素,等同于E:first-of-type:last-of-type或者E:nth-of-type(1):nth-last-of-type(1) 3
E:empty 匹配一個不包含任何子元素的元素,注意,文本節點也被看作子元素
E:not(s) 匹配不符合當前選擇器的任何E標簽元素
E:target 匹配文檔中特定“id”點擊后的效果

  1、E:first-child

  您可以使用 :first-child 偽類來選擇元素的第一個子元素。這個特定偽類很容易遭到誤解,所以有必要舉例來說明。在下面的例子中,選擇器匹配作為任何元素的第一個子元素的 p 元素(也就是第11行的p,不是strong元素):

 

<html>
 <head>
 <style type="text/css">
  p:first-child 
  {
    color: red;
  } 
 </style>
 </head>
 <body>
 <p>123123<strong>some text</strong></p>
 <p>some text</p>
 </body>
 </html>



最常見的錯誤是認為 p:first-child 之類的選擇器會選擇 p 元素的第一個子元素。對于IE瀏覽器,必須聲明 <!DOCTYPE>,這樣 :first-child 才能在 IE6+ 中生效。還有一個問題就是,有時候會創建一個aspx文件,如下:

HTML
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default21.aspx.cs" Inherits="Default21" %>

<!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 runat="server">
    <title></title>
    <style type="text/css">
    p:first-child
    {
        background-color:Red;
    }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <p>
    123123123123123123
    </p>
    </form>
</body>
</html>



運行起來發現字體顏色并不是紅色,為什么呢?其實這個p不是第一個元素。我們可以查看一下頁面運行起來后生成的Html,這樣問題就清楚了。

HTML

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

</title>
    <style type="text/css">
    p:first-child
    {
        background-color:Red;
    }
    </style>
</head>
<body>
    <form name="form1" method="post" action="Default21.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZK7s3d9MopxNO2l9SJNVyVvw+Q5v" />
</div>

    <p>
    123123123123123123
    </p>
    </form>
</body>
</html



2、動態偽類

  所謂的動態偽類,是指它們并不存在HTML中,而是只有當用戶和網站交互的時候才會呈現。E:link, E:visited, E:hover, E:active 和 E:focus都屬于這類,前面四種又稱之錨偽類。

  在 CSS 定義中,a:hover 必須被置于 a:link 和 a:visited 之后,才是有效的。a:active 必須被置于 a:hover 之后,才是有效的。偽類名稱對大小寫不敏感。

動態偽類被所有的現代瀏覽器支持,甚至IE6。但是請注意,對于IE系列瀏覽器來說,IE6只允許:hover 偽類應用于鏈接元素(a標簽),而且只有IE8才接受應用于非a標簽的:active狀態。

CSS
a:link {color: #FF0000}    /* 未訪問的鏈接 */
a:visited {color: #00FF00}    /* 已訪問的鏈接 */
a:hover {color: #FF00FF}    /* 鼠標移動到鏈接上 */
a:active {color: #0000FF}    /* 選定的鏈接 */
input:hover {background-color: blue}    /* 只有在IE6+或者Firefox上才起作用 */
input:active {background-color: green}    /* 只有在IE8或者Firefox上才起作用 */



3、:lang偽類

  語言偽類:lang 使你有能力為不同的語言定義特殊的規則。在下面的例子中,:lang 類為屬性值為 no 的 q 元素定義引號的類型:

<html>
 <head>

 <style type="text/css">
q:lang(no)
   {
   quotes: "~" "~"
   }
 </style>

 </head>

 <body>
 <p>文字<q lang="no">段落中的引用的文字</q>文字</p>
 </body></html>



4、UI元素狀態偽類

  有些HTML元素有enable 或disabled 狀態(比如,文本輸入框)和 checked 或unchecked 狀態(單選按鈕和復選框)。這些狀態就可以使用:enabled:disabled:checked 偽類來分別定位。

input:enabled
 {
    background-color:Red;                        
 }
input:disabled
 {
    background-color:Yellow;
 }
input[type="checkbox"]:checked {
    margin-left: 15px;
 }



這類型的選擇除了IE瀏覽器不支持外,其他的瀏覽器都支持。

5、E::Selection

  目前沒有任何一款IE或Firefox 瀏覽器支持::selection 偽元素。Safari, Opera 和Chrome 均支持。

 div:selection
  {
       background-color:Green;
  }



6、結構偽類選擇器

  這類選擇器包括有E:root, E:nth-child(n), E:nth-last-child(n), E:nth-of-type(n), E:nth-last-of-type(n), E:last-child, E:first-of-type, E:last-of-type, E:only-child, E:only-of-type 和 E:empty。Internet Explorer (直到8.0版本)都不支持結構偽類。Firefox、Safari 和Opera 在其最新版本的瀏覽器支持這些選擇器。

CSS
p:nth-child(3) { color:#f00; }

p:nth-child(odd) { color:#f00; }

p:nth-child(even) { color:#f00; }

p:nth-child(3n+0) { color:#f00; }

p:nth-child(3n) { color:#f00; }

tr:nth-child(2n+11) { background:#ff0; }

tr:nth-last-child(2) { background:#ff0; }

p:last-child { background:#ff0; }

p:only-child { background:#ff0; }

p:empty { background:#ff0; }



7、否定選擇器

  否定選擇器:not(),可以讓你定位不匹配該選擇器的元素

比如,如果你需要定義表單元素中的input元素,但是又不想包括submit類型的input的時候會灰常有用——你想它們有不同的樣式,以看起來像按鈕:

input:not([type="submit"]) 
 {
    width: 200px;
    padding: 3px;
    border: 1px solid #000000;
 }
IE瀏覽器不支持這個選擇器。

8、:target選擇器

  當你使用錨點(片段標識符 fragment identifier)的時候,比如,http://www.smashingmagazine.com/2009/08/02/bauhaus- ninety-years-of-inspiration/#comments,這“#comments”就是一個片段標識符,你就可以使 用:target偽類來控制目標的樣式。

舉個例子,比如你有一個很長的使用了很多文字和h2標題的頁面,然后在頁面的頭部有一個對這些標題的索引。如果在點擊索引內的某個鏈接時,相應的標題以某種方式高亮,然后滾動到相應的位置,對讀者就會很有用。很簡單。

HTML
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

 <!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 runat="server">
    <title></title>
    <style>
    :target
    {
        background-color:red
    }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <a href="#label">Text to be displayed</a>
    <h2>123<a name="label">myanchor</a>123123123</h2>
    </form>
</body>
</html>

 IE瀏覽器完全不支持:target偽類,另一個小問題就是Opera 在使用“前進”和后退按鈕時不支持該選擇器。但是其它的各個主流瀏覽器都支持該選擇器。

五、偽元素選擇器

選擇器 描述 CSS版本
E:first-line 匹配所有E標簽內的第一行 2.1 
E:first-letter 匹配所有E標簽內的第一個字母 2.1 
E:before 在E標簽之前插入生成的內容 2.1 
E:after 在E標簽之后插入生成的內容 2.1 

1、:first-line偽元素

  "first-line" 偽元素用于向某個選擇器中的文字的首行添加特殊樣式:

 p {font-size: 12pt}
 p:first-line {color: #0000FF; font-variant: small-caps}

  <p>Some text that ends up on two or more lines</p>
  
在上面的例子中,瀏覽器顯示根據 first-line 偽元素格式化的第一行。瀏覽器是依靠瀏覽器窗口的尺寸來進行分行的。first-line 偽元素僅能被用于塊級元素。

2、:first-letter偽元素

  first-letter 偽元素用于向某個選擇器中的文本的首字母添加特殊的樣式:

 p {font-size: 12pt}
 p:first-letter {font-size: 200%; float: left}

  <p>The first words of an article.</p>

3、:before和:after偽元素

  before 偽元素可用于在某個元素之前插入某些內容。after 偽類可用于在某個元素之后插入某些內容。這兩個偽元素常常只使用content屬性,來添加一些短語或排版元素。

p:before 
 {
  content: "Before P";
 }
p:after
 {
  content: "After P.";
 }
其實還有一個用法就是用作計數:

Html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html>
 <head>
 <style type="text/css">
body {counter-reset:section;}
h1 {counter-reset:subsection;}
h1:before
 {
counter-increment:section;
content:"Section " counter(section) ". ";
 }
h2:before 
 {
counter-increment:subsection;
content:counter(section) "." counter(subsection) " ";
 }
 </style>
 </head>

 <body>

 <p><b>注釋:</b>如果已規定 !DOCTYPE,那么 Internet Explorer 8 (以及更高版本)支持 counter-increment 屬性。</p>

 <h1>HTML tutorials</h1>
 <h2>HTML Tutorial</h2>
 <h2>XHTML Tutorial</h2>
 <h2>CSS Tutorial</h2>

 <h1>Scripting tutorials</h1>
 <h2>JavaScript</h2>
 <h2>VBScript</h2>

 <h1>XML tutorials</h1>
 <h2>XML</h2>
 <h2>XSL</h2>

 </body>
 </html>



當然,Firefox支持這兩個偽元素;對于IE瀏覽器,如果已規定 !DOCTYPE,那么 IE8 (以及更高版本)才支持。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!