选择器Key Point
在CSS的选择器中,大家可能会觉得各种错综复杂,现在我们就一起来捋一捋其中的规则和规律。
在CSS3中关于选择器的定义为:一个选择器是由一个或者多个简单选择器通过连接符构成的。
通过上面一句话可以提取出两个关键词:“简单选择器”和“连接符”。
“简单选择器( simple selector )”在CSS3的规范中指定为:
- 类型选择器( type selector )
- 全局选择器( universal selector )
- 属性选择器( attribute selector )
- 类选择器( class selector )
- ID选择器( ID selector )
- 伪类( pseudo-class )
“连接符( Combinators )”特指下面四种符号:
- 大于符号( greater than sign )[u+003e, >]
- 加号( plus sign )[u+002b, +]
- 波浪号( tide )[u+007e, ~]和空格。
CSS3选择器 - 归总
通过CSS3的规范关于简单选择器的列表,可以看出在CSS3对简单选择器的变化主要是针对属性选择器和伪类。
属性选择器
如果说CSS2中属性选择器完成的是一个元素特定属性的选择,那么在CSS3中属性选择器则有了正则的成分在里面。在CSS3中属性选择器增加了类似正则里面“^”的开始选择符,”$”结尾选择符和“*”通配符。
E[foo^=”bar”]:以某个值开始的选择器。
这个属性选择符可以用来对选择器进行分类,比如给元素区分位置信息,选择出相似的元素。
<div>
<p data-log-position="PLUGIN_HISTORY_CLICK">PLUGIN_HISTORY_CLICK</p>
<p data-log-position="PLUGIN_HISTORY_CLICK">PLUGIN_HISTORY_CLICK</p>
<p data-log-position="BAR_HISTORY_CLICK">BAR_HISTORY_CLICK</p>
<p data-log-position="POPUP_HISTORY_CLICK">POPUP_HISTORY_CLICK</p>
</div>
See the Pen yeCkn by shawnxiao (@f2ecouple) on CodePen.
E[foo$=”bar”]:以某个值结束的选择器。
这个和正则符中的结尾有异曲同工的作用,选择出属性以某个值结束的标签。
<div>
<p data-log-position="PLUGIN_HISTORY_CLICK">PLUGIN_HISTORY_CLICK</p>
<p data-log-position="PLUGIN_HISTORY_CLICK">PLUGIN_HISTORY_CLICK</p>
<p data-log-position="BAR_HISTORY_HOVER">BAR_HISTORY_HOVER</p>
<p data-log-position="POPUP_HISTORY_CLICK">POPUP_HISTORY_CLICK</p>
</div>
See the Pen rIitH by shawnxiao (@f2ecouple) on CodePen.
E[foo*=”bar”]:属性中包含某个值的选择器。
简单来说,这个其实是一个通配符,即有就可,无需在乎位置。
See the Pen fAday by shawnxiao (@f2ecouple) on CodePen.
伪类选择器
在CSS3相关的选择器中,对伪类选择器的增加可是重中之重。
在这里我们对增加的CSS伪类选择器进行一系列的分类。
结构型伪类选择器(Structural pseudo-classes)
在CSS3中总共增加了11个结构型伪类选择器,加上CSS2中的结构型伪类选择器,一个有12个结构型伪类选择器。
虽然在CSS3的规范中没有对结构型伪类选择器再次分类,但是规范在设计时还是有所考虑的。
总体来说分为:从所处位置进行筛选(nth, first, last),对关系进行筛选(child, sibling)。然后剩下的就是排列和组合的过程了。
- 从元素关系入手: child, sibling
- chilid类型:E:nth-child(n), E:nth-last-child(n), E:first-child, E:last-child, E:only-child,
- sibling类型:E:nth-type(n), E:nth-last-type(n), E:first-of-type, E:last-of-type, E:only-of-type
- 从所处位置进行分类:nth, last, first, only
- nth: E:nth-child(n), E:nth-last-child(n), E:nth-type(n), E:nth-last-type(n)
- first: E:first-child, E:first-of-type
- last: E:last-child, E:last-of-type
- only: E:only-child, E:only-of-type
对于结构型伪类选择器中的参数 n 的计算方法可参见下表:
n | 2n - 1 | 2n + 1 | -2n + 4 | 2n |
---|---|---|---|---|
0 | - | 1 | 4 | - |
1 | 1 | 3 | 2 | 2 |
2 | 3 | 5 | - | 4 |
3 | 5 | 7 | - | 6 |
4 | 7 | 9 | - | 8 |
这里举一些比较有代表性的例子来说明结构型伪类选择器。
E:nth-child(n):选择一个父元素的第n个子元素。
li:nth-child(-2n + 4)
See the Pen kqEHv by shawnxiao (@f2ecouple) on CodePen.
li:nth-child(odd)
See the Pen GwIiE by shawnxiao (@f2ecouple) on CodePen.
E:nth-last-child(n):从最后一个开始算的第n个子元素
n的取值形式:an + b(a, b为整数), odd, even
See the Pen ixoha by shawnxiao (@f2ecouple) on CodePen.
E:only-child:该元素的父元素只有一个这样的子元素。
See the Pen tLFkw by shawnxiao (@f2ecouple) on CodePen.
E:nth-type(n): E元素,同为该类型的第n个兄弟元素。
See the Pen yIbHm by shawnxiao (@f2ecouple) on CodePen.
目标伪类选择器(Target pseudo-classes)
目标伪类选择器,可能大家一听到这个名词是不是很好理解。但是说一个场景,当有一个需求是通过链接在页面的段落间进行跳转时,大家会怎么去做?如果对跳转的效果没有过多的
要求时,相信大家首先想到的方法是,给anchor标签的herf属性设定为“#ID”,这里的ID为需要跳转到的元素的ID。其实在这里需要跳转到的那个元素就叫target。话不多说,大家直接点下面demo
中的链接,然后观察段落颜色的变化,相信会明白目标伪类选择器器的作用。
E:target
See the Pen KwGqe by shawnxiao (@f2ecouple) on CodePen.
UI元素状态伪类选择器(The UI elements states pseudo-classes)
enable 和 disabled
disabled伪类即选择元素状态为disabled的元素,这种元素通常是不能被聚焦或者激活的元素,它有diabled属性。
See the Pen LIaAd by shawnxiao (@f2ecouple) on CodePen.
checked伪类选择器
对于checkebox或者radio button一类的元素,当为选中状态时的伪类选择器。
See the Pen wBtrI by shawnxiao (@f2ecouple) on CodePen.
逻辑非伪类选择器(Negation pseudo-classes)
逻辑非伪类选择器,即:not(x)选择器,这里的x可以是任意简单选择器(Simple selector)
See the Pen djKuA by shawnxiao (@f2ecouple) on CodePen.
总结
上面是关于CSS3新增选择器的基本内容,现在反观新增的选择器,我们不难发现其实CSS更多的向一门语言靠近。
在新增的伪类选择器中我们看到了函数的身影在其中,比如not(), nth-child(), nth-type()等。