跳到主要内容

CSS 选择符有哪些?哪些属性可以继承

面试速答(30 秒版 TL;DR)

  • 选择器(selector)可以分为:基础选择器(标签/类/ID/通配符)、属性选择器组合器(后代/子代/兄弟)、伪类伪元素、以及 :not/:is/:where/:nth-* 等函数式伪类。
  • 继承(inheritance)的规律:文字排版相关的多继承color/font/line-height/text-* 等),盒模型/布局相关的多不继承margin/padding/border/width/display/position 等)。
  • 想强制改变继承行为:用关键字 inherit / initial / unset / revert

一、CSS 选择器有哪些(按面试常见分类讲)

更细的权重与层叠追问,可接到:Specificity 与层叠规则

1)基础选择器

  • 通配符:*
  • 标签:divp
  • 类:.card
  • ID:#app

2)属性选择器

  • 存在:[disabled]
  • 等值:[type="text"]
  • 前缀/后缀/包含:[data-id^="a"] / [data-id$="z"] / [data-id*="xx"]

3)组合器(选择器关系)

  • 后代:A B
  • 子代:A > B
  • 相邻兄弟:A + B
  • 通用兄弟:A ~ B

4)伪类(pseudo-class):选“状态/结构”

常见:

  • 交互状态::hover:active:focus:focus-visible
  • 表单状态::disabled:checked:invalid
  • 结构::first-child:nth-child(2n):not(...)
  • 逻辑分组::is(...):where(...)(区别主要在权重)
  • 关系选择::has(...)(现代浏览器可用,旧环境需评估)

5)伪元素(pseudo-element):选“元素的一部分/生成盒子”

常见:

  • ::before / ::after
  • ::first-line / ::first-letter
  • ::placeholder / ::marker / ::selection

二、哪些属性可以继承(怎么背才面试好用)

1)“大概率可继承”的类别(记类别,不背全量清单)

  • 字体与文字:colorfont-*line-heightletter-spacingword-spacingtext-aligntext-indenttext-transformwhite-space
  • 列表:list-style-*
  • 可见性:visibility
  • 光标:cursor

2)“大概率不继承”的类别

  • 盒模型:margin/padding/border
  • 背景:background-*
  • 布局:display/position/float/clearwidth/heighttop/left/right/bottomz-index
  • 视觉效果:box-shadow(不继承)

3)面试加分点:不继承但会“影响子树”的属性

  • opacity 不继承,但会让整个元素及其内容一起变透明(因为它作用于合成结果)。
  • transform/filter 同理:不继承,但对元素的渲染结果(包含子内容)整体生效。

三、控制继承的 4 个关键字(高频追问)

  • inherit:强制继承父元素该属性的计算值(即使它默认不继承)。
  • initial:设置为该属性的初始值。
  • unset:如果属性默认可继承则等同 inherit,否则等同 initial
  • revert:回退到“更低优先级来源”的值(常用于撤销作者样式,回到 UA/用户样式或更低层级)。

典型题 & 标准答法

Q1:为什么我给父元素设了 color,子元素也变色了?

:因为 color 是可继承属性,子元素没有显式设置时会继承父元素的计算值。

Q2:为什么 margin 不会继承?

margin 属于盒模型属性,默认不继承;如果需要类似效果,应显式给子元素设置,或用布局容器统一控制间距(如 gap)。


易错点/坑

  • 把“继承”和“层叠覆盖”混为一谈:继承发生在“没有指定值”时;层叠发生在“有多个候选声明”时。
  • line-height 的继承细节:line-height: 1.5(纯数字)会让子元素按自身字号缩放,更推荐(细节见:line-height 三种赋值区别)。

速记要点(可背诵)

  • 选择器:基础/属性/组合器/伪类/伪元素/函数式伪类。
  • 继承:文字相关多继承,盒模型布局多不继承;控制用 inherit/initial/unset/revert