001 CSS选择器

1/25/2022 CSS

不知道为什么编译出错,这篇文章我有发到掘金,那我就贴个掘金的链接吧

🔗 掘金链接 (opens new window)

# CSS 选择器

css 选择器主要归纳为以下几类

  • id 选择器(#box) - 选择id为box的元素

  • 类选择器(.one)- 选择类名为one的所有元素

  • 标签选择器(div)- 选择标签为div的所有元素

  • 后代选择器(#box div)- 选择id为box的元素内部所有的 div

  • 子选择器(#box > .one)- 选择父节点id为box的元素

  • 相邻同胞选择器(.one+.two)- 选择紧接在.one之后的所有.two元素

  • 群组选择器(div,p)- 选择div、p的所有元素

  • 伪类选择器

    :link :选择未被访问的链接
    :visited:选取已被访问的链接
    :active:选择活动链接
    :hover :鼠标指针浮动在上面的元素
    :focus :选择具有焦点的
    :first-child:父元素的首个子元素
    // css3
    :first-of-type 表示一组同级元素中其类型的第一个元素
    :last-of-type 表示一组同级元素中其类型的最后一个元素
    :only-of-type 表示没有同类型兄弟元素的元素
    :only-child 表示没有任何兄弟的元素
    :nth-child(n) 根据元素在一组同级中的位置匹配元素
    :nth-last-of-type(n) 匹配给定类型的元素,基于它们在一组兄弟元素中的位置,从末尾开始计数
    :last-child 表示一组兄弟元素中的最后一个元素
    :root 设置HTML文档
    :empty 指定空的元素
    :enabled 选择可用元素
    :disabled 选择被禁用元素
    :checked 选择选中的元素
    :not(selector) 选择与 <selector> 不匹配的所有元素
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
  • 伪元素选择器

    :first-letter :用于选取指定选择器的首字母
    :first-line :选取指定选择器的首行
    :before : 选择器在被选元素的内容前面插入内容
    :after : 选择器在被选元素的内容后面插入内容
    
    1
    2
    3
    4
  • 属性选择器

    [attribute] 选择带有attribute属性的元素
    [attribute=value] 选择所有使用attribute=value的元素
    [attribute~=value] 选择attribute属性包含value的元素
    [attribute|=value]:选择attribute属性以value开头的元素
    // css3
    [attribute*=value]:选择attribute属性值包含value的所有元素
    [attribute^=value]:选择attribute属性开头为value的所有元素
    [attribute$=value]:选择attribute属性结尾为value的所有元素
    
    1
    2
    3
    4
    5
    6
    7
    8

# CSS 权重

# 权重等级

  1. !important
  2. 行内样式
  3. ID选择器 (权重 100)
  4. class 、属性选择器、伪类选择器 (权重 10)
  5. 元素选择器和伪元素选择器(权重 1)
!important > 行内样式 > ID选择器 > 类选择器 | 属性选择器 | 伪类选择器 > 元素选择器 | 伪元素选择器
1

# 使用技巧

  1. 不推荐使用 !important ,容易导致很多权重问题,难以定位具体问题。权重更高的 !important 同样会覆盖 权重低的 !important, 比如:

    // ID 选择器会覆盖 类选择器
    #box {
        color: red !important;
    }
    .box {
        color: green !important;
    }
    
    1
    2
    3
    4
    5
    6
    7
  2. 即使是 行内样式 也会被 !important 覆盖

  3. 使用 10 个类选择器不等于可以覆盖 ID选择器样式

  4. 如果两个权重不同的选择器作用在同一元素上,权重值高的css规则生效

    .test #test{ } // id 100+class 10=110;
    .test #test span{} // id 100+class 10+span 1=111;
    .test #test .sonClass{} // id 100+class 10+class 10=120; //生效
    
    1
    2
    3
  5. 如果两个相同权重的选择器作用在同一元素上则后出现的生效

    #box span {
        color: red;
    }
    #app span { // 生效
        color: green;
    }
    
    1
    2
    3
    4
    5
    6
  6. 权重相同则距离近的生效

    <style type="text/css">
        #box span { // html头部的style标签离元素更新故而生效
            color: red;
        }
    </style>
    
    1
    2
    3
    4
    5

# 计算方法

到具体计算层面,我们先假定 A 、B、C、D 四个值,那么:

  • A:是否存在内联样式
  • B:ID 选择器出现的次数
  • C:class 、属性选择器、伪类选择器 出现的次数
  • D:元素选择器和伪元素选择器 出现的次数

举例说明:

#box > ul > li > a.nav-link
1

套用上面的算法,依次求出 A B C D 的值:

  • 因为没有内联样式 ,所以 A = 0
  • ID选择器总共出现了1次, B = 1
  • 类选择器出现了1次, 属性选择器出现了0次,伪类选择器出现0次,所以 C = (1 + 0 + 0) = 1
  • 标签选择器出现了3次, 伪元素出现了0次,所以 D = (3 + 0) = 3

上面算出的ABCD 可以简记作:(0, 1, 1, 3)

知道了优先级是如何计算之后,就来看看比较规则:

  • 从左往右依次进行比较 ,较大者优先级更高
  • 如果相等,则继续往右移动一位进行比较
  • 如果4位全部相等,则后面的会覆盖前面的

# 建议:

  1. 避免使用!important
  2. 利用id增加选择器权重
  3. 减少选择器的个数(避免层层嵌套)
Last Updated: 1/25/2022, 4:33:36 PM