文档章节

31种选择器的应用

邓含月
 邓含月
发布于 2013/11/28 01:07
字数 2701
阅读 1W
收藏 466

1. *

* { margin: 0; padding: 0; }

星号选择器用于选取页面中的所有元素,可用于快速清除所有元素的 margin 与 padding,但最好只在测试的时候使用,而不要正式用在 CSS 文件中,否则会大大加重浏览器负担。此外,星号选择器也可以给父层的所有子元素设定样式,重复一遍,尽量少用这种方式:

#container * { border: 1px solid black; }

兼容 IE6+

2. #X

#container { width: 960px; margin: auto; }

id 选择器,最常见的选择器用法之一,不可重复使用。

兼容 IE6+

3. .X

.error { color: red; }

class 选择器,也是最常见的选择器用法之一,与 id 选择器不同的是 class 选择器可同时选取多个元素,而 id 选择器只能给一个独一无二的元素设定样式。

兼容 IE6+

4. X Y

li a { text-decoration: none; }

后代选择器 (descendant selector),选取 X 元素内的所有 Y 元素,比如上面这段代码将选取 li 标签内的所有链接。

兼容 IE6+

5. X

a { color: red; } ul { margin-left: 0; }

标签选择器 (type selector),用于选取 HTML 标签 (tag)。

兼容 IE6+

6. X:visited and X:link

a:link { color: red; } a:visted { color: purple; }

:link 伪类选择器 (pseudo class selector) 用于选取所有未点击过的链接,而 :visited 则用于选取所有已访问过的链接。

兼容 IE6+

7. X + Y

ul + p { color: red; }

临近选择器 (adjacent selector),选取紧邻在 X 元素后面出现的第一个元素,比如上面这段代码将选取 ul 元素后出现的第一个元素,也就是 p 元素。

兼容性 IE6+

8. X > Y

div#container > ul { border: 1px solid black; }

在第 4 条中,后代选择器 X Y 选取父层 X 内的所有 Y 元素;子选择器 X > Y 则只选取直接出现在父层 X 内的 Y 元素。比如下面的 HTML 结构中,#container > ul 选取直接出现在 div#container 内的 ul 元素,不包含嵌套在 li 内的 ul 元素:

<div id="container"> <ul> <li> List Item <ul> <li> Child </li> </ul> </li> <li> List Item </li> <li> List Item </li> <li> List Item </li> </ul> </div>

兼容 IE6+

9. X ~ Y

ul ~ p { color: red; }

同样也是临近选择器,前面第 7 条 X + Y 选取紧邻在 X 后出现的第一个元素,而 X ~ Y 将选取 X 元素后出现的所有同级元素。上面这段代码将选取 ul 元素后出现的所有同级 p 元素,而不是像 ul + p 这样选取第一个出现的 p 元素。

兼容 IE7+

10. X[title]

a[title] { color: green; }

属性选择器 (attributes selector),根据元素使用的属性进一步缩小选取范围,上面这段代码将选取所有使用了 title 属性的链接,或者 a[title="title content"]{color:green} 再进一步缩小选取范围。

兼容 IE7+

11. X[href="foo"]

a[href="http://net.tutsplus.com"] { color: #1f6053; /* nettuts green */ }

上面这段代码将选取所有跳转到 http://net.tutsplus.com 的链接,这些链接将显示为绿色,其他链接不受影响。

只是这种方式很严格不能相差一个字符,下面将会逐一介绍更灵活的用法。

兼容 IE7+

12. X[href*="nettuts"]

a[href*="tuts"] { color: #1f6053; /* nettuts green */ }

* 表示只要属性值中包含双引号内的内容就满足选取要求,这段代码将选取跳转到 nettuts.com,net.tutsplus.com,或者 tutsplus.com 等链接。

兼容 IE7+

13. X[href^="http"]

a[href^="http"] { background: url(path/to/external/icon.png) no-repeat; padding-left: 10px; }

^ 表示只要属性值以双引号内的内容开头就满足选取要求,这段代码也常用来给页面中所有外部接设定样式。

兼容 IE7+

14. X[href$=".jpg"]

a[href$=".jpg"] { color: red; }

$ 表示只要属性值以双引号内的内容结尾就满足选取要求,这段代码将选取所有跳转到 jpg 图片的链接。

兼容 IE7+

15. X[data-*="foo"]

上面第 14 条提到了如何选取所有跳转到 jpg 图片的链接,若要选取跳转到图片的所有链接可以用下面的方法:

a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] { color: red; }

或者,先给图片链接添加 data- 属性(注:HTML5 Custom Data Attributes

<a href="path/to/image.jpg" data-filetype="image"> Image Link </a>

然后再通过属性选择器选取:

a[data-filetype="image"] { color: red; }

兼容 IE7+

16. X[foo~="bar"]

a[data-info~="external"] { color: red; } a[data-info~="image"] { border: 1px solid black; }

如果属性值中有用空格分隔的一连串属性值,~ 可以选取其中一个属性值,比如:

<a href="path/to/image.jpg" data-info="external image"> Click Me, Fool </a>

借助 ~ 选取包含 external 或者 image 属性值的元素:

/* Target data-info attr that contains the value "external" */ a[data-info~="external"] { color: red; } /* And which contain the value "image" */ a[data-info~="image"] { border: 1px solid black; }

兼容 IE7+

17. X:checked

input[type=radio]:checked { border: 1px solid black; }

:checked 伪类选择器用于选取所有标记为 checked 的元素,比如单选框 (radio button) 或复选框 (checkbox)。

兼容 IE9+

18. X:after

:before 与 :after 是两个令人兴奋的伪类选择器,几乎每天都有人发明出一些新用法,这里简单介绍一下如何用它清除浮动:

.clearfix:after { content: ""; display: block; clear: both; visibility: hidden; font-size: 0; height: 0; } .clearfix { *display: inline-block; _height: 1%; }

这种方式通过 :after 在元素后面添加一块区域,然后将其隐藏,可以弥补 overflow: hidden; 的缺陷。

根据 CSS3 选择器标准,理论上伪类选择器应该使用双冒号,但实际上浏览器也支持单冒号的形式,所以可以继续使用单冒号。

兼容 IE8+

19. X:hover

div:hover { background: #e3e3e3; }

最常用的伪类选择器,不多解释了,只是需要注意 IE6 不支持将 :hover 作用于除 a 链接外的其他元素。

a:hover { border-bottom: 1px solid black; }

另外提醒一点:border-bottom: 1px solid black; 的效果要比 text-decoration: underline; 好看一些。

兼容 IE6+ (在 IE6 中 :hover 只能作用于链接)

20. X:not(selector)

div:not(#container) { color: blue; }

:not 伪类选择器有时会起到很重要的作用,假设现在要选取除 #contaienr 外的所有 div 元素,就可以用上面的代码实现。

兼容 IE9+

21. X::pseudoElement

p::first-line { font-weight: bold; font-size: 1.2em; }

通过伪元素(使用双冒号 ::)可以给元素的某一部分设定样式,比如第一行、或者第一个字母。需要注意的是,这只对块级元素 (block level elements) 生效。

提示:伪元素 (pseudo element) 使用双冒号 ::

选取段落的第一个字母

p::first-letter { float: left; font-size: 2em; font-weight: bold; font-family: cursive; padding-right: 2px; }

这段代码将选取页面中所有 p 元素,然后再选取其中的第一个字母。

选取段落的第一行

p::first-line { font-weight: bold; font-size: 1.2em; }

与上面的例子类似,通过 ::first-line 选取页面的第一行。

为了兼容 CSS1 与 CSS2 中的伪元素(比如 :first-line, :first-letter, :before 以及 :after),浏览器接受单冒号与双冒号两种格式,但对于 CSS3 中最新引入的伪元素,必须使用双冒号。

兼容 IE6+

22. X:nth-child(n)

li:nth-child(3) { color: red; }

:nth-child(n) 用于选取 stack 中的某一个元素,只接受整数作参数(参数从 1 开始计数),如果你想选取第二个 li 元素,只需这样写 li:nth-child(2)。

也可以设定可变的参数,比如 li:nth-child(4n) 将选取第 4, 8 , 12… 个元素(4*n, n=1, n++)。

兼容 IE9+

23. X:nth-last-child(n)

li:nth-last-child(2) { color: red; }

除了正序(从上往下)选择,也可以使用 :nth-last-child(n) 倒序(从下往上)选择第几个元素,其他用法与第 22 条完全一样。

兼容 IE9+

24. X:nth-of-type(n)

ul:nth-of-type(3) { border: 1px solid black; }

:nth-of-type(n) 的作用不是选取子元素 (child element),而是选取同类元素 (type of element)。想象一下 HTML 文件中包含 5 个 ul 元素,现在要选取第三个,只需使用上面的代码,而不用再单独这个 ul 添加 id。

关于 :nth-child 与 :nth-of-type 的区别,具体请查看 CSS-Tricks 网站的解释,简单来说,如果父层内只包含一种元素(比如都是 p 元素)那两种用法是等效的,如果父层包含多种元素(比如 p 元素与同级的其他元素),需要选取第几个 p 元素时应该用 :nth-of-type。

兼容 IE9+

25. X:nth-last-of-type(n)

ul:nth-last-of-type(3) { border: 1px solid black; }

与第 24 条用法相同,倒序选取同类元素。

兼容 IE9+

26. X:first-child

ul li:first-child { border-top: none; }

选取父层内的第一个子元素。

兼容 IE7+

27. X:last-child

ul > li:last-child { color: green; }

与第 26 条用法相同,区别在于 :last-child 选取父层元素内的最后一个子元素。

:first-child 与 :last-child 通常用来清除边框 (border),比如 <ul></ul> 内每个 <li></li> 都使用了 border-top 与 border-bottom 边框,结果是,第一个元素的上方与最后一个元素的下方会是单边框效果。这种情况可以用 :first-child 与 :last-child 清除上下的边框,而不用给第一个元素添加id="first" 或者给最后一个元素添加 id="last"。

兼容 IE9+

28. X:only-child

div p:only-child { color: red; }

这个伪类选择器不常用,它可以选取包含唯一指定子元素的父层。比如上面的代码中将选取下面第一个 div 元素,而不是第二个 div 中的 p 元素。

<div><p> My paragraph here. </p></div> <div> <p> Two paragraphs total. </p> <p> Two paragraphs total. </p> </div>

兼容 IE9+

29. X:only-of-type

li:only-of-type { font-weight: bold; }

这个选择器会选取某个元素,并且这个元素在其父层内没有其他同级同类元素(不一定是唯一元素)。比如,要选取所有只包含一个 li 元素的 ul 元素该怎么做呢?如果使用 ul li 将选取所有 li 元素,应该使用 only-of-type。

兼容 IE9+

30. X:first-of-type

first-of-type 伪类可以选取某种元素的第一个同类元素。

为了更好地理解它的用法,现在思考一下如何在下面的 HTML 结构中选取 List Item 2 ?

<div> <p> My paragraph here. </p> <ul> <li> List Item 1 </li> <li> List Item 2 </li> </ul> <ul> <li> List Item 3 </li> <li> List Item 4 </li> </ul> </div>

方法一

ul:first-of-type > li:nth-child(2) { font-weight: bold; }

这段代码的意思是:首先选取第一个 ul 元素;然后选取其中的所有直接子元素,也就是 li;最后选取第二个子元素。

方法二

p + ul li:last-child { font-weight: bold; }

找到 p 元素后第一个出现的 ul 元素,然后选取其中的最后一个子元素。

方法三

ul:first-of-type li:nth-last-child(1) { font-weight: bold; }

找到第一个 ul 元素,然后从上往下选取第一个子元素。

兼容 IE9+

31. 伪类选择器叠用

有些伪类选择器或者伪元素是可以叠用的,例如:

#post p:nth-of-type(2):first-letter { float: left; margin: 0 5px 0 1em; width: 1em; height: 1em; font-size: 2em; }

© 著作权归作者所有

邓含月
粉丝 40
博文 21
码字总数 31176
作品 0
成都
私信 提问
加载中

评论(29)

ifu25
ifu25
灰常不错~
沙发迪
沙发迪
干货
郭大侠
郭大侠
好到无语,只得收藏
巫云
巫云
非常好,学习了
追梦java
追梦java
好!学习了!谢谢美女博主。。
水牛叔叔
水牛叔叔
好东西
jiangyuan
jiangyuan
不错!收藏了。
王洪旭
王洪旭
mark
zhweifcx
zhweifcx
好东西,赞一个,大部分没用过。。
拒绝诱惑
拒绝诱惑
不错,基本都列举到了
Fedora 31 稳定版发布

经过十分短暂的跳票,在 Fedora 30 发布约六个月后,该项目于今天正式发布了 Fedora 31 稳定版。尽管距离上个主要版本的发布才过去了短短的六个月,Fedora 31 依然带来了十分大的改进,例如常...

局长
2019/10/30
1.8W
40
Css样式技巧:常用的选择器和通用选择器

有效且结构良好的文档为你要应用的样式提供了一个框架。要想使用CSS将样式应用于特定的HTML少已素,需要想办法找到这个元素口在CsS中,执行这一任务的样式规则部分称为选择器。 ◇ 常用选择器...

2846613430
2016/04/15
84
0
CSS简单理解与应用

一、CSS基本概念: CSS——级联样式表(Cascading Style Sheet)简称“CSS”,通常又称为“风格样式表(Style Sheet)”,它是用来进行网页风格设计的。 CSS能够对 HMTL 中的对象的位置排版进...

白志华
2015/10/18
23
0
玩转CSS的前生今生与基础语法,选择器的使用

1.为什么需要CSS? HTML 标签原本被设计为用于定义文档内容。通过使用 、 、 这样的标签,HTML 的初衷是表达“这是标题”、“这是段落”、“这是表格”之类的信息。同时文档布局(比如字体啥颜...

牛大财有大才
03/31
0
0
转------详解CSS选择器、优先级与匹配原理

作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候。这里给大家列举一个例子: 给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起...

aiaiaiya
2015/08/20
97
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty:初识Netty

前文总结了NIO的内容,有了NIO的一些基础之后,我们就可以来看下Netty。Netty是Java领域的高性能网络传输框架,RPC的技术核心就是网络传输和序列化,所以Netty给予了RPC在网络传输领域巨大的...

北柠Java
3分钟前
13
0
2.4 String引用变量与对象

2.4 引用变量与对象 A aa; 这个语句声明一个类A的引用变量aa【我们常常称之为句柄】,而对象一般通过new创建,所以aa仅仅是一个引用变量,它不是对象。

Wannabe-
3分钟前
15
0
笔记:每周打折验收单品

我们在每周的星期一,会把上一周(上周的星期一起至星期天)所有打折单品的记录汇总到一个Excel模板(如:4月份第1周品控特采验收单品周报.xlsm),则可生成一下报告,供发送邮件周报(4月份...

tengyulong
7分钟前
7
0
从数组中找出相加之和等于某个特定值的两个数

从数组中找出相加之和等于某个特定值的两个数: 方法1,两次循环;方法二,一次循环 ''' Find out two numbers from num which add up to 'target''''def solution(nums, tar......

SVD
13分钟前
13
0
RabbitMQ学习:RabbitMQ的六种工作模式之简单和工作模式(三)

RabbitMQ的六种工作模式 首先开启虚拟机上的rabbitmq服务器 # 启动服务systemctl start rabbitmq-server 一、简单模式 RabbitMQ是一个消息中间件,你可以想象它是一个邮局。当你把信件放到...

其乐m
25分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部