【CSS】选择器优先级

1、选择器(优先级)

选择器种类:
严格来讲,选择器的种类可以分为三种:标签名选择器类选择器ID选择器
而所谓的后代选择器群组选择器只不过是对前三种选择器的扩展应用。
在标签内写入style=""的方式,应该是CSS的一种引入方式,而不是选择器,因为根本就没有用到选择器。
而一般人们将上面这几种方式结合在一起,所以就有了5种或6种选择器了。
选择器优先级:
CSS选择器效率从高到低的排序如下:
1.id选择器(#myid)
2.类选择器(.myclassname)
3.标签选择器(div,h1,p)
4.相邻选择器(h1+p)
5.子选择器(ul > li)
6.后代选择器(li a)
7.通配符选择器(*)
8.属性选择器(a[rel=“external”])
9.伪类选择器(a:hover, li:nth-child)
那么是如何计算优先级的呢:
一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。
通常我们用1表示标签名选择器的优先级,用10表示类选择器的优先级,用100表示示ID选择器的优先级。
比如说:
.polaris span {color:red;}的选择器优先级是10 + 1也就是11;而.polaris的优先级是10;浏览器自然会显示红色的字。
例如下面的优先级计算:

div.test1 .span 优先级 1+10 +10
span#xxx .songs li 优先级1+100 + 10 + 1
#xxx li 优先级 100 + 1

在这里不得不提使用在标签内引入CSS的方式来写CSS,即:

<div style="color:red">polaris</div> 

这时候的优先级是最高的。我们给它的优先级是1000.

<think>我们正在讨论CSS选择器优先级,用户希望了解其具体情况。根据之前的引用内容,我们可以总结如下: 引用[1]中给出了优先级顺序:!important > 内联选择器(行内样式)> ID选择器 > 类选择器(包括属性选择器和伪类)> 元素选择器(类型选择器)> 通配符选择器 > 继承选择器。 引用[2]列举了常见的CSS选择器类型:元素选择器、类选择器、ID选择器、伪类选择器、通用选择器(通配符)、属性选择器、关系选择器(后代、子、相邻兄弟等)。 引用[3]提到了选择器匹配规则是从右向左,以及可能引起的性能问题和优先级混乱问题。 引用[4]提到了内部样式和外部样式的优先级相同,然后按照选择器类型比较。 因此,我们需要向用户解释清楚优先级规则,并且可以结合例子说明。 回答结构: 1. 首先明确优先级顺序(从)。 2. 解释不同类型选择器的权重计算方式(通常使用权重值表示,如0,0,0,0)。 3. 通过例子说明如何计算权重并比较。 4. 注意事项(如!important、行内样式、继承等)。 5. 生成相关问题。 注意:我们需要参考引用,在适当的地方添加引用标记。 </think>### CSS 选择器优先级详解 #### 一、优先级计算规则 CSS 选择器优先级由四个权重级别决定,按从排列: | 权重级别 | 示例 | 权重值表示 | |----------------|---------------------|-----------| | **行内样式** | `style="color:red"` | `1,0,0,0` | | **ID选择器** | `#header` | `0,1,0,0` | | **类/伪类/属性** | `.btn`, `:hover` | `0,0,1,0` | | **元素/伪元素** | `div`, `::after` | `0,0,0,1` | **特殊规则**: 1. **`!important`**:最优先级(覆盖所有规则) ```css p { color: blue !important; } /* 优先级 */ ``` 2. **通配符`*`/继承样式**:最优先级(`0,0,0,0`)[^1][^2] #### 二、权重计算步骤 通过四位数模型比较优先级(从左向右逐级比较): 1. **计算每个选择器的权重值** ```css #nav .item:hover { /* 权重值:(0,1,2,0) */} /* 解析:1个ID(#nav) + 1个类(.item) + 1个伪类(:hover) */ ``` 2. **比较权重值** 优先级比较相当于比较四位数大小: ```css body #content .text { /* (0,1,1,1) */} #sidebar h2.title { /* (0,1,1,1) */} /* 权重相等时,后定义的生效 */ ``` #### 三、典型案例分析 | 选择器示例 | 权重值 | 优先级排序 | |-----------------------------|-----------|-----------| | `style="color:red"` | `1,0,0,0` | 最 | | `#header .logo:hover` | `0,1,2,0` | 第二 | | `.menu li.active` | `0,0,2,1` | 第三 | | `div ul > li` | `0,0,0,3` | 最 | **冲突解决示例**: ```html <style> p { color: blue; } /* (0,0,0,1) */ .text { color: green; } /* (0,0,1,0) */ #main p { color: red; } /* (0,1,0,1) */ </style> <p class="text" id="main">Hello</p> ``` 最终文字颜色为**红色**(ID选择器权重最)[^1][^4] #### 四、重要注意事项 1. **`!important`慎用**:破坏优先级自然规则,难维护 2. **浏览器匹配原理**:从右向左解析选择器(优化性能)[^3] ```css .box div {} /* 先匹配所有div,再筛选.box */ ``` 3. **相同权重规则**:后定义的样式覆盖先定义的 4. **外部样式 vs 内部样式**:优先级相同,按加载顺序生效[^4] #### 五、最佳实践建议 1. **避免过度嵌套**:减少权重值竞争 ```css /* 不推荐:权重(0,0,2,1) */ .nav .list .item {} /* 推荐:权重(0,0,1,0) */ .nav-item {} ``` 2. **使用类选择器代替ID**:便于复用和覆盖 3. **限制`!important`使用**:仅用于覆盖第三方库样式 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值