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)基础选择器
- 通配符:
* - 标签:
div、p - 类:
.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)“大概率可继承”的类别(记类别,不背全量清单)
- 字体与文字:
color、font-*、line-height、letter-spacing、word-spacing、text-align、text-indent、text-transform、white-space - 列表:
list-style-* - 可见性:
visibility - 光标:
cursor
2)“大概率不继承”的类别
- 盒模型:
margin/padding/border - 背景:
background-* - 布局:
display/position/float/clear、width/height、top/left/right/bottom、z-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。