您现在的位置是:网站首页> 编程资料编程资料
详解CSS中的选择器优先级及样式层叠问题解决CSS优先级计算的规则css优先级计算方法(推荐)详解CSS中的选择器优先级顺序CSS z-index 层级关系优先级的概念CSS优先级的两种理解方式
2021-09-05
940人已围观
简介 CSS中的选择器是分权重的,如果不加注意则很有可能会遇到样式层叠的问题,下面我们就来详解CSS中的选择器优先级及样式层叠问题解决,需要的朋友可以参考下
一. 新手的疑问
大家经常在网页中看到类似 li#first 这样的选择器。很多新手疑问了?由于使用 id 就已经可以确定元素了,为什么前面还要加一个 li? 直接写上 #first 这样的 id 选择器就可以了。听起来说得不错,简单测试一下也没有问题。
可是,我们经常看到带有元素名称的选择器,例如,在微软的项目模板中就有大量的带有元素名称的选择器,如果没有用的话,为什么要这样写呢?哈哈哈,这么写是有原因的,下面就带大家一起看一下!
- ul#navlist
- {
- float: rightright;
- }
- ul#navlist li
- {
- display: inline;
- }
二. 问题出现了
写一个简单的菜单,使用 ul 和 li 实现,菜单项之间使用边框来实现间隔线。
html 代码如下:
- <ul id="navlist">
- <li class="first"><a href="/" id="current">Homea>li>
- <li><a href="#">Storea>li>
- <li><a href="#">ShoppingCarta>li>
- <li><a href="#">Admina>li>
- ul>
使用下面的样式表,首先通过为所有的超级链接增加一个左边框来画出间隔的虚线,然后将第一个菜单项的左边框去掉,我的第一个样式使用了 .first a。
- ul#navlist li
- {
- display: inline;
- }
- ul#navlist li a
- {
- border-left: 1px dotted #8A8575;
- padding: 10px;
- margin-top: 10px;
- color: #8A8575;
- text-decoration: none;
- float: left;
- }
- .first a
- {
- border: none;
- }
看一下效果,完全没有反应。
还有的地方说 id 选择器的级别比较高,那么将类改成 id 。
- <li id="first"><a href="/" id="current">Homea>li>
将样式表也进行相应的修改。
- #first a
- {
- border: none;
- }
可是结果呢?岿然不动!
用火狐的 firebug 看一看,被忽略了。
三. 原因
为什么我的样式被秒杀了?
网上有大量的文章,但是说法并不一致,有的说要考虑三个级别,可是也有的说需要考虑四个级别,但是总的方向大致是关于层叠的。
不如到 W3C 的网站上看一个究竟。相关的标准在 这个页面 可以看到,目前为止的 CSS 标准有三个: CSS1, CSS2, 以及 CSS3。
CSS1 是最早的标准,其中关于层叠顺序的描述在 这里,还提供了一个简单的示例进行说明。
- LI {...} /* a=0 b=0 c=1 -> specificity = 1 */
- UL LI {...} /* a=0 b=0 c=2 -> specificity = 2 */
- UL OL LI {...} /* a=0 b=0 c=3 -> specificity = 3 */
- LI.red {...} /* a=0 b=1 c=1 -> specificity = 11 */
- UL OL LI.red {...} /* a=0 b=1 c=3 -> specificity = 13 */
- #x34y {...} /* a=1 b=0 c=0 -> specificity = 100 */
在 CSS1 中将优先级分为三组,将 id 选择器作为 a 组,类选择器作为 b 组,元素名作为 c 组,每组中出现一次,计数一次,按照先 a 组进行比较,相同的情况下,使用 b 组进行比较,最后是 c 组。什么选择器的优先级别高,什么选择器提供的样式有效。比如在上面的例子中,第 5 组使用 id 的级别最高,所以,这组的样式设置生效,而其他的设置将会被忽略掉。
CSS21 标准
在 CSS2 中,又增加了关于行内说明 style 的组,所以参与比较的组成为了 4 组,其中 style 的优先级别最高。同样,在 CSS2 的标准说明中也提供了样例。
- * {} /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
- li {} /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
- li:first-line {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
- ul li {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
- ul ol+li {} /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */
- h1 + *[rel=up]{} /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
- ul ol li.red {} /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
- li.red.level {} /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */
- #x34y {} /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
- /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
"x97z" style="color: green">
在这个示例中,style 的优先级别最高,所以将会覆盖掉通过 id 进行的设置,颜色为绿色。
四. 解决问题
通过上面的分析可以看到,仅仅提供选择器并不足以能够生效,还要看选择器的优先级别,在我们的问题中,即使使用 id 来选择第一个菜单项:#first a ,包括了一个 id 和一个元素名,那么所得的优先级别为:
a=0, b=1, c=0, d=1
可是,通用的选择器是这样的:ul#navlist li a,优先级中却包括了一个 id, 还有 3 个元素名称,所以优先级别为:
a=0, b=1, c=0, d=3
所以我们的选择器没有比过通用的选择器,悲剧发生了!
知道了原因,问题也就简单了,提高我们选择器的优先级别,超过通用选择器的优先级就可以了,比如,我们可以写成这样:
ul#navlist li#first a
现在的优先级是多少呢?
a=0, b=2, c=0, d=3
在 b 组比较的时候就已经超过了,看看是否已经成功了!果然成功了,如下!
还可以加上重要性说明,也可以解决。!important 必须写在样式与分号之间,每个样式必须单独声明。这个也可以用来调整兼容性问题,IE6不识别!important;话说回来,兼容问题最好还是用hack方法解决比较好!
- #first a
- {
- border: none !important;
- }
五. 总结
通过上面的描述,不知道大家对于选择器的权重有了一定的了解没有。理解选择器的权重,可以更好的控制样式,用权重高的样式去覆盖掉那些权重低的样式!理解css的这一点,很重要!
相关内容
- 不固定宽度和高度的情况下CSS调整div居中的方法总结CSS控制div宽度最大宽度/高度和最小宽度/高度的方法CSS设置HTML元素的高度与宽度的各种情况总结兼容IE6的网页最小最大宽度和最小最大高度css写法CSS的最大高度、最小高度及宽度在IE6下没有效果问题CSS控制页面最大最小宽度和高度可兼容IE6版本的实现方法CSS min-height IE6、IE7、FF下DIV自适应高度CSS IE6奇数宽度或高度的bugcss实现一个元素高度固定宽度按比例显示效果
- Less框架中将CSS强制打包到单个文件中的技巧CSS Less框架基础教程Less里css表达式的写法示例介绍LESSCSS让CSS使用起来更加灵活成就CSS动态化less让css具有动态语言的特性学习CSS预处理器:Sass和less进行对比动态的样式表lesscss:简单学习lesscss语法LESS 让css也支持变量,运算符,include,嵌套规则LESS 让css也支持变量,运算符,include,嵌套规则等等 CSS less优化
- CSS的box-align属性控制子元素布局实例解析CSS的box model盒模型及其内的子元素布局控制使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题实例讲解CSS3中的box-flex弹性盒属性布局CSS3中box-shadow的用法介绍CSS3属性box-shadow使用指南CSS3属性box-sizing使用指南css3设置box-pack和box-align让div里面的元素垂直居中
- 基于CSS实现每列四行加载完一列后数据自动填充到下一列CSS3 Text Stroke(文本描边)和text-fill-color(文本填充色)调试工具CSS3 Animation 制作按钮鼠标滑过动画填充背景特效源码(13种)简单掌握CSS3将文字描边及填充文字颜色的方法两个div左边的固定宽度右边的自动填充的csscss 如何让背景图片拉伸填充避免重复显示CSS教程:盒模型(BOX Model)-CSS教程-网页制作-网页教学网
- CSS颜色体系学习小结(推荐)CSS3中各种颜色属性的使用教程CSS实现大小相同、颜色深浅不一的粒子旋转加载动画CSS3中currentColor关键字的妙用使用CSS3的::selection改变选中文本颜色的方法css实现兼容火狐、IE的LI奇偶行颜色交替方法CSS中对RGB颜色的使用详解CSS3中颜色线性渐变实战使用CSS3的背景渐变Text Gradient 创建文字颜色渐变可自定义进度条颜色的CSS3动画进度条源码采用CSS3实现的表面颜色可渐变3D立方体动画特效源码
- 浅谈css命名规则(新手必看)值得收藏的CSS命名规范(规则)常用的CSS命名规则 CSS命名规则和命名方法常用的 css 命名规则(推荐)CSS语义化命名方式及常用命名规则CSS书写规范、顺序和命名规则常用的CSS命名规则 web标准化设计编写CSS代码时样式的命名规则CSS 样式命名规则CSS 文件命名规则CSS的class与id常用的命名规则
- 关于css水平居中的小小探讨浅谈css处理水平居中的问题Flexbox制作CSS布局实现水平垂直居中的简单实例css水平居中的各种方法总结(推荐)浅析CSS实现水平垂直同时居中的5种思路CSS实现水平居中的4种思路简要概述css三种方法实现div在浏览器水平居中CSS水平居中总结(新手必看篇)
- 纯CSS绘制三角形箭头图案技术解析CSS绘制三角形的实现代码(border法)利用css绘制三角形的方法及拓展Html+CSS绘制三角形图标css绘制透明三角形用CSS3绘制三角形的简单方法纯CSS绘制三角形箭头效果用CSS代码绘制三角形 纯CSS绘制三角形的代码CSS中三角形的绘制与巧妙应用实例详解
- 纯CSS实现商品图片点击放大效果浅谈CSS3鼠标移入图片动态提示效果(transform)css3+伪元素实现鼠标移入时下划线向两边展开的效果纯css写的评分鼠标移入的效果附图CSS实现鼠标移入时图片的放大效果及缓慢过渡效果的示例代码
- 使用CSS的pointer-events属性实现鼠标穿透效果的神奇技巧详解CSS pointer-events属性的使用css3 pointer-events 介绍详解CSS利用pointer-events防止重复点击的方法实例css中pointer-events属性详解CSS的pointer-events属性详细介绍(作用和注意事项)css pointer-events属性实现下面元素可点击css不常见属性之pointer-events的使用方法
点击排行
本栏推荐
