CSS考点之权重计算🧑🏻‍💻

493 阅读3分钟

引言💭

在 CSS 中,权重决定了哪条规则会应用到 HTML 元素。当多个规则作用于同一元素时,浏览器会根据权重来判断哪一条规则优先执行。

这也是一个面试高频考题,赶紧码住。✍🏻

什么是 CSS 权重?🤔

CSS 权重是一个数值,用来表示某个选择器的优先级。浏览器根据该优先级来决定哪些规则被应用。CSS 权重的计算是根据选择器的类型(例如:元素、类、ID 选择器等)来确定的。每种选择器类型对应一个特定的权重值,而这些权重值会按照一定的规则叠加。

权重通常用四个数字表示,形式为 (a, b, c, d)。这四个数字分别代表不同类型选择器的权重:

  • a: 内联样式的权重,优先级最高。
  • b: ID 选择器的权重。
  • c: 类选择器、属性选择器和伪类选择器的权重。
  • d: 元素选择器和伪元素选择器的权重。

CSS 权重计算的详细规则📑

  1. 内联样式style="..."):

    • 权重:(1, 0, 0, 0),内联样式的优先级最高。
    • 示例:<div style="color: red;">内容</div>
  2. ID 选择器

    • 权重:(0, 1, 0, 0),每个 ID 选择器的权重为 1
    • 示例:#header { color: red; }#menu { color: blue; }
  3. 类选择器、属性选择器和伪类选择器

    • 权重:(0, 0, 1, 0),每个类选择器、属性选择器和伪类选择器的权重为 1
    • 示例:.menu { color: green; }[type="text"] { color: orange; }:hover { color: purple; }
  4. 元素选择器和伪元素选择器

    • 权重:(0, 0, 0, 1),每个元素选择器和伪元素选择器的权重为 1
    • 示例:div { color: blue; }p { color: red; }::before { content: ''; }

权重计算示例📌

假设有以下的 CSS 规则:

#header { color: red; }
.menu { color: green; }
div { color: blue; }

对应的 HTML 元素为:

<div id="header" class="menu">Hello</div>

根据权重计算,浏览器会按照以下方式决定哪个规则生效:

  1. #header { color: red; }

    • 权重:(0, 1, 0, 0),使用了 ID 选择器。
  2. .menu { color: green; }

    • 权重:(0, 0, 1, 0),使用了类选择器。
  3. div { color: blue; }

    • 权重:(0, 0, 0, 1),使用了元素选择器。

由于 ID 选择器的权重最高((0, 1, 0, 0)),最终文本的颜色会是 红色,即 #header 规则生效。

权重递增与选择器的组合🌈

多个选择器组合时,它们的权重会叠加。例如:

#header .menu div { color: purple; }

此时,#header .menu div 的权重是 (0, 1, 1, 1),它包含了一个 ID 选择器(#header)、一个类选择器(.menu)和一个元素选择器(div)。它的权重为:

  • ID 选择器:1
  • 类选择器:1
  • 元素选择器:1

因此,最终权重为 (0, 1, 1, 1)

内联样式的优先级🎢

内联样式具有最高的优先级,权重为 (1, 0, 0, 0)。即使在外部样式表中存在其他选择器,内联样式也会覆盖它们。

例如,以下 HTML 元素的内联样式将覆盖任何外部样式:

<div id="header" class="menu" style="color: yellow;">Hello</div>

即使外部 CSS 中有 #header { color: red; }.menu { color: green; },内联样式 style="color: yellow;" 仍然会应用,并使文本的颜色变为 黄色

选择器优先级的具体比较🚀

假设以下 CSS 规则:

#header { color: red; }
.menu { color: green; }
div { color: blue; }

以及 HTML 元素:

<div id="header" class="menu">Hello</div>

在此情况下,CSS 规则的权重:

  • #header { color: red; } 的权重为 (0, 1, 0, 0)
  • .menu { color: green; } 的权重为 (0, 0, 1, 0)
  • div { color: blue; } 的权重为 (0, 0, 0, 1)

因此,最终会应用 #header { color: red; },因为它的权重最大,红色会覆盖其他颜色。

结语✒️

在编写 CSS 时,尽量避免使用过多的高权重选择器,尤其是 ID 选择器,以保持样式的可维护性。如果你遇到样式覆盖问题,首先检查选择器的权重,确保它们按正确的顺序排列。🫰🏻

猫抓爱心 (2).gif