正确理解CSS规则的优先级算法
Web前端开发人员正确理解CSS规则的优先级,有助于提高CSS应用水平。我们常用的添加样式的方法有四种。
- inline style
- embeded style
- external style
- user style
inline style是丑陋的,它们穿梭在HTML文档中,与HTML元素扭成一团,给Web前端开发人员造成了许多麻烦。它们往往以这样的面目出现:
<p style="color:red;">This is a paragraph.< /p>
embeded style比inline style绅士一些,它们也寄宿在HTML文档中,但是它们不屑于与HTML元素扭成一团。它们往往在<style>元素中出现:
<style type="text/css" media="screen">
p{ color: red; }
</style>
external style是个贵族,它不愿意同HTML呆在一起,所以干脆以外部文件的形式独立存在。通常我们使用< link>元素或者@import语句将它们导入HTML。
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
我们应当尽可能使用external style,我想理由有很多,大家都知道,我也就不重复了。
还有一种user style与以上三者略有不同,如果你使用IE浏览器,那么你可以在Tools – Internet Options – General – Appearance – Accessibility – User style sheet 下找到添加user style的地方。
既然我们有如此多的添加style的方法,那么难以避免样式会产生层叠。如:
<p class="intro" style="color:red;">This is a paragraph.< /p>
我们在使用以上inline style的同时,又在我们的external style中使用了:
p{ color: yellow; }
我们甚至还在拥有 class="intro" 的 <p> 元素上应用了:
p.intro{ color: blue; }
这样我们就在同一元素的同一属性 color 上,拥有多条CSS规则指定了值 。这种情况被称为层叠(Cascading)。当层叠发生时,CSS Parser将根据优先级算法来确定最终选用的值。
优先级算法按照先后顺序考虑以下三个方面:
- CSS规则的重要性和来源
- CSS规则的特殊性
- CSS规则在文档中出现的顺序
算法过程分为四步:
1、针对某一元素的某一属性,列出所有给该属性指定值的CSS规则。如上例中,在 class="intro" 的 <p> 元素上,有三条CSS规则指定了 color 属性。
2、根据声明的重要性和来源进行优先级排序
重要性有两种:
important
normal(即非important)
在CSS规则后添加 !important 的重要性要高于没有添加的。
来源有三种:
- user agent stylesheet – 浏览器默认样式
- author stylesheet – 开发人员定义的样式
- user stylesheet – 用户在浏览器中定义样式
重要性和来源的优先级排序从低到高是:
- user agent stylesheet
- user style sheets中的normal规则
- author style sheets中的important规则
- user style sheets中的important规则
经过以上排序,如果有一条CSS规则的优先级高于其他所有竞争规则,那么算法结束,返回该最高优先级指定的值。如果有多条CSS规则具有最高优先级,那么它们将要继续竞争下去,算法将进入第3步。
3、按照特殊性(Specificity)排序
CSS将计算多条规则中指定每一规则的selector的特殊性值,该值越高,优先级越高。
特殊性值是一个由4个整数组成的一个类似数组的值:a,b,c,d,其中a的权重最高,依次类推,d的权重最低。selector特殊性值的计算方法是:
如果该规则是一条inline style,那么a = 1
如果该规则由selector指定,selector中出现的id selector的数量就是b的值
e.g.
#AA{
color:blue;
}
优先级高于
.test{
color:red;
}
如果该规则由selector指定,selector中出现的属性selector(包括class selector)或者伪类selector的数量总和就是c的值!
如果该规则由selector指定,selector中出现的元素selector或者是伪元素selector的数量总和就是d的值。
universal selector * 的特殊性值为0,0,0,0
在根据特殊性值排序时,由于a的权重最高,因此首先比较a,在a相同的情况,在比较b,依次类推。因此不论b,c,d值有多大,inline style总是具有最高的特殊性。
如果根据以上特殊性排序后,有一条CSS规则的优先级高于其他所有竞争规则,那么算法结束,返回该最高优先级指定的值。如果有多条CSS规则具有最高优先级,那么它们将要继续竞争下去,算法将进入第4步。
4、比较CSS规则在文档中出现的顺序
出现在后的总是比出现在前的具有更高的优先级,因此出现在最后的那条语句将被作为该属性的值。
- 栏目搜索>>分类导航
-
Flash幻灯
jQuery幻灯
JS幻灯
Flash相册
jQuery相册
图片特效
导航菜单
广告代码
在线客服
表单按钮
其它特效
-
HTML
CSS
JavaScript
Dreamweaver
Fireworks
设计分享
-
建站教程
网站运营
实用工具
网页模板
网页素材
- CSS酷站 网上购物 设计团队 设计博客
- 教程排行榜
- 21个令人惊叹的CSS技术(案例)展示
- 看这些用CSS3绘制的图标,你震撼了吗
- HTML5的Video标签详细说明手册
- 如何使一个DIV层居中于浏览器中?
- 加一段代码让IE6支持hover伪类效果
- IE PNG Fix—让IE6完美支持PNG透明图片的插件
- CSS Sprite(CSS精灵)的优点和使用方法
- 最新的IE6、IE7和IE8的CSS BUG汇总列表
- 深入理解CSS的inherit与auto之间区别
- 用浮动清除LI元素在IE6中底部3像素的BUG
- CSS3教程:17种用CSS实现的很酷炫的立体网...
- 解决IE6下PNG图片透明的最佳方法
- IE的几个最常见BUG及解决方案
- DIV+CSS布局两列右列宽度自适应布局的不同...
- CSS样式的postion属性absolute和fixed的区别
- CSS教程:用相对定位实现简单的图片边框阴...
- 下载排行榜
- 基于jQuery的超炫酷的3D切换JS幻灯焦点图特效代码
- 半透明立体质感的宽屏flash+xml焦点幻灯代码
- 简洁效果多图切换flash幻灯焦点图代码
- 带标题和数字导航的JS焦点幻灯特效代码
- 适合摄影网站超漂亮的宽屏flash+xml幻灯轮换代码
- 31款简单实用的CSS+JS下拉菜单脚本
- 3D立体效果金字塔环形旋转的flash+xml相册代码
- 基于jQuery实现的瀑布流布局列表特效代码
- 透明质感上下滑动带小图预览5屏JS焦点图幻...
- 超酷的3D摩天轮flash+xml相册幻灯图片代码
- 能沿多个方向滑动切换的jquery幻灯代码
- 自带多种幻灯效果支持缩略图导航的jquery画...
- 可改图片尺寸和张数的flash幻灯轮换代码
- 很好看的带缓冲效果CSS下拉菜单导航代码
- 基于jquery很有趣的360度全景图片预览特效
- 6屏幻灯上下滑动式带缩略图和文字介绍的fla...
