CSS样式优先级

本文详细介绍了CSS中不同样式定义方式的优先级规则,包括直接样式定义、ID选择器、类选择器等,并通过实例演示了如何确定最终样式。

在CSS中使得一个具体的元素获得一个样式定义属性集合,有以下几种方式:

1、直接在元素中通过style来定义标签样式(许多JS是通过这种方式来动态控制元素的样式)
比如有以下代码
<div tyle="background:black">
</div>
通过style方式来定义了div标签的样式,这种方式定义样式在css规范中有很高的优先权(1000)

2.通过ID选择器来获取样式定义,有以下代码:
<div id="bgc">
</div>
然后我们定义了ID选择器的:
#bgc{background:black}
ID选择器也是据有比较高的优先权,每个权重为100

3、类选择器,伪类选择器,属性选择器
类选择器的定义和使用:
.bgc{background:black}
<div class="bgc">
</div>
这三类选择器在css规范中拥有的优先权相对较低,每个权重为10

4、元素和伪元素选择器
比如以下代码
div{background:black}
<div></div>
这类选择器在css规范中的优先权非常低,每个权重为1

5、其它选择符(全局选择符*,子选择符)
优先权最低,每个权重为0


6、继承
比如有这么一段html代码,
<div class="no1">
<p></p>
</div>
这里我设定.no1{ text-align:center},那么它下面的<p>标签也就继承了文字居中这个属性了。
这里的p标签获取到的样式的方式称之为继承,继承并不参与到优先权的计算当中,只要有其它方式的定义都会覆盖继承而来的属性。

在具体混合方式的css样式定义中,同一个属性的具体取值的确定,便是根据每种样式定义的方式的加权和来确定的。

优先值只是确定属性值的一个因素,还需要遵循的原则包括:
1、!important 声明的规则高于一切,如果 !important 声明冲突,则比较优先权。 
2、如果优先权一样,则按源码中“后来者居上”的原则。 
3、由继承而得到的样式属性不参与 specificity 的计算,低于一切其他规则(例 全局选择符 * )。

具体的例子如下(在IE7和FF中测试):

有这么一段html代码,我们不断修改style定义,观察颜色变化(为了说明跟源码顺序的关系,一次向上添加样式定义)
<html>
   <style>
       h1{color: red}
   </style>
   <body class="bodyColor">
   <h1 id="idColor" class="myColor">
      shaosheng test
   </h1>
 </body>
</html>

1、只有一行样式定义 h1 {color: red;}
   只有一个普通元素加成,优先值为 0,0,0,1  显示红色

2、原有的h1定义之上添加一样定义 body h1{color:green}
   有两个普通元素的加成,优先值为 0,0,0,2 显示绿色
  
3、新添样式定义 .myColor{color:black}
   只有一个class选择符,优先值为  0,0,1,0 显示黑色

4、新添样式定义 body .myColor{color:pink}
   有一个普通元素和一个class选择符加成,优先值为 0,0,1,1 显示粉色

5、新添样式定义 .bodyColor .myColor{color:blue}
   由两个class选择符加成,优先值为 0,0,2,0  显示蓝色
  
6、新添样式定义 #idColor{color:silver;}
   只有一个ID选择符,优先值为 0,1,0,0 显示银色

7、直接在h1标签上加上style定义style="color:purple"
   这时,style定义的样式,优先值为 1,0,0,0 显示紫色
  
8、到这个时候完整的源代码为:
   <html>
   <style>
         #idColor{color:silver;}
         .bodyColor .myColor{color:blue}
          body .myColor{color:pink}
          .myColor{color:black}
          body h1{color:green;}
       h1{color: red;}
   </style>
   <body class="bodyColor">
   <h1 id="idColor" class="myColor" style="color:purple">
      shaosheng test
   </h1>
 </body>
</html>
在任何一个样式定义中加入!important就会显示该样式定义的颜色,当我们在多个定义上加入了!important,
这个几个样式值就会按照以上的优先值计算原则进行比较进行取舍


9、最后,我们把源码改成以下形式
<html>
   <style>
          .ortherColor{color:pink;}
          .myColor{color:black;}
         
   </style>
   <body class="bodyColor">
   <h1 id="idColor" class="myColor ortherColor">
      shaosheng test
   </h1>
 </body>
</html>

在这里我们定义了两个级别相同的class选择器,并且在同一个标签中引用,进过测试不管
class="myColor ortherColor" 中两个选择符的先后顺序如何,文本显示的始终是黑色,只跟源码顺序有关系。

10、源码顺序问题
    CSS源码,有两种方式一种是html中的style标签,一种是css文件,style标签中的顺序优先于文件中的优先级,文件中的优先级,
    按照文件引入顺序而定。
   
最后,就一个非专业人员的感觉来说,这里的优先级跟JAVA中变量的优先级是相通的,大致原则是作用范围越小的优先级越高。

CSS 样式优先级机制和继承机制是控制样式如何被应用和覆盖的核心概念。以下是详细的解析: ### 1. CSS 样式优先级规则 CSS 样式优先级的计算基于四个层级:**内联样式**、**ID 选择器**、**类选择器、属性选择器、伪类选择器**、以及**元素选择器和伪元素选择器**。这些层级的优先级从高到低依次为: - **内联样式**(Inline styles):直接在 HTML 元素上使用 `style` 属性定义的样式,其优先级最高。 - **ID 选择器**(例如 `#myId`):ID 选择器的优先级高于类选择器、属性选择器和伪类选择器。 - **类选择器**(例如 `.myClass`)、**属性选择器**(例如 `[type="text"]`)、**伪类选择器**(例如 `:hover`):它们的优先级相同。 - **元素选择器**(例如 `div`、`p`)和**伪元素选择器**(例如 `::before`):它们的优先级最低。 此外,还有一些特殊规则会影响优先级: - **`!important` 声明**:如果一个样式规则被标记为 `!important`,它将覆盖其他所有规则,包括内联样式。但应谨慎使用,因为它可能导致样式难以维护。 - **通用选择器**(例如 `*`)和**组合选择器**(例如 `>`, `+`, `~`)对优先级没有影响。 - **源码顺序**:当多个选择器具有相同的优先级时,后定义的样式会覆盖先定义的样式。 ### 2. CSS 样式继承机制 CSS 的继承机制允许某些样式属性从父元素传递到子元素。并不是所有属性都可以继承,通常只有与**文本相关的属性**可以继承。以下是常见的可继承属性: - **字体相关属性**:`font`, `font-family`, `font-size`, `font-weight`, `font-variant`, `font-style` - **文本相关属性**:`color`, `line-height`, `letter-spacing`, `text-align`, `text-indent`, `text-transform`, `white-space`, `word-spacing` - **列表相关属性**:`list-style`, `list-style-type`, `list-style-position`, `list-style-image` - **表格相关属性**:`border-collapse`, `border-spacing` 例如,如果给 `body` 元素设置了 `font-size: 16px;`,那么 `body` 的子元素会继承这个字体大小,除非子元素显式地设置了不同的字体大小。 对于不可继承的属性,如 `border`、`margin`、`padding` 等,子元素不会自动继承父元素的值。如果需要让子元素应用父元素的样式,可以使用 `inherit` 关键字。例如: ```css .child { border: inherit; } ``` 这样,`.child` 元素的 `border` 属性将继承自父元素。 ### 3. 优先级和继承的结合 当多个样式规则作用于同一个元素时,浏览器会根据优先级规则决定最终应用的样式。如果某个属性是可继承的,并且没有被显式设置,那么它会从父元素继承。如果多个规则具有相同的优先级,那么后定义的规则会覆盖先定义的规则。 ### 4. 特殊值 `inherit` 和 `initial` - **`inherit`**:强制某个属性继承父元素的值,即使该属性通常不可继承。 - **`initial`**:将属性值重置为该属性的默认值。 例如: ```css .child { color: inherit; /* 强制继承父元素的颜色 */ font-size: initial; /* 重置为默认字体大小 */ } ``` ### 5. 实际应用中的优先级问题 在实际开发中,优先级问题可能导致样式冲突。为了避免这种情况,建议遵循以下最佳实践: - **避免使用 `!important`**:除非必要,否则不要使用 `!important`,因为它会使样式难以覆盖。 - **尽量避免使用 ID 选择器**:由于 ID 选择器的优先级很高,覆盖它们可能会很困难。 - **使用类选择器**:类选择器的优先级适中,易于管理和覆盖。 - **保持样式表的结构清晰**:合理组织样式表的顺序,确保高优先级样式在需要时能够覆盖低优先级样式。 ### 6. 示例代码 以下是一个简单的示例,展示了如何使用继承和优先级: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { font-size: 20px; color: blue; } .parent { border: 1px solid red; } .child { color: inherit; /* 继承父元素的颜色 */ font-size: 16px; /* 覆盖继承的字体大小 */ } </style> </head> <body> <div class="parent"> <p class="child">这是一个段落</p> </div> </body> </html> ``` 在这个示例中,`.child` 元素继承了 `body` 的颜色,但显式设置了字体大小。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值