首页 > 其他分享 >CSS优先级

CSS优先级

时间:2022-11-28 22:24:46浏览次数:43  
标签:10 优先级 权重 样式 声明 选择器 CSS

以前我对css优先级的理解很浅,一直以为id选择器最高,并且当出现class="a b c"时,优先级c>b>a。后来又错误地理解为a、b、c三者的优先级高低是根据出现的先后次序来的,后出现的会覆盖先出现的。为此产生了不少bug。于是今天就来把这个问题给搞清楚了。

在讲css优先级之前,先明确几个重要术语(来自css2.1规范):

  • 规则集:由选择器和后跟的声明块组成。
  • 声明:即css属性的键值对,比如color: red;就是一个声明。
  • 内联样式:定义在标签元素的style属性中。
  • 内部样式:定义在<style>标签中。
  • 外部样式:定义在通过<link>标签引入的css文件中。

我们所说的优先级,其实指的是“声明”这个粒度的优先级。

好,接下来进入正题。首先是最顶层的优先级:

  • 使用!important的声明优先级最高。
  • 内联样式中的声明其次。
  • 内部样式、外部样式中的声明再次。
  • 通过继承获得的声明最次。

为什么内部样式和外部样式的声明放在一起说呢,因为它们都是用了选择器来给dom元素施加样式的,它们应用同一套优先级计算规则。

我们在日常编程中,经常会遇到一个规则集的选择器部分由多个选择器组成,比如:

<style>
  #header .nav li>a {
    color: red;
  }
  .nav-item>a {
    color: blue;
  }
</style>

<div id="header">
  <ul class="nav">
    <li class="nav-item">
      <a>导航1</a>
    </li>
  </ul>
</div>

如果一个标签元素同时被多个规则集匹配,且其中出现同样的属性时,该如何确定优先级呢?

首先看一张表:

选择器 权重 代码
标签选择器 1 div{}
类选择器 10 .text{}
伪类选择器 10 :hover{}
伪元素选择器 10 :first-line{}
属性选择器 10 [value]{}
id选择器 100 #text{}

内联样式中的声明权重是1000,继承的声明权重是0。

对于上面例子中两个规则集中哪个color声明的优先级高,需要计算它们各自选择器的权重。计算如下:

#header .nav li>a = 100 + 10 + 1 + 1 = 112
.nav-item>a = 10 + 1 = 11

注意,10个标签选择器的权重比1个类选择器的权重低。

可以看出来,声明的权重计算规则就是将其所在规则集的选择器列表中所有选择器对应的权重加起来。那么这里显然#header .nav li>a的权重更高,所以文字最终为红色。

如果两个规则集的权重相同,那么根据就近原则。

知道了css优先级计算规则后,再遇到样式覆盖问题,就能比较好地切入解决了。

标签:10,优先级,权重,样式,声明,选择器,CSS
From: https://www.cnblogs.com/hdxg/p/16933834.html

相关文章

  • CSS样式
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><style>/*内部样式*/div{......
  • CSS中的选择器优先级考虑
    先来看个例子:css02.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>CSSid选择器</title><linkrel="stylesheet"type="text/css"h......
  • CSS中的定位——position属性
    CSS定位指的是改变元素在页面中的位置。CSS定位机制:普通流:元素按照其在HTML中的位置顺序决定排布的过程(也就是我不对元素进行定位的默认排布)浮动绝对布局CSS定位包含的属性......
  • CSS布局——定位
        1.定位的基本介绍     2.定位的基本使用3.静态定位          4.相对定位   注意事项:如果left和right都有则......
  • 优先级反转那些事儿
    作者:崔晓兵从一个线上问题说起最近在线上遇到了一些[HMDConfigManagerremoteConfigWithAppID:]卡死初步分析观察了下主线程堆栈,用到的锁是读写锁随后又去翻了下持......
  • 常用css属性flex: 1详解
    flex:1实际代表的是三个属性的简写flex-grow是用来增大盒子的,比如,当父盒子的宽度大于子盒子的宽度,父盒子的剩余空间可以利用flex-grow来设置子盒子增大的占比flex-shrin......
  • Vue3+Vite项目中 使用WindiCSS.
    之前工作有了解过根据类名来写元素的样式,一听就发出疑问:这样写项目可读性恐怕不是很好吧。。。  之后来到杭州工作后,开始使用WindiCSS后发现真香!!! 由于近期所写的项......
  • css 样式总结
    #css样式汇总*处理图片5px间距问题1.给父元素设置font-size:02.给img设置display:block3.给img设置vertical-align:bottom4.给......
  • 【Web技术】188-[译] 现代 JavaScript 与 CSS 滚动实现指南
    编者按:本文由sea_ljf翻译并发表于众成翻译平台,原标题“滑向未来(现代JavaScript与CSS滚动实现指南)”一些(网站)滚动的效果是如此令人着迷但你却不知该如何实现,本文将为......
  • Python 爬取单个网页所需要加载的URL地址和CSS、JS文件地址
    直接上代码:脱敏后自用的py采集代码,#!/usr/bin/envpython#-*-coding:utf-8-*-"""@author:Andy@file:xxx.py@time:下午05:50@desc:采集的文章数据进博客"""im......