前言
CSS的三大特性及其衍生知识点
一、层叠性
同选择器同样式的情况下,遵循“就近原则”,举例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
font-size: 12px;
color: aquamarine;
}
div{
font-size: 23px;
}
</style>
</head>
<body>
<div>这是一个层叠样式示例</div>
</body>
</html>
如图所示:图中绿框的是下一个div没有的,直接被div标签使用,但相同重复的样式font-size则采用就近原则,红色箭头是div标签在就近原则下使用就近div为font-size为23px的值。
结果如下:
二、继承性
一般来说继承的是父类的某些样式,如文本和字号,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body{
border: 1px solid red;
font-size: 18px;
color: green;
width: 300px;
height: 100px;
margin: 20px;
padding: 10px;
}
p{
border: 1px dashed blue;
}
</style>
</head>
<body>这是直接写在body上的文字
<p>这是继承body标签显示出来的样式</p>
</body>
</html>
如图所示:以图中p标签和body标签举例,p是body的类,body是p的父类,为了展示p不能继承父类的盒模型的样式,例如margin和padding,以及宽高。而只能继承某些文本样式的特点,采用边框说明的更清楚一些。通过结果图可见,代码区域的蓝色边框的文本样式都已被继承,而棕色边框的样式都没有,在结果图中,p的边框并没有margin和padding还有height和width的值,说明p只能继承某些父类的样式,如:text-,font-,line-这些元素开头以及color样式可继承。
结果如下:
行高的继承
行高作为一种特殊的继承,下面来着重介绍一下,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
color: pink;
/* font: 12px/24px 'Microsoft YaHei'; */
font: 12px/1.5 'Microsoft YaHei';
}
div {
/* 子元素继承了父元素 body 的行高 1.5 */
/* 这个1.5 就是当前元素文字大小 font-size 的1.5倍 所以当前div 的行高就是21像素 */
font-size: 14px;
}
p {
/* 1.5 * 16 = 24 当前的行高 */
font-size: 16px;
}
/* li 么有手动指定文字大小 则会继承父亲的 文字大小 body 12px 所以 li 的文字大小为 12px
当前li 的行高就是 12 * 1.5 = 18
*/
</style>
</head>
<body>
<div>这是一个div标签</div>
<p>这是一个p标签</p>
</body>
</html>
如图所示:div和p标签都是body标签的子类,其中的绿框font-size的值与父类font的值都不同,行高的继承之所以不同,在于子类的文字大小样式(font-size)不同,行高跟随其变化,父类样式font:12px/1.5中的1.5表示:凡是body标签下面的子类的行高,如果有设置文字大小,那行高为其子类文字大小的1.5倍,没有设置则为默认值121.5=18,所以div设置了文字大小,其行高应该为141.5=21,同理p的行高应该为16*1.5=24。
结果如下(红圈表示):
三、优先级
当一个元素指导多个选择器就会产生优先级。
- 选择器相同,则执行层叠性(就近原则)
- 选择器不同,则根据选择器权重执行
那对于选择器不同的情况下用哪个选择器,选谁,我们用权重来决定,那什么是权重?
权重
权重(优先级)注意点:
- 权重是有4组数字组成,但是不会有进位。
- 可以理解为类选择器永远大于元素选择器, id选择器永远大于类选择器,以此类推...
- 等级判断从左向右,如果某一位数值相同,则判断下一位数值。
- 可以简单记忆法: 通配符和继承权重为0, 标签选择器为1,类(伪类)选择器为 10, id选择器 100, 行内样式表为1000, !important 无穷大。
- 继承的权重是0, 如果该元素没有直接选中,不管父元素权重多高,子元素得到的权重都是 0。
举个例子:
不同选择器下的优先级关系:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#nihao{
color: purple;
}
.kaixin{
color: blue;
}
div{
color: red !important;
}
</style>
</head>
<body>
<div class="kaixin" id="nihao" style="color: green;">这是一个关于优先级的div标签</div>
</body>
</html>
那到底div标签到底显示哪个?关于这个问题,那当然是红色啦,你猜为啥,我们来一一解释一下,给的表格中的权重由高到低比较大小为:!important>行内样式>id选择器>类选择器和伪类选择器>元素选择器>继承或*,一开始css里的div先起作用,颜色变为红色(没写!important),增加了类选择器,其颜色变为蓝色,又增加了id选择器,其颜色变为紫色,然后再在div标签里添加了style行内样式,变为绿色,但最后又在原来的div标签里增加了!important,让其权重为最高。为了解释到所有选择器的权重,就于是绕了一圈哈哈哈。
结果如下:
继承下的优先级关系:
这是父有样式,子没样式的优先级:
因为子元素p没有样式,所有继承了父元素div的样式,颜色变为绿色,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#father{
color: green;
}
</style>
</head>
<body>
<div id="father">
<p>这是一个继承了div的p标签</p>
</div>
</body>
</html>
结果如下:
继承下的优先级关系: 这是父有样式,子也有样式的优先级:
因为子元素p有样式,根据继承的父类权重,p继承过来的权重值应为0,不论父类有有最高权重!important,其颜色值优先应为子类p选择器设置的样式,所以颜色变为粉色,权重:被继承的子类选择器的权重永远大于父类选择器继承的权重,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 父亲的权重为100 */
#father{
color: green!important;
}
/* p继承的权重为0 */
p{
color: pink;
}
</style>
</head>
<body>
<div id="father">
<p>这是一个继承了div的p标签</p>
</div>
</body>
</html>
结果如下:
权重的叠加
如果是复合选择器,则会有权重叠加,需要计算权重,权重虽然会叠加,但是永远不会有进位。 例如:
- div ul li ------> 0,0,0,3
- .nav ul li ------> 0,0,1,2
- a:hover -----—> 0,0,1,1
- .nav a ------> 0,0,1,1
具体实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
ol{
list-style: none;
}
/* #bbb li权重 0,1,0,0 + 0,0,0,1 = 0,1,0,1 101*/
#bbb li{
color: purple;
}
/* .aaa li权重 0,0,1,0 + 0,0,0,1 = 0,0,1,1 11*/
.aaa li{
color: green;
}
/* ol li权重 0,0,0,1 + 0,0,0,1 = 0,0,0,2 2*/
ol li{
color: red;
}
/*li权重 0,0,0,1 1*/
li{
color: yellow;
}
</style>
</head>
<body>
<ol class="aaa" id="bbb">
<li>这是一个li标签</li>
</ol>
</body>
</html>
其中最大权重为#bbb li的复合选择器,为101,大于其中所有的复合选择器,权重值都已给出,所以结果文字颜色为紫色。
结果如下:
四、总结
css的三大特性的主要知识已全部介绍完,里面的很多知识都较为容易,希望此文章能够帮助到大家,感谢阅读不足之处请大家指点指点
如需要引用此文章,请写明出处。