001 CSS选择器
CENSWIN 1/25/2022 CSS
不知道为什么编译出错,这篇文章我有发到掘金,那我就贴个掘金的链接吧
# CSS 选择器
css 选择器主要归纳为以下几类
id 选择器(#box) - 选择id为box的元素
类选择器(.one)- 选择类名为one的所有元素
标签选择器(div)- 选择标签为div的所有元素
后代选择器(#box div)- 选择id为box的元素内部所有的 div
子选择器(#box > .one)- 选择父节点id为box的元素
相邻同胞选择器(.one+.two)- 选择紧接在.one之后的所有.two元素
群组选择器(div,p)- 选择div、p的所有元素
伪类选择器
:link :选择未被访问的链接 :visited:选取已被访问的链接 :active:选择活动链接 :hover :鼠标指针浮动在上面的元素 :focus :选择具有焦点的 :first-child:父元素的首个子元素 // css3 :first-of-type 表示一组同级元素中其类型的第一个元素 :last-of-type 表示一组同级元素中其类型的最后一个元素 :only-of-type 表示没有同类型兄弟元素的元素 :only-child 表示没有任何兄弟的元素 :nth-child(n) 根据元素在一组同级中的位置匹配元素 :nth-last-of-type(n) 匹配给定类型的元素,基于它们在一组兄弟元素中的位置,从末尾开始计数 :last-child 表示一组兄弟元素中的最后一个元素 :root 设置HTML文档 :empty 指定空的元素 :enabled 选择可用元素 :disabled 选择被禁用元素 :checked 选择选中的元素 :not(selector) 选择与 <selector> 不匹配的所有元素1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20伪元素选择器
:first-letter :用于选取指定选择器的首字母 :first-line :选取指定选择器的首行 :before : 选择器在被选元素的内容前面插入内容 :after : 选择器在被选元素的内容后面插入内容1
2
3
4属性选择器
[attribute] 选择带有attribute属性的元素 [attribute=value] 选择所有使用attribute=value的元素 [attribute~=value] 选择attribute属性包含value的元素 [attribute|=value]:选择attribute属性以value开头的元素 // css3 [attribute*=value]:选择attribute属性值包含value的所有元素 [attribute^=value]:选择attribute属性开头为value的所有元素 [attribute$=value]:选择attribute属性结尾为value的所有元素1
2
3
4
5
6
7
8
# CSS 权重
# 权重等级
!important- 行内样式
ID选择器 (权重 100)class、属性选择器、伪类选择器 (权重 10)- 元素选择器和伪元素选择器(权重 1)
!important > 行内样式 > ID选择器 > 类选择器 | 属性选择器 | 伪类选择器 > 元素选择器 | 伪元素选择器
1
# 使用技巧
不推荐使用
!important,容易导致很多权重问题,难以定位具体问题。权重更高的!important同样会覆盖 权重低的!important, 比如:// ID 选择器会覆盖 类选择器 #box { color: red !important; } .box { color: green !important; }1
2
3
4
5
6
7即使是 行内样式 也会被
!important覆盖使用 10 个类选择器不等于可以覆盖
ID选择器样式如果两个权重不同的选择器作用在同一元素上,权重值高的css规则生效
.test #test{ } // id 100+class 10=110; .test #test span{} // id 100+class 10+span 1=111; .test #test .sonClass{} // id 100+class 10+class 10=120; //生效1
2
3如果两个相同权重的选择器作用在同一元素上则后出现的生效
#box span { color: red; } #app span { // 生效 color: green; }1
2
3
4
5
6权重相同则距离近的生效
<style type="text/css"> #box span { // html头部的style标签离元素更新故而生效 color: red; } </style>1
2
3
4
5
# 计算方法
到具体计算层面,我们先假定 A 、B、C、D 四个值,那么:
- A:是否存在内联样式
- B:ID 选择器出现的次数
- C:
class、属性选择器、伪类选择器 出现的次数 - D:元素选择器和伪元素选择器 出现的次数
举例说明:
#box > ul > li > a.nav-link
1
套用上面的算法,依次求出 A B C D 的值:
- 因为没有内联样式 ,所以 A = 0
- ID选择器总共出现了1次, B = 1
- 类选择器出现了1次, 属性选择器出现了0次,伪类选择器出现0次,所以 C = (1 + 0 + 0) = 1
- 标签选择器出现了3次, 伪元素出现了0次,所以 D = (3 + 0) = 3
上面算出的A 、 B、C、D 可以简记作:(0, 1, 1, 3)
知道了优先级是如何计算之后,就来看看比较规则:
- 从左往右依次进行比较 ,较大者优先级更高
- 如果相等,则继续往右移动一位进行比较
- 如果4位全部相等,则后面的会覆盖前面的
# 建议:
- 避免使用
!important - 利用id增加选择器权重
- 减少选择器的个数(避免层层嵌套)