CSS权重由四个部分组成,优先级从左到右依次是:
每个部分的权重按以下方式计算:
权重值由四个部分组成,从左到右每部分的数值依次高于后面的部分。
style="color: red;"
=> 1,0,0,0#header
=> 0,1,0,0.menu
=> 0,0,1,0[type="text"]
=> 0,0,1,0:hover
=> 0,0,1,0div
=> 0,0,0,1::before
=> 0,0,0,1假设有以下选择器:
div
=> 0,0,0,1.menu
=> 0,0,1,0#header
=> 0,1,0,0div.menu
=> 0,0,1,1div#header .menu
=> 0,1,1,1a:hover
=> 0,0,2,1div a:hover
=> 0,0,2,2div > p
=> 0,0,0,2[type="text"]
=> 0,0,1,0div[type="text"]
=> 0,0,1,1div[type="text"]:hover
=> 0,0,2,1权重的比较是从左到右逐级比较的,较高位的数字决定权重的大小。例如:
div
(0,0,0,1) 和 .menu
(0,0,1,0) 比较,.menu
的权重更大。#header
(0,1,0,0) 和 .menu
(0,0,1,0) 比较,#header
的权重更大。div#header .menu
(0,1,1,1) 和 a:hover
(0,0,2,1) 比较,div#header .menu
的权重更大。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Specificity</title>
<style>
div { color: blue; } /* 权重 0,0,0,1 */
.menu { color: green; } /* 权重 0,0,1,0 */
#header { color: red; } /* 权重 0,1,0,0 */
div.menu { color: purple; } /* 权重 0,0,1,1 */
div#header .menu { color: orange; } /* 权重 0,1,1,1 */
</style>
</head>
<body>
<div id="header" class="menu">Hello World</div>
</body>
</html>
在这个例子中,div#header .menu
的权重最大,因此文本 "Hello World" 将被渲染为橙色。
除了权重,!important
声明也会影响样式的应用。带有 !important
的样式将优先于其他样式,但在比较多个 !important
时,仍然需要比较权重。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Specificity with !important</title>
<style>
div { color: blue !important; } /* 权重 0,0,0,1 + !important */
.menu { color: green; } /* 权重 0,0,1,0 */
#header { color: red; } /* 权重 0,1,0,0 */
div.menu { color: purple; } /* 权重 0,0,1,1 */
div#header .menu { color: orange; } /* 权重 0,1,1,1 */
</style>
</head>
<body>
<div id="header" class="menu">Hello World</div>
</body>
</html>
在这个例子中,尽管 div#header .menu
的权重最大,但由于 div { color: blue !important; }
带有 !important
声明,因此文本 "Hello World" 将被渲染为蓝色。
!important
声明优先于所有权重,但多个 !important
声明之间仍需比较权重。