> > CSS的優先順序

CSS的優先順序

CSS 優先權有一個固定的計算法
網路上有許多教學文章
但我覺得這個計算法有點太複雜
而且其實可以不用理會
因為優先權的邏輯性很簡單
就是指定的層級越高或是越清楚越優先

<!--
舉個例子
詳解CSS的優先權 - 網頁製作 - 藍色理想所提到的
html > body table tr[id=」totals」] td ul > li {color: maroon;}
/* 7個普通元素、一個屬性選擇符、兩個其他選擇符,結果是0,0,1,7 */
li#answer {color: navy;}
/* 一個ID選擇符,一個普通選擇符,結果是0,1,0,1 */
——後者勝出
li#answer 可以看成是直接指定某個 id
只是這個 id 在 li 這個元素中
雖然一堆子選擇符寫得很清楚
但直接指定 id 的層級比較高
當然會比較優先
根本就不需要去計算
-->

以下為 CSS 優先權的幾個簡單要點說明

頁面設定為優先

直接設置在元素內的樣式為最優先
<div class="ResetCssTest" style="width:300px;height:40px;background:#645930;">生まれ変わろうよ 人生を初期化(りせっと)しよう</div>
設置在頁面內的 CSS 為第二優先
<style type="text/css">
.ResetCssTest {
width:200px;
height:20px;
background:#645930;
}
</style>

外部載入為次

在頁面內以 @import 方式載入
<style type="text/css">
@import url("ResetCssTest.css");
</style>
在頁面內以 link 方式載入
<link type='text/css' rel='stylesheet' href='ResetCssTest.css' />
<!--
最後載入的樣式會蓋過先前載入的樣式
建議使用 link 方式載入
詳細說明請參見 不要使用@import - 網頁製作 - 藍色理想
-->

最後設定的樣式將蓋過之前設定的樣式

<style type="text/css">
.ResetCssTest {
width:300px;
height:40px;
background:#ffffcc;
width:200px;
height:20px;
background:#645930;
}
</style>
<!--
其實這個觀念也是一般使用方式最主要的優先順序
由於外部載入的樣式會放在 <head> 跟 </head> 之中
所以載入頁面時會先讀取
然後才開始讀取到頁面中的樣式
故而在大多數情況下
CSS 優先順序的邏輯可以簡化成
最後設定的樣式將蓋過之前設定的樣式
-->

!important 為最高優先

!important 的作用為強制提高優先權
照理說越後面設定的越優先
但這個範例使用了 !important
使得最前面的設定變成了最優先
用了這個的 CSS 樣式等於無敵狀態
除非遇到另一個 CSS 樣式也使用了 !important
這時就按照上面所提到的優先權邏輯再重新比較一次
<style type="text/css">
.ResetCssTest {
width:300px!important;
height:40px!important;
background:#ffffcc!important;
width:200px;
height:20px;
background:#645930;
}
</style>
<!--
有人說 IE 不支援 !important
就我測試的結果
只有 IE6 不支援
不過 IE6 這垃圾瀏覽器很多東西都不支援
我一點也不訝異
-->

id 大於 class

由於 id 具有不可重複性
而 class 則是可重複的
故 id 層級上大於 class
若一個元素同時有 id 跟 class 兩種屬性
且樣式有所衝突時
id 優先權大於 class
<style type="text/css">
#ResetCssTestID {
width:200px;
height:20px;
background:#645930;
}
.ResetCssTestClass {
width:300px;
height:40px;
background:#ffffcc;
}
</style>

<div id="ResetCssTestID" class="ResetCssTestClass">生まれ変わろうよ 人生を初期化(りせっと)しよう</div>