![Web全栈开发:从入门到实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/499/40778499/b_40778499.jpg)
4.3 为什么是层叠样式表
其实,CSS样式的定义方式有四种,当一个元素出现重复的样式声明时,最终生效的样式是由它们的优先级来决定的。这种允许样式的重复定义和优先级设置就构成了样式的层叠性,因此,CSS的全称是层叠样式表。
4.3.1 四种定义样式的方式
这一节我们来具体看看这四种样式的定义方式,以及它们的优先级,如图4.8所示。其中优先级的值越大,优先级就越高,意味着对最终样式的影响越大。
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00060001.jpg?sign=1738956820-qhadkuY1bDgenqgvNFG74jL8G5ym8xI8-0-f51331c84af68fed12d33aed6d9eae27)
图4.8
四种样式的具体说明见表4.1。
表4.1
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00060002.jpg?sign=1738956820-rW8jreJkZRRq6twFkn5mNJVeLnOffmOo-0-09766ca4ca14c4f01074062ae46c033a)
以上四种样式定义,除了内联样式是直接在目标元素内定义,此时不要指定目标元素,其余三种方式都采用元素选择器和声明块的定义方式:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00061001.jpg?sign=1738956820-GZ7zpRRwocUzAgFfLzNZI3gNg7K4Z1lL-0-72ec904a30c8b1c1e656075a9e1f3f76)
其中,元素选择器是指对哪一个元素应用样式,如上例中的span元素。声明块则是由若干行的样式声明语句组成的,其中每一条声明语句是由“属性名:值”的形式构成。
对于外部样式还需要引入外部的css文件,一般它都是加在head内部:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00061002.jpg?sign=1738956820-87X0GK8Cpg6mpDmq6nm0M3aqNQtSTNd2-0-4db6ed8465c8e2a03ccd6ecf73ea969d)
在html文件中引入的外部文件位置都是在<head>内部定义的,依靠<link>标记来表示要连接的外部文件,内部的rel属性表明连接的外部对象是一个样式表(stylesheet),href属性则是外部文件的路径。
不同样式的使用秘籍
CSS有四种定义样式的方式,到底该用哪一种,还是全用?
正确的做法是,浏览器默认是一直都存在的,不存在选择性。对于其他三种则有分别的适用情况:(1)初学阶段,网页内容非常简单,又希望样式声明和HTML内容在同一个页面,推荐适用内部样式定义。
(2)对于中型到大型网站项目,推荐使用外部样式,原因很简单,为了便于代码的重复使用,即“代码复用”。因为很多样式可以在多个项目或网页通用,因此,只需要定义一次,其他地方引入即可。
(3)如果个别元素的样式非常重要且特殊,你希望提高它的优先级,则采用内联样式。
4.3.2 样式冲突怎么办
有时,不得不用到两种以上的方式声明CSS。那么,就会不可避免地遇到样式冲突问题,到底该听谁的?这里总结了两种常见的冲突情况:
情况1:对某一个元素,使用三种方式定义相同的样式。
请看下面的例子,代码如下:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00062001.jpg?sign=1738956820-O5vuDjvMvhwmiZKUE7ykUkhhlsZCOTTf-0-f68bb3937f00574c50ecbfcae4654df3)
my.css中定义的样式如下:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00062002.jpg?sign=1738956820-jWk3eWJ05ujATA9vKoLCYelTiFhsqPwC-0-192e5cc0d48ce8a4260bc59aea990319)
上述代码希望给二级标题设置字体颜色样式,请问标题文字最终显示为什么颜色?
根据优先级法则的判定:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00062003.jpg?sign=1738956820-6GfZaS0oqkf9ky1n6GPBiarAUaTHkrlC-0-8db83246e346686257290ad09de15327)
应该是绿色。
当然,如果你想强制改变默认的优先级规则,也可以给某个样式的属性声明后添加空格和关键字!important,试着修改内部样式如下:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00062004.jpg?sign=1738956820-Ly337sktf03kvCGcMRPOBM1BvzhkMutA-0-7726cda45d0192066fb4bacc30fe0097)
再试试看二级标题颜色还是绿色吗?
情况2:同一级别下,重复定义的样式,谁后定义听谁的。
修改上述例子,删除内联样式,并添加一个新的内部样式。因此,二级标题的样式只有两个,具体如下代码所示:
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00062005.jpg?sign=1738956820-7waBSJRhWB7K2CsXXlr9lT4zQKqzUK4F-0-020d1039ee2cfe0e688157f8bb02461e)
你猜猜标题会是黄色还是蓝色呢?自己检查一下看看,再对对口诀。
样式不起作用
如果你给一个元素设计了CSS样式,却未得到期望的效果,则先要排除属性拼写等语法错误,然后去查看是否有重复定义的样式?如果有,则要根据优先级判定一下,是不是你期望的样式优先级太低了。最后,可以在浏览器的开发者工具中选中目标元素,查看样式,会发现某些样式虽然声明了,但是却没有被应用,因此,就会被画线,(见图4.9中的画线部分的样式)。
![](https://epubservercos.yuewen.com/2FB90A/21182128908301306/epubprivate/OEBPS/Images/img00063001.jpg?sign=1738956820-yezAaGdoi4XTD8djGiBiMfGkLVKBSOl6-0-13e1f3491d76550fbda5f176a1523134)
图4.9