CSS的优先级机制

首先了解下CSS的三种样式类型:外部样式、内部样式以及内联样式。

外部样式:

        外部样式与HTML代码分离,单独存放在.css文件中。使用时通过link标签将此文件引入到页面中,引入的格式为:<link type="text/css" rel="stylesheet" href=".css文件的地址"/>

内部样式:

        内部样式使用<style>标签将CSS代码包裹起来,并放入<head>标签中(一般存放在head中,也可存放于别处,如body中),格式为:<style type="text/css"> span{color: red;} </style>

内联样式:

        内联样式定义在dom元素的style属性中,格式为:<div style="background-color: red;"> hello </div>

以上三种样式类型的优先级为:

        内联样式  >  内部样式  >  外部样式


但这个优先级并不是绝对的,因为还存在着选择器的优先级以及!important一说。下面先介绍下选择器的优先级:












上图所表达的意思为:内联样式style属性的权值为1000,id选择器的权值为100,类、伪类、属性选择器的权值为10,标签选择器的权值为1。(权值越大,优先级越高)

结合选择器的优先级,重新去看上面所提到的三种CSS样式类型的优先级,我们可以对这个优先级排序做如下解释:

1. 内联样式的优先级最高,是因为style标签的权值高。

2. 内部样式的优先级高于外部样式,是因为我们普遍将内部样式定义在外部样式之后。这样对于相同权重的样式,后面的会覆盖掉前面的(也可以理解为越靠近dom元素的样式,优先级相对越高),所以最终呈现出来的是内部样式的优先级更高。我们下面做个测试,将内部样式定义在外部样式之前,看看效果如何:

  代码如下:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8"/>
<script src="Useful/jq.js"></script>
<style type="text/css">
  #span1{
    color: red;
  }
</style>
<link type="text/css" rel="stylesheet" href="Useful/testPage.css"/>
<!-- testPage.css内容为:#span1{color: yellow;} -->
</head>
<body>
  <span id="span1"> 我是span </span>
</body>
</html>
  结果:


很显然,最终显示出来的是外部样式中定义的颜色。这就印证了内部样式和外部样式本身并没有优先级高低之分,最终的优先级是由选择器优先级和顺序所决定的。换一种方式理解:外部样式被link引入进页面后,所呈现出的形式类似于内部样式,他们是平等的。这时候决定最终样式的就是选择器和顺序了。


下面再讲下!important:

从字面意思也可以看出,!important修饰的样式具有最高的优先级,不论是定义在内部、外部还是内联样式中,它的优先级都是最高的。

如果有两处及以上的地方都对同一个元素定义了!important样式,那么最终的优先级还要结合选择器和顺序来决定。举个例子:

#span1{
  color: yellow !important;
}
span{
  color: red !important;
}
两处都使用了!important,但第一个id选择器的优先级高于第二个标签选择器,所以最终的效果为黄色。



### CSS 优先级计算规则 CSS优先级计算涉及多个方面,包括继承、特殊性重要声明。以下是详细的说明: #### 1. **继承** 某些 CSS 属性具有天然的继承特性,这意味着子元素会自动继承父元素的样式属性。例如 `color` `font-family` 是可继承的属性[^1]。如果某个属性未被显式定义,则它可能会从其祖先节点继承。 #### 2. **特殊性 (Specificity)** 特殊性的计算基于选择器的不同权重组合而成。具体规则如下: - 内联样式(Inline Styles):权值为 `(1, 0, 0, 0)`。 - ID 选择器:权值为 `(0, 1, 0, 0)`。 - 类选择器 / 属性选择器 / 伪类:权值为 `(0, 0, 1, 0)`。 - 元素选择器 / 伪元素:权值为 `(0, 0, 0, 1)`。 当有多个规则应用于同一元素时,浏览器会按照这些数值相加后的总来决定哪个规则生效。更高的特殊性意味着更优的优先级[^4]。 #### 3. **重要声明 (!important)** 通过在样式声明后面加上 `!important` 关键词,可以使这条声明拥有最高的优先级,即使存在更高特异性或其他来源的规则也不会影响到它[^3]。不过需要注意的是,过度依赖于 `!important` 可能会导致维护困难以及不可预测的行为,因此建议仅限于特殊情况使用。 #### 4. **层叠机制** 除了以上提到的因素外,在相同条件下还会遵循以下原则进行处理: - 来源顺序:用户自定义样式表 > 页面作者提供的样式 > 浏览器默认设置; - 文件加载次序:对于同等级别的外部样式文件或者内部 `<style>` 块内的定义而言,后者将覆盖前者的效果; ```css /* Example of Specificity */ p { color: blue; } /* Element selector -> specificity = (0, 0, 0, 1)[^4] */ .warning { color: red; } /* Class selector -> specificity = (0, 0, 1, 0)[^4] */ #header .warning { color: green; } /* Combination of id and class selectors -> specificity = (0, 1, 1, 0)[^4] */ /* Important Declaration Overriding Normal Rules */ .normal-text { color: black; } .override-important { color: white !important; /* This rule will override any other rules due to !important declaration.[^3] */ } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值