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>