选择器

在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。

属性知识点 :

  • 通配符选择器( * )
  • 元素选择器( element )
  • class选择器( .class )
  • id选择器 ( #id )
  • 后代选择器(E F)
  • 子元素选择器 ( E > F )
  • 相邻兄弟元素选择器( E + F )
  • 通用兄弟选择器( E 〜 F )
  • 群组选择器(selector1,...,selectorN)
  • 属性选择器 ( E[attr] )
  • 否定选择器( :not(E) )
  • 动态伪类选择器
  • 伪元素选择器
  • :nth选择器

HTML实例结构

新建以下HTML中DOM节点为例子,在 style 标签中使用以下的 CSS 命令来观察不同选择器所导致的样式变化:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>CSS Select</title>
</head>
<body>
<ul>
  <li data="attr-data">1</li>
  <li class="klass">2</li>
  <li class="klass">3</li>
  <li id="testID">4</li>
  <li><span>5</span></li>
  <li><span>6</span></li>
  <li><a href="https://www.baidu.com">百度</a></li>
</ul>
</body>
</html>

我们可以观察到浏览器的默认样式,默认的 margin 和 padding 属性。

通配符选择器( * )

通配符选择器是用来选择所有元素,也可以选择某个元素下的所有元素。在不同的浏览器下不同元素默认的内外边距都会不一一样,以下就是选择所有元素的内外边距直接设置为零。输入后会发现原本1~6数字的上下间距都消失了。

*{
    margin: 0;
    padding: 0;
}

元素选择器( element )

以下实例选择 body 元素并设置起背景为浅灰色。

body{
    background: #f1f1f1;
}

class选择器( .class )

选择 class="klass" 的所有元素。如下设置class元素的颜色为红色。

.klass{
    color: red;
}

id选择器 ( #id )

选择 id="testID" 的元素。如下设置id的元素颜色为蓝色。

#testID{
    color: blue;
}

后代选择器(E F)

选择 E 元素下的 所有 F 元素,例如以下选择,li 下 所有 span 元素 为 绿色

li span{
    color: green;
}

子元素选择器 ( E > F )

子元素选择器只能选择某元素的子元素,其中E为父元素,而F为子元素,其中E>F所表示的是选择了E元素下的所有子元素F。这和后代选择器(E F)不一样,在后代选择器中F是E的后代元素,而子元素选择器E > F,其中F仅仅是E的子元素而以。

li>span{
    color: orange;
}

相邻兄弟元素选择器( E + F )

相邻兄弟选择器可以选择紧接在另一元素后的元素,而且他们具有一个相同的父元素,换句话说,EF两元素具有一个相同的父元素,而且F元素在E元素后面,而且相邻,这样我们就可以使用相邻兄弟元素选择器来选择F元素。以下设置id为testID的下一个li元素的背景色。

#testID+li{
    background: #ccc;
}

通用兄弟选择器( E 〜 F )

通用兄弟元素选择器是CSS3新增加一种选择器,这种选择器将选择某元素后面的所有兄弟元素,他们也和相邻兄弟元素类似,需要在同一个父元素之中,换句话说,E和F元素是属于同一父元素之内,并且F元素在E元素之后,那么E ~ F 选择器将选择中所有E元素后面的F元素。以下设置id为testID的下所有li元素的背景色。

#testID~li{
    background: #ccc;
}

群组选择器(selector1,...,selectorN)

群组选择器是将具有相同样式的元素分组在一起,每个选择器之间使用逗号“,”隔开,这个逗号告诉浏览器,规则中包含多个不同的选择器。一下设置class="klass"及id="testID"的背景色。

#testID,.klass{
    background: #ccc;
}

属性选择器 ( E[attr] )

使用CSS3属性选择器,你可以只指定元素的某个属性,或者你还可以同时指定元素的某个属性和其对应的属性值。

  • E[attr]:只使用属性名,但没有确定任何属性值
  • E[attr="value"]:指定属性名,并指定了该属性的属性值
  • E[attr~="value"]:指定属性名,并且具有属性值,此属性值是一个词列表,并且以空格隔开,其中词列表中包含了一个value词,而且等号前面的“〜”不能不写
  • E[attr^="value"]:指定了属性名,并且有属性值,属性值是以value开头的
  • E[attr$="value"]:指定了属性名,并且有属性值,而且属性值是以value结束的
  • E[attr*="value"]:指定了属性名,并且有属性值,而且属值中包含了value
  • E[attr|="value"]:指定了属性名,并且属性值是value或者以“value-”开头的值(比如说zh-cn)

以下设置li下有data属性的元素的背景色:

li[data]{
    background: #ccc;
}

否定选择器( :not(E) )

选择非选择E元素的每个元素。以下是li元素中除了id为testID的元素字体大小都为12px

li:not(#testID){
    font-size: 12px;
}

动态伪类选择器

动态伪类,因为这些伪类并不存在于HTML中,而只有当用户和网站交互的时候才能体现出来,动态伪类包含两种,第一种是我们在链接中常看到的锚点伪类,如":link",":visited";另外一种被称作用户行为伪类,如“:hover”,":active"和":focus"。

  • :link 链接没有被访问时前景色为灰色
  • :visited 链接被访问过后前景色为黄色
  • :hover 鼠标悬浮在链接上时前景色为绿色
  • :active 鼠标点中激活链接那一下前景色为蓝色
  • :focus用于元素成为焦点,这个经常用在表单元素上
li a:link{
    color: blue;
}
li a:visited{
    color: blue;
}
li a:hover{
    color: red;;
}
li a:active{
    color: yellow;
}

伪元素选择器

  • ::first-line 选择元素的第一行
  • ::first-letter 选择文本块的第一个字母
  • ::before 给元素的前面插入内容
  • ::after 给元素的后面插入内容
#testID::before{
    content: 'A'
}
#testID::after{
    content: 'D'
}
#testID::first-letter{
    color: #333;
}
#testID::first-line{
    background: #f1f1f1;
}

:nth选择器

  • :first-child 选择某个元素的第一个子元素
  • :last-child 选择某个元素的最后一个子元素
  • :nth-child(n) 选择某个元素的一个或多个特定的子元素
  • :nth-last-child(n) 选择某个元素的一个或多个特定的子元素,从这个元素的最后一个子元素开始算
  • :nth-of-type(n) 选择指定的元素
  • :nth-last-of-type(n) 选择指定的元素,从元素的最后一个开始计算
  • :first-of-type 选择一个上级元素下的第一个同类子元素
  • :last-of-type 选择一个上级元素的最后一个同类子元素
  • :only-child 选择的元素是它的父元素的唯一一个了元素
  • :only-of-type 选择一个元素是它的上级元素的唯一一个相同类型的子元素
  • :empty 选择的元素里面没有任何内容

(n)可使用公式 (an + b)。描述:表示周期的长度,n 是计数器(从 0 开始),b 是偏移值。

li:first-child::after{
    content: 'first-child'
}
li:last-child::after{
    content: 'last-child'
}
li:nth-child(4){
    font-size: 12px;
}

DEMO

可以通过一下DEMO,进一步了解CSS中各类选择器

  • HTML
<div class="gird-list">
  <div class="gird-item">1</div>
  <div class="gird-item">2</div>
  <div class="gird-item">3</div>
  <div class="gird-item">4</div>
  <div class="gird-item">5</div>
  <div class="gird-item">6</div>
  <div class="gird-item">7</div>
  <div class="gird-item">8</div>
  <div class="gird-item">9</div>
</div>
  • CSS
/*定义容器大小、居中*/
.gird-list{
  margin: 100px auto 0;
  width: 600px;
  height: 600px;
  background: #f1f1f1;
  font-size: 0;
}
/*所有项目*/
.gird-item{
  display: inline-block;
  box-sizing: border-box;
  width: 200px;
  height: 200px;
  font-size: 12px;
  border-top: 1px solid #333;
  border-left: 1px solid #333;
}
/*所有以3为倍数项目*/
.gird-item:nth-child(3n){
  border-right: 1px solid #333;
}
/*从第7个开始所有项目*/
.gird-item:nth-child(n + 7){
  border-bottom: 1px solid #333;
}
/*第5个项目*/
.gird-item:nth-child(5){
  background: #666;
}
/*第1个项目*/
.gird-item:first-child{
  background: #666;
}
/*最后1个项目*/
.gird-item:last-child{
  background: #666;
}
/*第3个项目且鼠标悬浮的时候*/
.gird-item:nth-child(3):hover{
  background: #999;
}