***css魔法堂:选择器及其优先级 -凯发k8官方网
一、前言                               
首先看看一道阿里这期网申的题目吧!
1.找出下面优先级相同的选择器
a. img.thumb:after b.[data-job="frontend"]::first-letter
c. #main::before d. [type="checkbox"]:checked e. ul#shop-list
二、回顾选择器类型                               
html片段
基本选择器
1. 元素(类型)选择器
div{color: red; }2. 类选择器
.block-end{color: #000; }3. id选择器
#content{color: blue; }4. 通用元素选择器,匹配任何元素(ie5.5不支持)
*{width: 1000px; }
组合选择器
1. 群组选择器
/** 格式* 选择器a, 选择器b{样式规则}*/ div, body{width: 1200px; }对n个选择器获取的dom元素应用同一个样式,减少重复代码。
2. 后代选择器(派生选择器)
/** 格式* 父选择器 后代选择器{样式规则}*/ body div{color: #888; }body下的所有div元素均应用上述样式。
3. 子元素选择器(ie5.5~ie6不支持)
/** 格式* 父选择器 > 子元素选择器{样式规则}*/ body > div{color: #111; }仅body的div孩子元素才应用上述样式。
4. 毗邻弟弟元素选择器(原名相邻兄弟元素选择器)(ie5.5~ie6不支持)
/** 格式* 选择器a 选择器b{样式规则}*/ #content div{color: #111; }仅div#content后紧跟着的同级div应用上述样式,若如
5. 弟弟元素选择器(原名为兄弟选择器)(ie5.5~ie6不支持)
/** 格式* 选择器a ~ 选择器b{样式规则}*/ #content ~ div{color: #222; }仅div#content后的同级div都会应用上述样式,如
属性选择器
1. 基础选择器[attr](如: div[id] )(ie5.5~ie6不支持)
匹配所有具有该属性,且符合基础选择器条件的元素。
2. 基础选择器[attr=value](如 div[id=content] )(ie5.5~ie6不支持)
匹配所有attr的属性值等于value,且符合基础选择器条件的元素。
3. 基础选择器[attr~=value](如 div[val~=content] )(ie5.5~ie6不支持)
匹配如
的元素,就是匹配属性值具有多个空格分隔的值,其中一个值等于value的元素。4. 基础选择器[attr|=value](如 div[lang|=en] )(ie5.5~ie6不支持)
匹配如
的元素,就是匹配属性值以value或value-为开头的元素。5. 基础选择器[attr^=value](如 div[id^=cont] )(ie5.5~ie6不支持)
匹配如
或的元素,就是匹配属性值以value开头的元素。6. 基础选择器[attr$=value](如 div[id$=tent] )(ie5.5~ie6不支持)
匹配如
或的元素,就是匹配属性值以value结尾的元素。7. 基础选择器[attr*=value](如 div[id*=ten] )(ie5.5~ie6不支持)
匹配如
或的元素,就是匹配属性值含value的元素。
伪类选择器
我们可将伪类选择器再细分一下,以便记忆!
结构性伪类选择器
1. e:first-child:当元素e作为其父元素下的第一个子元素时,匹配成功。(ie5.5~ie6不支持)
2. e:root:当元素e为文档的根元素(就是htmlhtmlelement元素)时,匹配成功。(ie均不支持)
3. e:nth-child(n):当元素e作为其父元素下第n个子元素时,匹配成功。n从1开始。(ie5.5~ie8不支持)
4. e:nth-last-child(n):与e:nth-child(n)效果一样,只不过是反方向遍历。n从1开始。(ie5.5~ie8不支持)
5. e:nth-of-type(n):当元素e为其父元素下同类标签的第n个时,匹配成功。n从1开始。(ie5.5~ie8不支持)
6. e:nth-last-of-type(n):与e:nth-last-of-type(n)效果一样,只不过时反方向遍历。n从1开始。(ie5.5~ie8不支持)
7. e:last-child:当e元素作为其父元素下最后一个子元素时,匹配成功。(ie5.5~ie8不支持)
8. e:first-of-type:与e:nth-of-type(1)效果一样。(ie5.5~ie8不支持)
9. e:last-of-type:与e:nth-last-of-type(1)效果一样。(ie5.5~ie8不支持)
10.e:only-child:当e元素为其父元素下的唯一一个子元素,匹配成功。(ie5.5~ie8不支持)
11.e:only-of-type:当e元素为其父元素下的唯一一个该标签类型的子元素时,匹配成功。(ie5.5~ie8不支持)
12.e:empty:当e元素下不包含任何子元素时,匹配成功。注意:文本节点也被视为子元素。(ie5.5~ie8不支持)
注意:nth-child(n)中n的合法写法如下
①.纯数字,指定位置索引,索引从1开始;
②.n,指定匹配所有位置索引,n会自动从1开始自增长,至于何时才停止就不得而知了;
③.纯数字n,如2n,指定匹配偶数位置索引的元素,n会自动从1开始自增长,至于何时才停止就不得而知了;
④.纯数字n /- 纯数字,如2n 1,指定匹配奇数位置索引的元素,n会自动从1开始自增长,至于何时才停止就不得而知了。
动态伪类选择器(e:hover,ie5.5~7只支持在a元素上应用,ie8 支持在其他元素上使用)
1. e:link:当元素e(a标签)未被点击时,匹配成功。
2. e:visited:当元素e(a标签)点击过时,匹配成功。
3. e:hover:必须在e:link、e:visited后声明才有效。当元素e(ie5.5~7时为a标签,ie8 可为其他标签)正被鼠标悬停时,匹配成功。
4. e:active:必须在e:hover后声明才有效。当鼠标已经在元素e(a标签)按下,但未释放左键时,匹配成功。
5. e:focus:当元素e(元素e必须为可以接收键盘或用户输入的元素)获得焦点时,匹配成功。(ie8的标准模式开始支持)
语言 :lang伪类选择器(ie5.5~8不支持)
1. e:lang(c):当元素的lang属性等于c时,则匹配成功。
ui元素状态伪类选择器(ie5.5~8不支持)
1. e:enabled:元素e(e为表单元素)可用时,匹配成功。
2. e:disabled:元素e(e为表单元素)不可用时,匹配成功。
3. e:checked:元素e(e为input[type=radio]或input[type=checkbox]元素)被钩选时,匹配成功。
否定伪类选择器(ie5.5~8不支持)
1. e:not(其他类型的选择器):当元素e不符合其他类型的选择器条件时,匹配成功。
e:target 伪类选择器( ie浏览器完全不支持:target伪类,另一个小问题就是opera 在使用“前进”和后退按钮时不支持该选择器)
1. e:target:当你使用锚点(片段标识符 fragment identifier)的时候,比如,http://www.smashingmagazine.com/2009/08/02/bauhaus- ninety-years-of-inspiration/#comments,这“#comments”就是一个片段标识符,你就可以使 用:target伪类来控制目标的样式。
::selection 伪类选择器(ie5.5~8不支持)
1. e::selection:被用户选区的元素部分
伪元素选择器
伪元素就是浏览器自动在匹配的匹配元素前、后增加的元素,或者是截取匹配元素内的一部分。
1. e:before(新写法e::before):用于向元素e前添加内容(ie8的标准模式开始支持)
2. e:after(新写法e::after):用于向元素e后添加内容(ie8的标准模式开始支持)
示例:
效果是: beforedivcontentafterdiv
3. e:first-line(新写法e::first-line):仅仅当元素e为块级元素时有效。用于向元素e中的文字的首行添加特殊样式。
4. e:first-letter(新写法e::first-letter):用于向元素e的首个字母添加特殊样式
5. e:input-placeholder:用于向元素e的placeholder添加特殊样式。由于未成为w3c规范,因此需要加浏览器厂商前缀,具体如下
/*for old version of ff*/ input:-moz-input-placeholder{ } input:-ms-input-placeholder{ } /*for modern browsers*/ input::-webkit-input-placeholder{ } input::-moz-input-placeholder{ }而且仅有以下属性可用:color、font-size、font-style、font-weight、letter-spacing、line-height、padding、text-align、text-decoration。
注意:
/* 由于伪元素选择器必须为最后一个选择器,因此下列css样式将失效 */ div::before div{width: 100px;height: 100px;background-color: red; }
三、选择器的优先级计分规则
优先级是决定不同选择器的相同样式规则对同一元素的生效情况,优先级高的将覆盖优先级低的样式规则。而优先级又受到样式来源和选择器特殊性的影响,下面我们一起来了解以下。
1. 来源
行内样式 > 页内样式 > 外部引用样式 > 浏览器默认样式
2. 特殊性(由四个纬度组合)
| 选择器类型 | 纬度(a,b,c,d) | 
| 行内样式 | 1,0,0,0 | 
| id选择器 | 0,1,0,0 | 
| 类选择器、属性选择器、伪类选择器 | 0,0,1,0 | 
| 元素(类型)选择器,伪元素(类型)选择器 | 0,0,0,1 | 
| 通用元素选择器、伪类:not选择器 | 0,0,0,0 | 
注意:多种选择器类型时,同位叠加即可得到总纬度。
参考:http://www.w3.org/tr/css21/cascade.html#specificity
3. 计算优先级的流程
(a). 首先根据选择器类型计算出总纬度
(b). 若纬度相同则比较来源
(c). 若前两者相同,则后面声明的优先级高。
4. 通过!important提高优先级(ie5.5~6不支持)
通过在样式规则后面添加!important关键词,可以将该样式规则提高到最高优先级。
.test{color: red !important;color: blue; }ie5.5~6下, 匹配元素的文字为blue;而其他浏览器则为蓝色;ie7 下就显示红色。
但!important不是一个优雅的办法,而且会使得样式难以调试,下面是时是使用建议:
1. 永远不要在全局css规则中使用;
2. 永远不要在自制的插件中使用;
3. 只在需要覆盖全局或外部插件的css规则(如extjs、yui插件的样式)的特定页面中才使用;
4. 首先考虑使用优先级来解决问题而不是!important.
适合使用的场景:
将行内样式提取出来时,但此时已经有一个全站样式了;
覆盖!important:
/* 宽度为200px */ e {width: 200px; !important width: 100px; } /* 宽度为300px */ e {width: 200px; importantwidth: 100px;width: 300px; important }参考:https://developer.mozilla.org/zh-cn/docs/web/css/specificity
5. 伪类 :not 选择器纬度为0,0,0,0
伪类 :not 选择器自身纬度为0,0,0,0 ,但其括号内部的选择器纬度则和上述表格一致。 div:not(.content) { width: 100px; } 优先级计算如下:
div ── 纬度 0,0,0,1
:not ── 纬度 0,0,0,0
.content ── 纬度 0,0,1,0
总纬度 ── 0,0,1,1
6. ie6中的bug
ie6中伪类 :hover 、 :active 和 :visited 选择器的纬度不是0,0,1,0,而是0,0,2,0。
// 纬度是0,0,2,1 .cls1 .cls2 a{color: red; } // ie6下的纬度是0,0,2,1 // ie7 的纬度是0,0,1,1 a:hover{color: blue; }参考:
http://www.cnblogs.com/ddshou/archive/2009/05/05/1449768.html
http://www.cnblogs.com/ddshou/archive/2009/05/05/1449770.html
四、浏览器解析选择器的顺序——key selector(关键字查询)           
就是从右向左解析选择器,这样效率就更高了。
五、一起做题木吧!
a. img.thumb:after,总纬度是0,0,1,2
b.[data-job="frontend"]::first-letter,总纬度是0,0,1,1
c. #main::before,总纬度是0,1,0,1
d. [type="checkbox"]:checked,总纬度是0,0,2,0
e. ul#shop-list,总纬度是0,1,0,1
由于该题目假定样式来源一致,因此样式优先级相同的就是c和e了。
六、参考                                 
css选择器 http://www.cnblogs.com/liontone/archive/2010/12/29/1920437.html
http://www.w3school.com.cn/cssref/css_selectors.asp
http://blog.163.com/hongshaoguoguo@126/blog/static/1804698120134491240171/
http://blog.csdn.net/stationxp/article/details/38736261
转载于:https://www.cnblogs.com/kenshinobiy/p/5038492.html
总结
以上是凯发k8官方网为你收集整理的***css魔法堂:选择器及其优先级的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
 - 下一篇: