css优先级的计算
优先级的计算首先是 选择器权重 的优先级计算,然后是 声明先后顺序 的优先级计算。
选择器的权重分为了三个级别,权重由大到小一次为id选择器、class选择器、元素选择器, 也就是优先计算id选择器的权重,如果相等再计算class选择器的权重,以此类推。当三个级别的权重都相等时,后面的样式声明覆盖前面的,将是最终结果。1
2
3
4
5
6
7
8
9* /* a=0 b=0 c=0 */
LI /* a=0 b=0 c=1 */
UL LI /* a=0 b=0 c=2 */
UL OL+LI /* a=0 b=0 c=3 */
H1 + *[REL=up] /* a=0 b=1 c=1 */
UL OL LI.red /* a=0 b=1 c=3 */
LI.red.level /* a=0 b=2 c=1 */
#x34y /* a=1 b=0 c=0 */
#s12:not(FOO) /* a=1 b=0 c=1 */
下面举个栗子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<div class="lizi" id="lizi">
<div class="child_lizi">栗子</div>
</div>
<style>
div{
height:30px; /*id = 0 , class = 0 , label = 1*/
}
.lizi{
height:120px; /*id=0, class=1 , label=0 */
}
.lizi .child_lizi{
height:80px; /* id = 0 , class = 2 , label = 0 */
}
div .child_lizi{
height:135px; /* id = 0 , class = 1 , label = 1*/
}
</style>
由上可知,id选择器权重相等,class选择器第三条权重最大,最终结果.lizi .child_lizi
的声明是最终值。
简洁高效的css
所谓高效的CSS就是让浏览器在查找style匹配的元素的时候尽量进行少的查找。
不要在ID选择器前使用标签名,因为ID选择器是唯一的,加上div反而增加不必要的匹配
1
2
3#DIV#divBox
/*更好写法:*/
#divBox不要再class选择器前使用标签名
尽量少使用层级关系
1
2
3divBox p .red{color:red;}
/*更好写法:*/
.red{..}使用class代替层级关系
1
2
3#divBox ul li a{display:block;}
/*更好写法:*/
.block{display:block;}
基本选择器
选择器 | 含义 |
---|---|
* | 通用元素选择器,匹配任何元素 |
E | 标签选择器,匹配所有使用E标签的元素 |
.info | class选择器,匹配所有class属性中包含info的元素 |
#footer | id选择器,匹配所有id属性等于footer的元素 |
示例:1
2
3
4
5
6* { margin:0; padding:0; }
p { font-size:2em; }
.info { background:#ff0; }
p.info { background:#ff0; }
#info { background:#ff0; }
p#info { background:#ff0; }
选择器
关系选择器
选择器 | 含义 |
---|---|
E,F | 多元素选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔 |
E F | 后代选择器,匹配所有属于E元素后代的F元素,E和F之间用空格分隔 |
E > F | 子选择器,匹配所有E元素的直接子元素F |
E + F | 相邻兄弟选择器,匹配所有紧随E元素之后的同级元素F |
E ~ F | 一般兄弟选择器, 匹配任何在E元素之后的同级F元素 |
1 | div p { color:#f00; } |
属性选择器
选择器 | 含义 |
---|---|
E[attr] | 匹配所有具有attr属性的E元素,不考虑它的值。(注意:E在此处可以省略,比如”[cheacked]”。以下同。) |
E[attr=val] | 匹配所有attr属性等于”val”的E元素 |
E[attr~=val] | 匹配所有attr属性具有多个空格分隔的值,其中一个值等于”val”的E元素 |
E[attr | =val] | 具有属性attr且属性值为val或以val-开始的任何元素E |
E[attr^=”val”] | css3属性attr的值以”val”开头的元素 |
E[attr$=”val”] | css3属性attr的值以”val”结尾的元素 |
E[attr*=”val”] | css3属性attr的值包含”val”字符串的元素 |
1 | p[title] { color:#f00; } |
伪元素
伪元素表示DOM外部的某种文档结构。在CSS2之前规范不明确的时候,伪元素和伪类都使用单冒号(:)来表示。而CSS3规范中的要求使用双冒号(::)表示伪元素,以此来区分伪元素和伪类。
为了兼容过去的写法,CSS3之前的伪元素仍然可以使用单冒号(:)来表示,浏览器是可以解析的。比如 :before 和 ::before 都可以被浏览器解析。
但是CSS3之后出现的伪元素必须用双冒号表示,不再支持单冒号的形式。
选择器 | 含义 |
---|---|
E::before | 在E元素之前插入生成的内容 |
E::after | 在E元素之后插入生成的内容 |
E::first-line | 匹配E元素的第一行 |
E::first-letter | 匹配E元素的第一个字母 |
::selection | 匹配突出显示的文本 |
::placeholder | 占位 |
1 | .cbb:before { |
结构伪类
选择器 | 含义 |
---|---|
:root | 匹配文档的根元素,对于HTML文档,就是HTML元素 |
E:nth-child(n) | 匹配其父元素的第n个子元素E,第一个编号为1 |
E:nth-last-child(n) | 匹配其父元素的倒数第n个子元素E,第一个编号为1 |
E:last-child | 匹配父元素的最后一个子元素,等同于:nth-last-child(1) |
E:only-child | 匹配父元素下唯一的子元素E,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1) |
E:nth-of-type(n) | 匹配其父元素的第n个E的同类型元素 |
E:first-of-type | 匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1) |
E:nth-last-of-type(n) | 匹配其父元素的倒数第n个E的同类型元素 |
E:last-of-type | 匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1) |
E:only-of-type | 匹配父元素下同E相同标签的唯一一个子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1) |
E:empty | 匹配一个不包含任何子元素的元素,注意,文本节点也被看作子元素 |
E:not(exception) | 匹配不符合not条件的E元素 |
1 | p:nth-child(3) { color:#f00; } |
状态伪类
选择器 | 含义 |
---|---|
:link | 未访问链接 |
:visited | 已访问链接,一般不使用 |
:hover | 鼠标悬停的状态,可用于任意元素,不限于链接 |
:active | 被激活时的状态,不仅限于链接,可用于任何具有tabindex属性的元素 |
:focus | 获得焦点时状态,不仅限于链接,可用于任何具有tabindex属性的无线 |
:enabled | 已启用的界面元素 |
:disabled | 已禁用的界面元素 |
:checked | 匹配表单中被选中的radio(单选框)或checkbox(复选框)元素 |
:required | 应用于具有必填属性required的表单控件 |
:target | 该选择器定位当前活动页面内定位点的目标元素 |
:valid: | 应用于有效元素 |
:invalid | 应用于空的必填元素,以及未能与type或pattern属性所定义的需求相匹配的元素 |
:read-only | 应用于其内容无法供用户修改的元素 |
:read-write | 应用于其内容可供用户修改的元素,比如输入框 |
:in-range | 应用于具有范围限制的元素,其中该值位于限制内;比如具有min和max属性的number和range输入框; |
:out-of-range | 与:in-range选择相反,其中该值在限制范围外 |
1 | input[type="text"]:disabled { background:#ddd; } |