1. 程式人生 > >css中選擇器(selector)

css中選擇器(selector)

常用選擇器

最常用的選擇器型別時型別選擇器後代選擇器。型別選擇器用來尋找特定型別的元素,比如段落或標題元素,只需指定希望特定型別的元素,比如段落或標題元素,只需要指定希望應用樣式的額元素的名稱。來興選擇器有時候也稱為元素選擇器或者簡單選擇器。

p{color : black;}
h1{font-weight:bold;}

後代選擇器可用來尋找特定元素或元素組的後代。後代選擇器由其他兩個選擇器之間的空格表示。在這個示例中。值縮排是塊引用的後代的段落元素,其他所有段落不收影響。

blockquote p {padding-left:2em}

想要尋找特定的元素,可以使用ID選擇器

類選擇器

#intro {font-size:bold}
.date-posted{color:#ccc}
<p id="intro">Happy Birthday Andy</p>
<p class="date-posted">24/3/2009</p>

偽類,有時候,我們需要根據文件結構之外的其他條件對元素應用樣式,例如表單元素或連結的狀態。這要使用偽類選擇器來完成。

a:link{color:blue};
a:visited{color:green};
a:hover,a:focus,a:active{color:red}
tr:hover
{background-color:red} input:focus{background-color:yellow}

: link和:visited稱為連結偽類,只能用於錨元素。:hover、:active和:focus稱為動態偽類,理論上可以應用於任何元素。大多數瀏覽器都支援這個功能。但是IE6只注意應用於錨鏈接的 : active和:hover,完全忽略:focus。IE7在任何元素上都支援:hover,但是忽略:active和:focusz。

通用選擇器

通用選擇器的作用就像是萬用字元,它匹配所有可用元素。

*{padding:0,margin:0}

高階選擇器

子選擇器和相鄰同胞選擇器

第一個高階選擇器是子選擇器。後代選擇器選擇一個元素的所有後代,而子選擇器值選擇元素的直接後代,即子元素。在下面的例子中,外層列表項顯示一個定製的圖示,而巢狀列表中的列表不受影響。

#nav>li{
    background:url(folder.png) no-repeat left top;
    padding-left:20px;
}
<ul id="nav">
    <li><a href="/home/">Home</a></li>
    <li>
        <a href="/Services/">Services</a>
        <ul>
            <li><a href="/service/design">Design</a></li>
            <li><a href="/service/development">Development</a></li>
            <li><a href="/service/consultancy">Consultancy</a>
        </ul>
    </li>
    <li><a href="/contact/">Contact Us</a></li>
</ul>

有時,你可能需要根據一個元素與另外一個元素的相鄰關係對應它的樣式。相鄰同胞選擇器可以同於定位同一個父元素下某個元素之後的元素。

h2 + p {
    font-size:1.4em;
    font-weight:bold;
    color:#777;
}
<h2>Peru</h2>
<p>The first  paragraph ...</p>
<p>The second paragraph...</p>

屬性選擇器

顧名思義,屬性選擇器可以根據某個屬性是否存在或者屬性的值來尋找元素,因此能夠實現某些有意思和強大的效果。

例如,當滑鼠停留在具有title屬性的元素上時,大多數瀏覽器會顯示一個工具提示。可以使用某些特性解釋某些內容(比如首字母縮拼詞和縮寫詞)的含義:

<p>The term <acronym title="self-contained underwater breathing apparatus">SCUBA</acronym> is an acronym rather than an abbrevitaion as it is pronounced as a word.</p>
arconym[title] {
    border-bottom : 1px dotted #999;
}
arconym[title]:hover,acronym[title]:focus{
    cursor : helper;
}

層疊和特殊性

即使在不太複雜的樣式表中,要尋找同一個元素可能有兩個或更多規則。CSS通過一個稱為層疊(cascade)的過程處理這種衝突。層疊給每個規則分配一個重要度。作者的樣式是由站點開發者編寫的,被認為是最重要的樣式開發表。使用者可以通過瀏覽器應用自己的樣式,這些樣式的重要度低一級。最後是瀏覽器或者使用者代理使用的預設樣式表,它們的重要度是最低的。

因此,層疊採用以下重要度次序。

標有!important的使用者樣式
標有!important的作者樣式表
作者樣式
使用者樣式
瀏覽器/使用者代理應用的樣式

然後,根據選擇器的特殊性決定規則的次序。具有更特殊選擇器的規則優於具有一般選擇器的規則。如果兩個規則的特殊性相同,那麼後定義的規則優先。

特殊性

為了計算規則的特殊性,給某種選擇器都分配一個數字值。然後,將規則的每個選擇器的值加在一起,計算出規則的特殊性。可惜特殊性的計算不是以10位基數的,而是採用一個更高的未指定的基數。這能確保非常特殊的選擇器(比如ID選擇器)不會被大量一般選擇器(比如類選擇器所超越)。但是為了簡化,如果在一個特定選擇其中的選擇器數量少於10個,可以以10位基數計算特殊性。

選擇器的特殊性分為4個成分等級:a、b、c和d。

如果樣式是行內樣式,那麼a=1
b等於ID選擇器的總數
c等於類、偽類和屬性選擇器的數量
d等於型別選擇器和偽元素選擇器的數量

選擇器 特殊性 以10位基數的特殊性
Style=”“ 1,0,0,0 1000
wrapper #content {} 0,2,0,0 200
content .datePosted {} 0,1,1,0 110
div#content {} 0,1,0,1 101
content {} 0,1,0,0 100
p.content .dateposted{} 0,0,2,1 21
p.content{} 0,0,1,1 11
div p {} 0,0,0,2 2
p {} 0,0,0,2 1

初看上去,上面的特殊性和更高的位指定的基數可能有點讓人糊塗。基本上,用style屬性編寫的規則總比其他任何規則特殊。具有ID選擇器的規則比沒有ID選擇器的規則特殊,具有類選擇的規則比只有類選擇器的規則特殊。最後,如果兩個規則的特殊性相同,那麼後定義的規則優先。

#content div#main-content h2{
    color:gray;
}
#content #main-content>h2{
    color:blue;
}
body #content div[id="main-content"] h2{
    color: green;
}
#main-content div.news-story h2{
    color:orange;
}
#main-content [class="new-story"] h2{
    color:yellow;
}
div#main-content div.news-story h2.first{
    color:red;
}
<div id="content">
    <div id="main-content">
        <h2>......</h2>
        <p>......</p>
        <div class="new-story">
            <h2 class="first">......</h2>
            <p>......</p>
        </div>
    </div>
</div>

令人吃驚的是,兩個標題都是灰色的。第一個選擇器是由兩個ID選擇器組成,因此它具有最高特殊性。後面一些選擇器看起來更負責,但是因為它們只包含一個ID,所以特殊性總是低於第一個選擇器。

在樣式表中使用特殊性

例如,如果你希望站點上大多數文字是黑色的,但介紹說明文字是灰色的,這一這樣做:

p{color:black;}
p.intro{color:grey}

對於小網站,這很好。但是,在大型站點上,你會發現例外的情況越來越多。就會過分的混亂。儘量保持一般樣式非常一般,特殊樣式儘可能特殊。

在主體上新增類或ID

一種有意思的特殊用法是在主體(body)標籤上應用類或者ID。這樣做之後,就可以根據頁面或者站點範圍內覆蓋樣式。例如,如果希望新的頁面具有特殊的佈局,那麼可以在主頁的主體元素上新增一個類名,並且使用它覆蓋樣式。

body.news{
    /*do some stuff*/
}
<body class="news">
    <p>......</p>
</body>

有時候,在特殊頁面上需要覆蓋這些樣式,比如在新聞存檔頁面上。在這種情況下,可以在主體標籤上新增ID來標識這個頁面。

body.news{
    /*do some stuff*/
}
<body>
    <p>......</p>
</body>

有時候,在特殊頁面上需要覆蓋這樣的樣式,比如在新聞存檔頁面上。在這種情況下,可以在主體標籤上新增ID來表示這個頁面。

body.news{
    /*do some stuff*/
}
body#archive{
    /* do some different stuff*/
}
<body id="archive" class="news">
    <p>......</p>
</body>

使用類標識頁面型別,使用ID表示特定頁面,就可以非常靈活地控制站點的設計和佈局。

繼承

人們常常將繼承和層疊混為一談。儘管他們初看上去有點兒相似,但是這兩個概念實際上是很不一樣的。好在,繼承是一個非常容易理解的概念。應用樣式的元素的後代會繼承樣式的某些屬性,比如顏色和字號。例如,如果將主體元素的文字顏色設定成黑色,那麼主體元素的所有後代也顯示黑色文字。對於字號,也是這樣的。如果將主體的字號設定為1.4em,那麼頁面上的所有內容都會繼承這個字號。

如果主體設定字號。你會注意到頁面上的任何標題都沒有采用這個樣式。你可能會認為標題沒有繼承文字字號。但是,實際上是瀏覽器的預設樣式表設定了標題字號。直接用於元素的任何樣式總會覆蓋繼承而來的樣式,這是因為繼承未來的樣式的特殊性為空。

繼承這一樣式非誠有用,因為它使開發人員不必在每個後代上新增相同的樣式。如果打算設定的屬性是繼承而來的屬性,那麼也可以將它應用於父元素。

規劃、組織和維護樣式表

站點越大、越複雜,圖形越豐富,CSS就越難管理。

對文件應用樣式

將外部的樣式表附加到網頁上有兩種方法。可以連結它們,也可以匯入它們:

<link href="/css/basic.css" rel="stylesheet" type="text/css">
<style type="text/css">
    <!--
    @import url("/css/advanced.css");
    -->
</style>

除了匯入到HTML文件之外,還可以從另一個樣式表中匯入樣式表。因此,你可以從HTML頁面連結基本樣式表,然後將複雜的樣式表匯入這個樣式表。

@import url(/css/layout.css);
@import url(/css/typography.css);
@import url(/css/color.css);

在CSS中添加註釋非常簡單。新增程式碼註釋是非常好的習慣。

如果CSS檔案非常長,那麼尋找特定的樣式會非常困難。一種改進的方法是在每個註釋頭中新增一個標誌。這個標誌僅僅是頭部文字前面新增一個額外字元,一般不會出現在CSS檔案中。

設計程式碼的結構

為了便於維護,最好把樣式劃分為幾大塊。顯然,常常把最一般的規則放在最前面。這包括應用於body標記的、應該由站點上所有元素繼承的樣式。接下來是可能需要的所有全域性reset樣式,然後是連結、標題和其他元素。

完成一般樣式之後,開始處理更特殊的樣式和輔助樣式。這些是在整個站點中使用的一般類,包括表單錯誤資訊等方面。然後,處理佈局和導航等結構性元素。

隨著在樣式表中的移動,我們在一層樣式上構建另一層樣式,處理的樣式越來越特殊,處理完頁面結構元素之後,我們把注意力轉到特定頁面相關的元件上。最後,在文件底部處理覆蓋和例外情況。整個文件的結構像下面這樣:

  • 一般性樣式

    • 主體樣式
    • reset樣式
    • 連結
    • 標題
    • 其他元素
  • 輔助樣式

    • 表單
    • 通知和錯誤
    • 一致的條目
  • 頁面結構

    • 標題、頁尾和導航
    • 佈局
    • 其他頁面結構元素
  • 頁面元件

    • 各個頁面

這裡使用一種風格統一的大註釋塊分隔每個部分。

/* @group general styles
----------------------------------------------------------------------------------*/

/* @group helper styles
----------------------------------------------------------------------------------*/

/* @group page structure
----------------------------------------------------------------------------------*/

/* @group page components
----------------------------------------------------------------------------------*/

/* @group overrides
----------------------------------------------------------------------------------*/

自我提示

對於負責的大型專案,在css檔案中新增臨時的註釋常常對開發有幫助。這些註釋可以提醒你在啟動前需要完成哪些工作,或者提醒你列寬度等常用值得查詢表。

刪除註釋和優化樣式表

註釋會使CSS檔案顯著增大。因此,你可能需要從樣式中去掉一些註釋。許多HTML/CSS和文字編輯器都有搜尋和替換選項,因此從程式碼中刪除註釋很容易。另外,還可以使用幾種線上CSS優化器。優化器不但能夠刪除註釋,還可以刪除空白,還可以從程式碼中去掉額外的位元組。如果要從當前使用的樣式表中刪除註釋,一定要保留帶註釋的版本。管理這個過程中最好的方法是建立一個部署指令碼,當你修改的內容在生產環境中生效時,他會自動刪除註釋。但是因為這是一種高階技術,可能只適用於很大的複雜站點。

減小檔案大小的最好方法是啟用伺服器端壓縮。如果使用Apache伺服器,那麼應該安裝mod_gzip或mod_deflate。所有現代瀏覽器都可以處理用GZIP壓縮的檔案並進行解壓。這些apache模組探測瀏覽器是否能夠處理這種檔案,如果可以,接傳送壓縮的版本。伺服器端壓縮能夠將這個HTML和CSS檔案減少80%,這就可以減少對寬頻的佔用。