CSS 特殊性、继承与层叠
一、特殊性规则
选择器的特殊性由选择器本身的组件确定;特殊性由四个部分组成,其初始值为0,0,0,0。
1. 对于选择器中的每一个id,记0,1,0,0;
2. 对于选择器中的每一个类、伪类、属性,记0,0,1,0;
3. 对于选择器中的每一个元素、伪元素,记0,0,0,1;
4. 结合符与通配符对于选择器的特殊性没有任何贡献。
注意:
1. 0,0,1,0的特殊性比0,0,0,13的特殊性更高。
2. 通配符 * 的特殊性为0,0,0,0,它是有特殊性的;结合符(比如h1+p中的“+”)根本没有特殊性;继承而来的样式也没有特殊性。
请看如下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
* {
color:red;
} body {
color:cyan;
}
</style>
</head>
<body>
<p>What kind of color this para will be?</p>
</body>
</html>
页面显示如下:

此例中,<p>元素从<body>元素中继承了cyan颜色,然而继承来的规则根本没有特殊性,其优先级低于 * 的0特殊性,所以<p>元素采用了 * 的规则,颜色为red。
关于通配符 * :由于 * 适用于所有元素,而且有0特殊性,往往会在不经意间造成继承无法实现的情况,应该尽量避免使用 * 选择器。
3. 指定id属性的属性选择器与id选择器有本质区别,比如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
div[id="test"] p {
color:red;
} #test p {
color:cyan;
}
</style>
</head>
<body>
<div id="test">
<p>What kind of color this para will be?</p>
</div>
</body>
</html>
页面效果:

此例中,div[id="test"] p 的特殊性为0,0,1,2;而 #test p 的特殊性为0,1,0,1;#test p 这个选择器胜出,所以字体颜色为cyan。
4. 行内样式的特殊性最高,为1,0,0,0。
5. 标记为!important的声明被称为重要声明,它没有特殊性,不过要与非重要声明分开考虑。
具体而言:非重要声明分为一组,它们之间的冲突使用特殊性解决;重要声明分为一组,它们之间的冲突内部解决;重要声明总是比非重要声明优先。
二、继承
1. 继承没有任何特殊性,记住这一点往往能明白很多问题。
请看如下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
p {
color:red;
}
</style>
</head>
<body>
<p>What kind of color this <a href="#">link</a> will be?</p>
</body>
</html>
页面效果:

为什么设置了<p>元素的颜色为红色,<a>元素的颜色却是蓝色?
这并不是因为<a>元素不继承父元素的颜色(原谅我之前就是这么认为的),而是因为<a>元素继承了<p>元素的颜色,但是这个继承来的样式根本没有特殊性,然而浏览器默认样式中对<a>元素设置了样式,很明显浏览器默认样式的特殊性更高,于是<a>元素就按照浏览器默认样式显示。
2. CSS中有一个关键字是所有属性共有的,inherit,它使一个属性的值与其父元素相同。
在大多数情况下,不必指定继承,因为大多数属性会自动继承;不过,自动继承的属性没有特殊性,很容易被其它样式覆盖;当需要显式地指定一个元素的样式与其父元素一致时,使用inherit会更方便。
三、层叠
层叠规则:
1. 按权重排序;读者重要声明>作者重要声明>作者一般声明>读者一般声明>用户代理声明。
2. 权重相同的情况下,按照特殊性排序,特殊性越高的胜出。
3. 特殊性相同的情况下,按照样式表中的顺序排序,后出现的胜出。
btw,正是因为这个规则,才会使用LoVe-HA的顺序声明链接样式(LoVe-HA 依次为 :link; :visited; :hover; :active)。
关于 外部样式<内部样式<行内样式 的说明:
这种说法来源于上述第3条规则。一般而言,在html的<head>元素下,我们习惯将外部样式表的<link>标签放在内部样式<style>之前,这就导致了内部样式的顺序在外部样式的顺序之后,所以内部样式优先级高;但是如果将<style>标签与<link>标签调换位置,比如这样:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
p {
color:red;
}
</style>
<link rel="stylesheet" type="text/css" href="1.css">
</head>
<body>
<p>What kind of color this para will be?</p>
</body>
</html>
此例中,外部样式表包含 P {color:cyan;} 这样一条规则,它的特殊性与内部样式表一样,都为0,0,0,1,但由于外部样式表在内部样式之后,所以外部样式胜出,页面显示如下:

所以,
外部样式<内部样式 这只是一种习惯上的说法,关键还是要看它们出现的顺序,顺序越靠后的优先级更高。
当然,行内样式总是最靠后的,所以它的优先级高于外部样式和内部样式,这是毋庸置疑的。
CSS 特殊性、继承与层叠的更多相关文章
- CSS系列:CSS的继承与层叠特性
1. CSS的继承特性 所有的CSS语句都是基于各个标记直接的继承关系,CSS继承是指子标记会继承父标记的所有样式风格,并可以再父标记样式风格的基础上再加以修改,产生新的样式,而子标记的样式完全不会影 ...
- css的继承和层叠
标签(空格分隔): css css称为层叠样式表,CSS有两大特性:继承性和层叠性,本章简单介绍一下继承性: 继承性: 定义:继承就是给父及设置了一些属性,子级继承了父及的该属性,这就是我们的css的 ...
- html学习第二天—— 第九、十章——CSS的继承、层叠和特殊性+CSS格式化排版
继承CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签, ...
- HTML+CSS学习笔记(9)- CSS的继承、层叠和特殊性
标签:HTML+CSS 继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这 ...
- css的继承、层叠和特殊性
1,继承 css的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代. 但注意有一些css样式是不具有继承性的.如border: ...
- CSS学习笔记之CSS的继承、层叠和特殊性
继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码:如某种颜色应用于p标签,这个颜色设置不仅应用p标签 ...
- 从零开始学习html(九)CSS的继承、层叠和特殊性
一.继承 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" co ...
- CSS 选择器继承和层叠
CSS选择器及其继承特性.层叠特性1.基本选择器 标记 id class 这个就不再作介绍了 2.复合选择器 交集 交集选择器由两个选择器直接连接构成,其结果是选中二者各自元素范围的交集 其 ...
- css选择器---继承,优先级,层叠
CSS三大特性—— 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式的权重比较; 层叠:是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...
- CSS选择器与CSS的继承,层叠和特殊性
什么是选择器?选择器{样式;},在{}之前的部分就是"选择器","选择器"指明了{}中的"样式"的作用对象,也就是"样式" ...
随机推荐
- Spring Cloud与微服务构建:微服务简介
Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...
- Alternate Task UVA - 11728 (暴力。。分解质因子)
题意: 输入一个正整数S,(S <= 1000)求一个最大的正整数N,使得N的所有正因子之和为S. 解析: ..求1000以内的所有数的正因子和 ...输出.. #include <io ...
- [CF850F] Rainbow Balls
题目大意 这里 题解 我们枚举最后剩下的球的种类,那么其他球可以看做没用了. 设选定的球有\(a_i\)个,球的总数为\(s=\sum_{i=1}^n a_i\). 现在问题变为:在一个长度为\(s\ ...
- 【转】关于在linux下清屏的几种技巧
在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...
- 【BZOJ1079】【SCOI2008】着色方案
Time Limit: 10 Sec Memory Limit: 162 MB Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci ...
- Java虚拟机加载类
Java虚拟机是如何加载Java类的 Java虚拟机加载Java类总共需要经过3步:加载-----链接-----初始化.Java语言的类型可以分为两大类:基本类型和引用类型.基本类型是有Java虚拟机 ...
- php高效遍历文件夹、高效读取文件
/** * PHP高效遍历文件夹(大量文件不会卡死) * @param string $path 目录路径 * @param integer $level 目录深度 */ function fn_sc ...
- 【MST】P2323 [HNOI2006]公路修建问题
Description 给定 \(n\) 个点 \(m - 1\) 条无向边,每条边有两种边权,贵一点的和便宜一点的.要求至少选择 \(k\) 条贵边使得图联通且花费最大的边权值最小. Input 第 ...
- increment/decrement/dereference
#include <vector> #include <deque> #include <algorithm> #include <iostream> ...
- UVALive 7505 Hungry Game of Ants (2015Ecfinal)
题意: 长度是n的线段上点的编号从1~n,每个点有一只蚂蚁蚂蚁的体重等于该点的编号,最初每只蚂蚁可以选择向右走或者向左走两只蚂蚁相遇时体重大的吃掉体重小的并且体重增加为两只的体重和,走到边界时掉头,问 ...