CSS中的样式层叠机制Cascade
CSS中的样式层叠机制Cascade
一、样式冲突
样式冲突是CSS渲染过程要解决的一个关键问题,样式冲突主要由两个原因造成:
- 元素包含了不同对象所赋予的样式:浏览器、用户、作者。其中,浏览器样式是指不对元素赋予样式时,元素所表现出来的样式,也就是浏览器赋予的元素默认样式;用户样式是指用户通过浏览器插件设定的样式,比如色弱者会对文字颜色进行修改;作者样式只是程序员所编写的CSS样式。
- 程序员经常会在CSS中对同一元素进行重复定义,这往往是因为程序员整体局部的样式编写习惯造成的,当然这是好的习惯。
二、Cascade机制
CSS设计了Cascade机制通过确定样式层叠的顺序来解决样式冲突的问题,其过程就是对所有冲突样式按照其对应的优先级进行排序,然后确定优先级最高样式为最终渲染样式。我将该排序过程归纳为三个级联的排序阶段。
Step1. 对所有冲突样式,按照设定其的对象优先级顺序进行排序;对象优先级顺序如下:
1.读者样式+!important
2.作者样式+!important
3.默认样式+!important
4.作者样式
5.读者样式
6.默认样式
Step2. 对Step1中优先级相等的作者样式(作者样式+!important优先级、作者样式优先级)再分别按照样式Specificity值从大到小进行二次排序;
Step3. 对优先级相等的样式最后按照申明时间从早到晚进行排序。
三、Specificity值的计算方式
Specificity可以看成是一个∞进制的4位数。作者样式的Specificity值由定义其的选择器决定,下表展示了各种选择器所定义的样式、HTML中的样式、继承样式的Specificity值对照表。组合选择器(E F,E>F,E+F,E~F)的Specificity值等于所有单选择器Specificity值的累加和。比如div.aside p的权Specificity值=(0,0,0,1)+(0,0,1,0)+(0,0,0,1)=(0,0,1,2);11个元素选择器的Specificity值(0,0,0,11)比一个类选择的Specificity值(0,0,1,0)小。
| Selector | type Example | Specificity |
|---|---|---|
| 通用选择器 | * | 0,0,0,0 |
| 元素选择器 | div | 0,0,0,1 |
| 伪元素选择器 | ::first-line | 0,0,0,1 |
| 类选择器 | .warning | 0,0,1,0 |
| 伪类选择器] | :hover | 0,0,1,0 |
| 属性选择器 | [type="checkbox"] | 0,0,1,0 |
| id选择器 | #content | 0,1,0,0 |
| HTML中的样式 | style="color: red;" | 1,0,0,0 |
| 继承样式 | —— | 0,0,0,0 |
其中,继承样式(Inheritance)是指从上级元素继承来的样式。CSS规定,DOM树中的下层元素会继承它上级父元素的部分样式。CSS定义了每个样式属性的可继承性,比如:padding, border, margin, background是不可继承的,具体可查阅书籍《CSS Pocket Reference》。
更详细的CSS选择器介绍请见延伸阅读[1],伪类与伪元素的区别分析请见延伸阅读[2]。
延伸阅读:
[1] CSS选择器备忘录
[2] 伪类与伪元素的区别
参考资料:
CSS中的样式层叠机制Cascade的更多相关文章
- CSS引用方式及样式层叠机制
CSS引用方式有3种,三种分别为:外部引入.内部引入.行内样式,下面一 一进行介绍. 1.外部引入:CSS代码在一个独立的文件中,HTML通过Link标签引入到页面. 代码格式:<link re ...
- 如何javascript获取css中的样式
obj.style.height只能获取行间样式,但是我们要怎么获取写在css文件中的样式呢? 首先我们要用一个新的方法currentStyle.这个方法由current和style两个单词组成意思是 ...
- js获取css中的样式
众所周知,obj.style只能够获取 <div id="a" style="width:100px;"></div> 结构上的样式 如 ...
- css中table样式
border-spacing:设置相邻单元格的边框间的距离; border-collapse:设置表格的边框是否被合并为一个单一的边框:{separate/collapse/inherit(IE不支持 ...
- CSS中background样式的repeat和no-repeat
自http://blog.sina.com.cn/s/blog_98eef7830101cv8t.html获取的知识,特此感谢. <!DOCTYPE html> <html lang ...
- javascript获取css中的样式值
<body> <input type="button" id="btn" value="启动"/> <img ...
- css中滚动条样式的设置
参数说明: 1.overflow-y : 设置当对象的内容超过其指定高度时如何管理内容:overflow-x : 设置当对象的内容超过其指定宽度时如何管理内容. 参数: visible:扩大面积以显示 ...
- 《转载》CSS中的三种样式来源:创作人员、读者和用户代理
CSS中的样式一共有三种来源:创作人员.读者和用户代理,来源的不同会影响到样式的层叠方式,很多第一次学习CSS的朋友,对这三种来源可能会存在一些困惑,下面我写一下自己的理解,若有错误的地方还请指正. ...
- [原创]Lodop打印, 以及Lodop引用css文件控制打印样式的问题.
最近在做Lodop打印功能: 思路是: 用MasterPage搭个打印页面的框架, 然后在具体的页面中填入数据, 打印的样式由母版页和CSS来控制. 困扰了一天的问题是: 在打印的JS文件中, 引 ...
随机推荐
- 模板 可并堆【洛谷P3377】 【模板】左偏树(可并堆)
P3377 [模板]左偏树(可并堆) 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删 ...
- 树链剖分【洛谷P1505】 [国家集训队]旅游
P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城 ...
- luogu4430 小猴打架
假硕讲了个prufer编码和Caylay公式 我为了证明prufer编码没用 所以用矩阵树定理证明了Caylay公式 让我们用矩阵树定理推一波 首先这个小猴打架最后会打成一棵树,这棵树是N个点的完全图 ...
- p2p-如何拯救k8s镜像分发的阿喀琉斯之踵?
K8s的出现为PaaS行业的发展打了一针兴奋剂,Docker+k8s的技术路线已经成为了容器云的主流.尤其针对大流量,大弹性的应用场景来说,k8s将其从繁杂的运维.部署工作中彻底拯救出来.然而事情往往 ...
- 牛客寒假算法基础集训营4 E applese 涂颜色
链接:https://ac.nowcoder.com/acm/contest/330/E 精通程序设计的 Applese 叕写了一个游戏. 在这个游戏中,有一个 n 行 m 列的方阵.现在它要为这个方 ...
- Java实现几分钟之后调度任务的定时器
几分钟之后执行某一操作,使用定时器Timer可以实现 Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. 具体实现 ...
- react 中文文档案例七 (温度计)
const scaleNames = { c: 'Celsius', f: 'Fahrenheit' }; function toCelsius(fahrenheit) { ) * / ; } fun ...
- pl/sql declare loop if
-- 1.判断表是否存在,如果存在则drop表 -- 2.创建表 -- 3.插入1W条数据 -- 4.每1K条commit一次 declare v_table ):='STUDENT'; --表名 v ...
- springMVC从前端接受boolean类型的属性失败的问题
springMVC从前端接收到的实体又一个boolean类型的属性,发现不管前端怎么操作,后台接收到的值都是false. 问题出现原因: eclipse在给实体属性生成getter和setter的时候 ...
- 1.3 IDAE安装GO插件
点击Configure,选择插件Plugins 安装后重启一下IDEA D:\app\Go是Go的安装路径,没有的话,可以下载安装一下Go 选择go项目的代码位置 创建三个文件夹,在src下进行编码 ...