一、優先級就是分配給指定的 CSS 聲明的一個權重,它由匹配的選擇器中的每一種選擇器類型的數值決定。javascript
二、而當優先級與多個 CSS 聲明中任意一個聲明的優先級相等的時候,CSS 中最後的那個聲明將會被應用到元素上。css
三、當同一個元素有多個聲明的時候,優先級纔會有意義。由於每個直接做用於元素的 CSS 規則老是會接管/覆蓋(take over)該元素從祖先元素繼承而來的規則。html
四、能夠這樣來看:選擇器描述越具體越稀缺優先級越高,後面聲明的比前面聲明的選擇器優先級高(同類型的選擇器)。java
選擇器類型優化
對優先級沒有影響的(能夠理解爲優先級很是低的)ui
對優先級有影響的(下面的排序優先級依次變大)spa
h1
p
div
)::before
::after
).class1
) 和 屬性選擇器 (a[title]
img[title*=hello]
) 二者優先級相同,聲明在後面的會覆蓋前面的:hover
)#demo
)其餘影響最終結果的插件
一、內聯樣式 style="xxx"
<a style="color:red;"></a>
調試
二、!important
code
一些要注意的狀況
<head>
<style> .box1::after { content: "我是僞元素"; color: cyan; } #box { color: red; } </style>
</head>
<body>
<div id="box" class="box1" name="lxfriday">
hello div
</div>
</body>
複製代碼
結果 我是僞元素
仍然不是紅色,緣由就是 #box
描述的是 div
,而僞元素是沒法用其餘選擇器選中的。這個僞元素的樣式繼承自 div
。
二、類選擇器和屬性選擇器它們的優先級是同樣的,改變下面代碼中的屬性選擇器 [name="lxfriday"]
和類選擇器 .box1
的位置,顏色會發生變化。
<head>
<style> .box1:hover { color: cyan; } [name="lxfriday"] { color: red; } .box1 { color: pink; } </style>
</head>
<body>
<div id="box" class="box1" name="lxfriday">
hello div
</div>
</body>
複製代碼
綜上,對最終效果的影響是:!important
> 內聯樣式 style
> ID 選擇器 > 僞類選擇器 > 屬性選擇器 = class 選擇器 > 僞元素 > 元素(類型)選擇器 > 關係選擇器 > 通配符選擇器 理解優先級應該從選擇器對目標的描述準確程度,注意下面例子的效果:
!important
當在一個樣式聲明中使用一個 !important
規則時,此聲明將覆蓋任何其餘聲明。雖然,從技術上講,!important
與優先級無關,但它與最終的結果直接相關。使用 !important
是一個壞習慣,應該儘可能避免,由於這破壞了樣式表中的固有的級聯規則使得調試找bug變得更加困難了。當兩條相互衝突的帶有 !important
規則的聲明被應用到相同的元素上時,擁有更大優先級的聲明將會被採用。
不要在內聯樣式中使用 !important
,當心被噴。內聯樣式已經具備極高的優先級了,若是選擇器中添加了 !important
,能夠考慮再定義一個更精確的選擇器來覆蓋 !important
。
若是內聯樣式真的添加了 !important
,則能夠用 js 來消除(js 沒法消除 class、ID 選擇器的 !important)。
<body>
<div id="box" class="box1" style="color: red !important">
hello div
</div>
<script> document.querySelector("#box").style.color = "blue"; </script>
</body>
複製代碼
下面是一些優化的經驗:
!important
!important
!important
,別人將很難更改樣式CSS
代碼中使用 !important
一些覆蓋 !important
的辦法:
!important
的CSS規則,再給這個給選擇器更高的優先級(添加一個標籤,ID或類);或是添加同樣選擇器,把它的位置放在原有聲明的後面(總之,最後定義一條規則比勝);table td { height: 50px !important; }
.myTable td { height: 50px !important; }
#myTable td { height: 50px !important; }
複製代碼
td { height: 50px !important; }
td { height: 55px !important; } /* 應用這規則 */
複製代碼
!important
。優先級是基於選擇器的形式進行計算的。在下面的例子中,儘管選擇器 *[id="foo"]
選擇了一個ID,可是它仍是做爲一個屬性選擇器來計算自身的優先級。
<head>
<style> *#foo { color: green; } *[id="foo"] { color: purple; } </style>
</head>
<body>
<div id="foo">
hello div
</div>
</body>
複製代碼
顯示爲綠色。雖然匹配了相同的元素,可是 ID 選擇器擁有更高的優先級。因此第一條樣式聲明生效。
<head>
<style> body h1 { color: green; } html h1 { color: purple; } </style>
</head>
<body>
<h1 id="foo">
hello div
</h1>
</body>
複製代碼
顯示爲purple
。
僞類 是添加到選擇器的關鍵字,指定要選擇的元素的特殊狀態。例如,:hover
可被用於在用戶將鼠標懸停在按鈕上時改變按鈕的顏色。僞類使用 :xxx
的形式表示。常見僞類:
:link
:visited
:hover
:active
對 <a>
標籤推薦使用這個順序
link
: 連接日常的狀態visited
: 連接被訪問過以後hover
: 鼠標放到連接上的時候active
: 連接被按下的時候:first-child
:last-child
:nth-child()
:nth-last-child()
:only-child
:not()
:focus
僞元素是一個附加至選擇器末的關鍵詞,容許你對被選擇元素的特定部分修改樣式。僞元素推薦寫法爲::xx
, 常見僞元素
::before
::after
::first-line
::first-letter
::selection
歡迎關注個人公衆號 雲影sky,帶給你十足的乾貨,歡迎加羣討論。