Skip to content

CSS选择器 #5

@Leon68

Description

@Leon68

class 和 id 的使用场景

  • class用于选择同一类型的元素。
  • id有唯一性,一个id通常只能匹配一个元素。
  • id重在划分样式区域,可以作为样式表中的命名空间来管理样式。

注意:在html中声明多个一样的ID的元素,在css中该ID的样式,这些元素则都会生效。而在javascript中用DOM选择器只会选到第一个元素。

CSS选择器常见的有几种?

  • 基础选择器:

选择器 含义
* 通用选择器(通配符选择器)
#id id选择器
.class 类选择器
element 标签选择器
  • 组合选择器:

选择器 含义
E, F 多元素选择器,用,分隔匹配 E ,同时也匹配 F
E F 后代选择器,用空格分隔,匹配 E 元素所有的 F 后代,不论嵌套多少层
E>F 直接后代选择器,用>分隔,匹配 E 元素的直接子元素中的 F 元素,子元素的后代元素不再做选择
E+F 直接相邻选择器,用+分隔,选中 E 后直接相邻的同级 F
E~F 普通相邻选择器,用~分隔,选中 E 后所有同级 F
EF 多条件选择器,连写 id 和 class 选择器,匹配 是 E 又是 F 的元素
  • 属性选择器:

选择器 含义
E[attr] 匹配所有具有 attr 属性的 E 元素
E[attr = value] 匹配所有attr 属性值为 value 的 E 元素
E[attr ~= value] 匹配所有attr 属性值具有多个空格分隔,其中一个值为 value 的 E 元素
E[attr ^= value] 匹配所有attr 属性值以 value 开头的 E 元素
E[attr $= value] 匹配所有attr 属性值以 value 结尾的 E 元素
E[attr *= value] 匹配所有attr 属性值包含 value 子串的 E 元素
  • 伪类选择器:

选择器 含义
E:link 匹配未被点击的链接
E:visited 匹配点击过的链接
E:active 匹配当前被鼠标点下未释放的元素
E:hover 匹配鼠标悬停其上的元素
E:focus 匹配当前获得焦点的元素
E:lang(c) 匹配lang属性值等于c的元素
E:enabled 匹配表单中可用的元素
E:disabled 匹配表单中禁用的元素
E:checked 匹配表单中被选中的radio或checkbook元素
E:selection 匹配当前用户选中的元素
E:nth-child(n) 匹配其父元素的第n个子元素,第一个编号为1
E:nth-last-child(n) 匹配其父元素的倒数第n个子元素,第一个编号为1
E:nth-of-type(n) 与:nth-child()作用类似,但是仅匹配使用同种标签的元素
E:nth-last-of-type(n) 与:nth-last-child() 作用类似,但是仅匹配使用同种标签的元素
E:first-child
E:last-child 匹配父元素的最后一个子元素,等同于:nth-last-child(1)
E:first-of-type 匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1)
E:last-of-type 匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)
E:only-child 匹配父元素下仅有的一个子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1)
E:only-of-type 匹配父元素下使用同种标签的唯一一个子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty 匹配一个不包含任何子元素的元素,文本节点也被看作子元素
E:not(selector) 匹配不符合当前选择器的任何元素
  • 伪元素选择器:
选择器 含义
E::first-line 匹配E元素内容的第一行
E::first-letter 匹配E元素内容的第一个字母
E::before 在E元素之前插入生成的内容(可用于清除浮动)
E::after 在E元素之后插入生成的内容可用于清除浮动)

选择器的优先级是怎样的?对于复杂场景如何计算优先级?

选择器优先级:
1.后面使用!important(尽量不用)
2.内联样式=a
3.id选择器=b
4.类选择器、伪类选择器、属性选择器=c
5.标签选择器(元素选择器)、伪元素选择器=d
6.通配符选择器
7.浏览器自定义

复杂场景:

1.根据组合选择器按照以下规则统计各类选择器的个数:
行内样式 --> 统计为a
ID选择器 --> 统计为b
类、伪类选择器、属性选择器 --> 统计为c
标签(元素)选择器、伪元素选择器 --> 统计为d
2.先比较a值的大小,a值大的则优先级高;如果a值相等,则再比较b值的大小,b值大的优先级高;如果b值相等,则比较c值的大小,c值大的优先级高;如果c值相等,则比较d值的大小,d值大的优先级高;
3.而当优先级与多个CSS声明中任意一个声明的优先级相等的时候,CSS中最后的那个声明将会被应用到元素上。优先级是基于选择器的形式进行计算的。
注:通用选择器(universal selector)(*),组合符合(combinators) (+, >, ~, ' ') 和 否定伪类(negation pseudo-class)(:not()) 不会影响优先级(但是,在 :not() 内部声明的选择器是会影响优先级的)。参考MDN

a:link, a:hover, a:active, a:visited 的顺序是怎样的? 为什么?

顺序:
a:link
a:visited
a:hover
a:active
因为 a:visited 在链接访问过一次之后永久生效,如果放在最后会覆盖掉其他的样式,在链接访问过一次之后 a:hover 和 a:active 样式都会被覆盖,不再有本来的期望效果。
a:active必须在a:hover后否则不生效。

以下选择器分别是什么意思?

选择器 含义
#header{} id选择器,匹配id为header的元素
.header{} 类选择器,匹配class为header的元素
.header .logo{} 所有子元素选择器,匹配class为header的元素的子元素中class为 logo的元素
.header.mobile{} 多条件选择器,匹配class包含header 和mobile"的元素
.header p, .header h3{} 组合选择器,匹配class为header的元素的子元素中的p元素和h3元素。
#header .nav>li{} 组合选择器,匹配id为header的元素的子元素中class为nav的元素的一级子元素li。
#header a:hover{} 匹配id为header元素的子元素中的a元素hover状态(鼠标悬停)
#header .logo~p{} 匹配id为header元素的子元素中class为logo元素同级的p元素
#header input[type="text"]{} 匹配id为header元素的子元素中type属性为text的input元素。

列出你知道的伪类选择器

参考MDN

选择器 含义
E:link 匹配未被点击的链接
E:visited 匹配点击过的链接
E:active 匹配当前被鼠标点下未释放的元素
E:hover 匹配鼠标悬停其上的元素
E:focus 匹配当前获得焦点的元素
E:lang(c) 匹配lang属性值等于c的元素
E:enabled 匹配表单中可用的元素
E:disabled 匹配表单中禁用的元素
E:checked 匹配表单中被选中的radio或checkbook元素
E:selection 匹配当前用户选中的元素
E:nth-child(n) 匹配其父元素的第n个子元素,第一个编号为1
E:nth-last-child(n) 匹配其父元素的倒数第n个子元素,第一个编号为1
E:nth-of-type(n) 与:nth-child()作用类似,但是仅匹配使用同种标签的元素
E:nth-last-of-type(n) 与:nth-last-child() 作用类似,但是仅匹配使用同种标签的元素
E:first-child
E:last-child 匹配父元素的最后一个子元素,等同于:nth-last-child(1)
E:first-of-type 匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1)
E:last-of-type 匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)
E:only-child 匹配父元素下仅有的一个子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1)
E:only-of-type 匹配父元素下使用同种标签的唯一一个子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty 匹配一个不包含任何子元素的元素,文本节点也被看作子元素
E:not(selector) 匹配不符合当前选择器的任何元素

div:first-child、div:first-of-type、div :first-child和div :first-of-type的作用和区别 (注意空格的作用)

div:first-child匹配div父元素的第一个子元素(第一个子元素须为div才会选中)
div:first-of-type匹配div父元素的第一个div元素(可以是父元素的第n个元素)
div :first-child相当于div *:first-child匹配div子元素中的第一个元素
div :first-of-type相当于 div *:first-of-type匹配div子元素中的同类型元素的第一个元素

运行如下代码,解析下输出样式的原因。

<style>
.item1:first-child{
  color: red;
}
.item1:first-of-type{
  background: blue;
}
</style>
 <div class="ct">
   <p class="item1">aa</p>
   <h3 class="item1">bb</h3>
   <h3 class="item1">ccc</h3>
 </div>

.item1:first-child选中class="item1"的元素的父元素的第一个子元素且此元素的class=”item1“所以aa变红色
.item1:first-of-type选中class="item1"的元素的父元素的同类型元素中第一个元素的class=”item1“的子元素。(p是一个类型,h3是另一个类型)所以aa和ccc背景变蓝色。

注意:嵌套也算一个类型比如<P><span>haha</span></p>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions