20. 层叠 {ignore}

[toc]

声明冲突

概念:同一个样式,多次应用到同一个元素。

层叠

概念:解决声明冲突的过程,浏览器自动处理(权重计算)。

作用:经过层叠,作用到html元素上的样式最终只有一个胜出。注意:是css样式(即:某条CSS声明)胜出,而非css选择器胜出。

原理:层叠这一过程,有以下3步;若第一步能确定哪个样式胜出,那么就不会进行第二、三步;同理:若第二步能确定,则不会进行第三步。

1. 比较重要性

看样式表

重要性从高到底:

  • 作者样式表(开发者书写的样式)中的!important样式
  • 作者样式表中的普通样式
  • 浏览器默认样式表(user agent stylesheet)中的样式

2. 比较特殊性

看选择器

总体规则:选择器选中的范围越窄,越特殊。

具体规则:权重计算,通过选择器,计算出一个4位数(x x x x),数值大的胜出。

  1. 千位:如果是内联样式,记1,否则记0 —— 内联样式,就是直接写在元素身上的样式。(在chrome上调试 element.style {...} 的时候,实际上加上去的也就是内联样式。)
  2. 百位:等于选择器中所有id选择器的数量。#
  3. 十位:等于选择器中所有类选择器、属性选择器、伪类选择器的数量。.[]:link :visited :hover :active
  4. 个位:等于选择器中所有元素选择器、伪元素选择器的数量。element::before ::after

注意:说千位、百位、十位、个位,并不准确,因为这4位数,并非10进制,而是256进制。

3. 比较源次序

看css规则的书写次序

代码书写靠后的胜出。

4. 应用

  1. 重置样式表

书写一些作者样式,覆盖浏览器的默认样式。

常见的重置样式表:normalize.cssreset.cssmeyer.css

normalize.cssreset.cssmeyer.css 这三个文件都可以直接在网上下载到,实际上都没啥大的区别,使用哪个都OK。

  1. 爱恨法则

link > visited > hover > active

需要理解为什么是这个次序,如果不是这个次序,会出什么问题。

前提:它们的特殊性相同,即:权重相同。

原因分析:

  • 当按下时,优先显示按下时的效果,确保不会被其他状态的样式覆盖。
  • 当鼠标悬停时,无论该链接是否有被访问过,都优先显示鼠标悬停时的状态。
  • 当链接被访问过之后,优先使用访问过的样式,而非 link 状态的样式。
  • 当后面的3个状态都没发生时,默认显示link状态的样式。

即:当4者的某条css声明发生冲突时,后者胜出。

小结

  • 比较重要性

    1. 作者样式表 !important
    2. 作者样式表
    3. 浏览器样式表
  • 比较特殊性

    1. 内联样式
    2. id选择器
    3. 类选择器、属性选择器、伪类选择器
    4. 元素选择器、伪元素选择器
  • 比较源次序

    • 后写的胜出
  • 应用

    • 默认样式表
    • link(未访问) visited(访问过) hover(鼠标悬停) active(鼠标按下)