CSS中的样式层叠机制Cascade

一、样式冲突

  样式冲突是CSS渲染过程要解决的一个关键问题,样式冲突主要由两个原因造成:

  1. 元素包含了不同对象所赋予的样式:浏览器、用户、作者。其中,浏览器样式是指不对元素赋予样式时,元素所表现出来的样式,也就是浏览器赋予的元素默认样式;用户样式是指用户通过浏览器插件设定的样式,比如色弱者会对文字颜色进行修改;作者样式只是程序员所编写的CSS样式。
  2. 程序员经常会在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 FE>FE+FE~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] 伪类与伪元素的区别

参考资料:

[1] CSS Pocket Reference

CSS中的样式层叠机制Cascade的更多相关文章

  1. CSS引用方式及样式层叠机制

    CSS引用方式有3种,三种分别为:外部引入.内部引入.行内样式,下面一 一进行介绍. 1.外部引入:CSS代码在一个独立的文件中,HTML通过Link标签引入到页面. 代码格式:<link re ...

  2. 如何javascript获取css中的样式

    obj.style.height只能获取行间样式,但是我们要怎么获取写在css文件中的样式呢? 首先我们要用一个新的方法currentStyle.这个方法由current和style两个单词组成意思是 ...

  3. js获取css中的样式

    众所周知,obj.style只能够获取 <div id="a" style="width:100px;"></div> 结构上的样式 如 ...

  4. css中table样式

    border-spacing:设置相邻单元格的边框间的距离; border-collapse:设置表格的边框是否被合并为一个单一的边框:{separate/collapse/inherit(IE不支持 ...

  5. CSS中background样式的repeat和no-repeat

    自http://blog.sina.com.cn/s/blog_98eef7830101cv8t.html获取的知识,特此感谢. <!DOCTYPE html> <html lang ...

  6. javascript获取css中的样式值

    <body> <input type="button" id="btn" value="启动"/> <img ...

  7. css中滚动条样式的设置

    参数说明: 1.overflow-y : 设置当对象的内容超过其指定高度时如何管理内容:overflow-x : 设置当对象的内容超过其指定宽度时如何管理内容. 参数: visible:扩大面积以显示 ...

  8. 《转载》CSS中的三种样式来源:创作人员、读者和用户代理

    CSS中的样式一共有三种来源:创作人员.读者和用户代理,来源的不同会影响到样式的层叠方式,很多第一次学习CSS的朋友,对这三种来源可能会存在一些困惑,下面我写一下自己的理解,若有错误的地方还请指正. ...

  9. [原创]Lodop打印, 以及Lodop引用css文件控制打印样式的问题.

    最近在做Lodop打印功能: 思路是:  用MasterPage搭个打印页面的框架, 然后在具体的页面中填入数据, 打印的样式由母版页和CSS来控制. 困扰了一天的问题是:  在打印的JS文件中, 引 ...

随机推荐

  1. Django个人博客开发 | 前言

    本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...

  2. P4088 [USACO18FEB]Slingshot 线段树+扫描线

    \(\color{#0066ff}{ 题目描述 }\) Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他产生了一个新奇的想法:与其使用拖拉机拖着装满牛粪的大车从一个地点到另一个地点, ...

  3. 10.6-10.7 牛客网NOIP模拟赛题解

    留个坑... upd:估计这个坑补不了了 如果还补不了就删了吧

  4. python 对三维CT数据缩放

    项目需要对CT数据进行缩放,这里我存储CT数据的格式是numpy数组. 一共尝试了三种方法,分别是numpy.resize,cv2.resize,scipy.ndimage.interpolation ...

  5. Python自动化开发学习20-Django的form组件

    武沛齐老师的Django的FORM组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html 转自:http://blog.51cto.com/st ...

  6. spring boot中 启用aspectj

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  7. [Leetcode]013. Roman to Integer

    public class Solution { public int romanToInt(String s) { if(s == null || s.length() == 0) return 0; ...

  8. Margarite and the best present

    Little girl Margarita is a big fan of competitive programming. She especially loves problems about a ...

  9. [例] 用MappedByteBuffer更新文件内容

    import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; impor ...

  10. windows下安装TensorFlow(CPU版)

    建议先到anaconda官网下载最新windows版的anaconda3.6,然后按步骤进行安装.(这里我就不贴图了,自己下吧) 1.准备安装包 http://www.lfd.uci.edu/~goh ...