2026 年 CSS 面试重点有哪些?

  • 重点不只是盒模型、居中和 BFC,还包括现代布局、容器查询、级联层、:has()、CSS 嵌套、@scope、动画性能和工程治理。
  • 面试更看重你能不能解释“为什么这样写更稳”,以及如何处理复杂项目里的样式冲突、性能和兼容性。

CSS 的核心能力是什么?

  • CSS 负责描述页面表现,包括布局、排版、颜色、动画、响应式和视觉状态。
  • 现代 CSS 已经从“写样式”扩展到组件作用域、设计系统、主题变量和交互状态管理。

CSS 级联由哪些因素决定?

  • 主要由来源、重要性、级联层、选择器优先级、作用域距离和源码顺序共同决定。
  • 不要只背“id 大于 class”,现代 CSS 还要理解 @layer@scope

CSS 优先级怎么计算?

  • 通常按内联样式、ID、类/属性/伪类、标签/伪元素来比较。
  • 同级优先级相同时,后声明的规则覆盖先声明的规则。

!important 为什么要少用?

  • 它会提高声明重要性,让后续覆盖变困难。
  • 大型项目中滥用 !important 会让样式系统失控,应优先用层级、作用域和结构解决。

@layer 是什么?

  • @layer 是 CSS 级联层,用于显式管理不同样式来源的优先级。
  • 它适合组织 reset、基础样式、组件样式、工具类和业务覆盖层。

@layer 和选择器优先级是什么关系?

  • 在同一来源下,层级顺序会先于选择器优先级参与比较。
  • 低层里的高优先级选择器,也可能输给高层里的低优先级选择器。

@layer 适合解决什么问题?

  • 适合解决第三方样式、组件库样式、工具类样式和业务覆盖之间的冲突。
  • 它让团队不用靠不断加长选择器或堆 !important 来抢优先级。

@scope 是什么?

  • @scope 可以把选择器限制在指定 DOM 子树内生效。
  • 它能减少选择器和页面结构的耦合,也能降低局部样式污染。

@scope 和 CSS Modules 有什么区别?

  • @scope 是浏览器原生 CSS 作用域能力,围绕 DOM 范围限制选择器。
  • CSS Modules 是构建期方案,通过类名哈希或映射实现局部样式。

@scope 适合什么场景?

  • 适合局部区域样式、内容区样式、主题片段、第三方 HTML 包裹区域。
  • 如果需要组件级强隔离,仍可能配合 CSS Modules、Shadow DOM 或框架 scoped CSS。

CSS 嵌套是什么?

  • CSS Nesting 允许在一个选择器内部写子选择器,让相关规则放在一起。
  • 它能提升可读性,但嵌套过深会增加维护成本。

CSS 嵌套中的 & 表示什么?

  • & 表示外层选择器本身。
  • 写伪类、修饰类、相邻兄弟、组合选择器时经常需要显式使用 &

CSS 原生嵌套和 Sass 嵌套一样吗?

  • 不完全一样,原生 CSS 嵌套有自己的解析规则。
  • 迁移 Sass 时要特别检查 &、类型选择器拼接和嵌套层级。

CSS 嵌套为什么不建议太深?

  • 嵌套太深会让选择器变长、优先级变高、复用变难。
  • 通常两到三层比较可控,更深时应考虑拆组件或调整类名结构。

:has() 是什么?

  • :has() 是关系伪类,可以根据元素内部或相邻关系反向选择父级或祖先。
  • 它常被称为“父选择器”,但能力不只限于选择父元素。

:has() 常见使用场景有哪些?

  • 表单有错误时高亮外层容器、卡片包含图片时改变布局、导航项包含当前链接时加样式。
  • 也可用于纯 CSS 状态联动,但复杂交互仍应交给 JS。

:has() 会不会影响性能?

  • 现代浏览器已做优化,但复杂、宽泛的 :has() 仍可能增加样式计算成本。
  • 应尽量限定范围,比如 .form-field:has(input:invalid)body:has(...) 更可控。

:is() 和 :where() 有什么区别?

  • :is() 的优先级取参数列表中最高的选择器。
  • :where() 的优先级永远为 0,适合写 reset、基础样式和可覆盖规则。

:not() 在现代 CSS 中有什么变化?

  • 现代 :not() 可以接受复杂选择器列表。
  • 它的优先级由参数中最高优先级选择器决定。

:focus-visible 和 :focus 有什么区别?

  • :focus 表示元素获得焦点。
  • :focus-visible 只在浏览器判断需要可见焦点提示时匹配,更适合键盘可访问性。

:user-valid 和 :user-invalid 有什么用?

  • 它们用于表单校验状态,但更关注用户交互后的结果。
  • 相比一开始就用 :invalid,可以减少页面初始状态全红的问题。

选择器写得越短越好吗?

  • 不一定,选择器要在可读、可维护、可覆盖之间平衡。
  • 现代项目更推荐语义化类名、低优先级选择器和清晰作用域。

BFC 是什么?

  • BFC 是块级格式化上下文,是一块独立布局区域。
  • 它能影响浮动、外边距折叠和高度计算。

如何触发 BFC?

  • 常见方式有 overflow: hidden/autodisplay: flow-root、浮动、绝对定位、inline-block、flex/grid item 等。
  • 现代写法优先考虑 display: flow-root,语义更明确。

display: flow-root 有什么用?

  • 它可以创建新的 BFC。
  • 常用于清除浮动、阻止外边距折叠,比使用 overflow 副作用更少。

标准盒模型和 IE 盒模型有什么区别?

  • 标准盒模型中 width 只包含 content。
  • box-sizing: border-box 下,width 包含 content、padding 和 border。

为什么项目里常用 box-sizing: border-box?

  • 它让元素总宽高更容易预测。
  • 在响应式布局和组件封装中更不容易因为 padding 撑破容器。

margin 折叠是什么?

  • 垂直方向相邻块级元素的 margin 可能合并成一个 margin。
  • 常见于父子元素、相邻兄弟和空块元素。

怎么避免 margin 折叠?

  • 可以创建 BFC、加 padding/border、使用 flex/grid 布局或改用 gap。
  • 现代布局中用 gap 管理间距通常更稳定。

CSS 中 px、em、rem 有什么区别?

  • px 是 CSS 像素,em 相对当前元素字体大小,rem 相对根元素字体大小。
  • rem 适合全局缩放,em 适合组件内部随字体比例变化。

vw、vh、svh、lvh、dvh 有什么区别?

  • vh 是传统视口高度单位,在移动端会受浏览器工具栏影响。
  • svh 表示小视口,lvh 表示大视口,dvh 表示动态视口,更适合移动端适配。

为什么移动端 100vh 可能有问题?

  • 浏览器地址栏显示和收起会改变可视区域。
  • 现代项目可以根据场景使用 100dvh100svh 或 JS 兜底。

CSS 逻辑属性是什么?

  • 逻辑属性基于书写方向描述布局,比如 margin-inlinepadding-blockinset-inline-start
  • 它比 left/right/top/bottom 更适合国际化和 RTL 布局。

逻辑属性适合什么场景?

  • 适合多语言、横竖排、RTL/LTR 切换和设计系统。
  • 它能减少不同书写方向下重复写样式。

Flex 布局适合什么场景?

  • Flex 适合一维布局,也就是主要处理一行或一列的排列。
  • 常用于导航、工具栏、按钮组、表单行和垂直居中。

Grid 布局适合什么场景?

  • Grid 适合二维布局,可以同时控制行和列。
  • 常用于页面骨架、卡片网格、复杂面板和响应式区域布局。

Flex 和 Grid 怎么选择?

  • 一维排列优先 Flex,二维布局优先 Grid。
  • 实际项目中二者经常组合使用,不需要二选一。

flex: 1 表示什么?

  • 通常等价于 flex: 1 1 0%
  • 元素可放大、可缩小,并以 0 作为基础尺寸参与剩余空间分配。

flex-basis 和 width 有什么区别?

  • flex-basis 是 flex 主轴方向上的初始尺寸。
  • 在 flex 布局中,空间分配通常优先看 flex-basis,而不是简单看 width。

flex-shrink 为什么会导致文字被挤压?

  • 默认 flex-shrink: 1,空间不足时元素会缩小。
  • 对不希望压缩的元素可设置 flex-shrink: 0,同时给文本区域处理省略。

min-width: 0 在 flex 中有什么用?

  • flex item 默认最小宽度可能由内容撑开。
  • 设置 min-width: 0 可以允许内容区域真正收缩,常用于文本省略。

gap 和 margin 做间距有什么区别?

  • gap 是容器控制子项之间的间距,不影响外侧边缘。
  • margin 是元素自身外边距,容易出现首尾额外间距和折叠问题。

Grid 的 fr 单位是什么?

  • fr 表示可用空间的一份。
  • 它适合构建自适应列宽,比如 grid-template-columns: 1fr 2fr

repeat、auto-fill、auto-fit 有什么区别?

  • repeat() 用于重复轨道定义。
  • auto-fill 会保留可容纳的空轨道,auto-fit 会折叠空轨道让已有项撑满。

minmax() 常用来做什么?

  • minmax() 用于限制 Grid 轨道的最小和最大尺寸。
  • 常见写法是 repeat(auto-fit, minmax(240px, 1fr)) 实现响应式卡片。

subgrid 是什么?

  • subgrid 允许子网格沿用父网格的行或列轨道。
  • 它适合卡片列表、表单布局、复杂排版中跨组件对齐。

subgrid 解决了什么问题?

  • 它让嵌套元素也能和外层网格线对齐。
  • 过去这类对齐往往需要重复定义 grid 或依赖 JS 计算。

容器查询是什么?

  • 容器查询允许组件根据父容器尺寸变化,而不是只根据视口变化。
  • 它更适合组件化布局,因为同一个组件可在不同容器中自适应。

容器查询和媒体查询有什么区别?

  • 媒体查询看视口或设备条件。
  • 容器查询看某个容器的尺寸、样式或滚动状态,更贴近组件实际可用空间。

container-type 有什么用?

  • 它声明元素成为可查询容器。
  • 常见值有 inline-sizesize,多数响应式组件用 inline-size

container-name 有什么用?

  • 它给容器命名,方便 @container 名称 (...) 精确匹配。
  • 大型页面中命名容器能避免查询到错误的上级容器。

容器查询单位有哪些?

  • 常见有 cqwcqhcqicqbcqmincqmax
  • 它们相对查询容器尺寸,适合组件内部字号和间距自适应。

样式查询是什么?

  • 样式查询是容器查询的一类,可根据容器的样式条件应用规则。
  • 目前最常见的实践方向是结合 CSS 自定义属性做组件状态和主题变体。

CSS 自定义属性是什么?

  • 也叫 CSS 变量,通过 --name 定义,用 var(--name) 使用。
  • 它运行在浏览器级联体系里,天然支持继承、覆盖和主题切换。

CSS 变量和 Sass 变量有什么区别?

  • Sass 变量是构建期变量,编译后不存在。
  • CSS 变量是运行时变量,可以被 JS 修改,也可以随级联和媒体查询动态变化。

CSS 变量适合做什么?

  • 适合主题色、间距、圆角、阴影、组件状态和设计 token。
  • 大型项目中它是设计系统和多主题能力的重要基础。

var() 的 fallback 是什么?

  • var(--color, red) 中的 red 是 fallback。
  • 当变量不存在或无效时,浏览器会使用 fallback。

@property 是什么?

  • @property 可以注册 CSS 自定义属性的语法、继承行为和初始值。
  • 注册后变量可以更稳定地参与动画和类型校验。

@property 为什么能让 CSS 变量动画更自然?

  • 未注册的自定义属性通常按离散值变化。
  • 注册语法后,浏览器知道它是颜色、长度或数字,就能进行插值动画。

prefers-color-scheme 有什么用?

  • 它用于检测用户系统的浅色或深色主题偏好。
  • 常用于自动切换暗黑模式,并配合手动主题开关。

color-scheme 有什么用?

  • 它告诉浏览器页面支持哪些配色方案。
  • 表单控件、滚动条、默认背景等浏览器 UI 可以随主题适配。

prefers-reduced-motion 有什么用?

  • 它用于识别用户是否希望减少动画。
  • 对晕动敏感用户,应减少大幅移动、自动播放和复杂视差动画。

prefers-contrast 有什么用?

  • 它用于识别用户是否偏好更高或更低对比度。
  • 可访问性要求高的项目可基于它优化主题和边框。

CSS 颜色函数有哪些新趋势?

  • 现代 CSS 支持更多颜色空间和函数,比如 oklch()lab()color-mix()
  • 它们更适合做感知均匀的主题色、渐变和暗黑模式。

oklch() 有什么优势?

  • oklch() 更接近人眼感知,调整亮度和色度更自然。
  • 设计系统中用它生成色阶,通常比单纯 HSL 更稳定。

color-mix() 可以做什么?

  • 它可以在 CSS 中混合两种颜色。
  • 常用于 hover 色、禁用色、透明叠加和主题衍生色。

currentColor 是什么?

  • currentColor 表示当前元素的 color 值。
  • 它常用于图标、边框、阴影和 SVG,使颜色跟随文本继承。

现代 CSS 如何实现暗黑模式?

  • 用 CSS 变量承载设计 token,再通过类名、data 属性或媒体查询切换变量值。
  • 同时配置 color-scheme,让原生控件也适配主题。

响应式设计常用策略有哪些?

  • 使用流式布局、弹性单位、媒体查询、容器查询、图片响应式和合理断点。
  • 组件级响应式更推荐容器查询,页面级响应式仍常用媒体查询。

移动端适配应该注意什么?

  • 注意视口单位、安全区域、点击区域、字体缩放、图片清晰度和横竖屏。
  • 刘海屏和底部手势区域要结合 env(safe-area-inset-*)

env(safe-area-inset-*) 是什么?

  • 它用于读取设备安全区域边距。
  • 常用于 iPhone 刘海屏、底部导航、沉浸式页面的 padding 适配。

响应式图片有哪些方案?

  • 使用 srcsetsizespicture、现代图片格式和懒加载。
  • CSS 侧要给图片预留尺寸,避免布局偏移。

object-fit 有什么用?

  • 它控制替换元素内容如何适配容器,比如图片和视频。
  • 常见值有 covercontainfillnonescale-down

aspect-ratio 有什么用?

  • 它可以直接声明元素宽高比。
  • 常用于卡片封面、视频容器、头像、骨架屏,能减少布局抖动。

line-clamp 如何实现多行省略?

  • 常用 display: -webkit-box-webkit-line-clamp-webkit-box-orient: vertical
  • 新语法在演进,但实际项目仍要关注浏览器兼容性。

单行文本省略怎么写?

  • 设置 overflow: hiddenwhite-space: nowraptext-overflow: ellipsis
  • 在 flex 子项中经常还需要 min-width: 0

文本换行相关属性有哪些?

  • 常见有 white-spaceoverflow-wrapword-breakhyphens
  • 中英文混排、长 URL、代码块和表格内容要分别处理。

position: sticky 为什么不生效?

  • 常见原因是祖先元素 overflow 限制、没有设置 top/left 等偏移、容器高度不足。
  • sticky 的参照和滚动容器有关,不是简单固定在视口。

fixed 和 sticky 有什么区别?

  • fixed 相对视口固定,脱离普通文档流。
  • sticky 在阈值前按普通布局,达到阈值后在滚动容器内粘住。

z-index 为什么有时不生效?

  • z-index 只在定位元素或特定布局上下文中有效。
  • 还可能被新的层叠上下文限制,子元素再高也出不去父级上下文。

什么会创建层叠上下文?

  • 常见有 position + z-index、opacity 小于 1、transform、filter、isolation、contain、will-change 等。
  • 排查遮挡问题时要先找层叠上下文边界。

isolation: isolate 有什么用?

  • 它可以显式创建新的层叠上下文。
  • 常用于组件隔离,避免内部 z-index 和外部元素互相干扰。

contain 属性有什么用?

  • contain 告诉浏览器某个元素的布局、绘制、尺寸或样式影响被限制在内部。
  • 它可帮助浏览器优化渲染,也可减少复杂组件对外部布局的影响。

content-visibility 有什么用?

  • 它允许浏览器跳过屏幕外内容的渲染工作。
  • 长列表、长文章、复杂卡片区域可以用它改善首屏和滚动性能。

contain-intrinsic-size 有什么用?

  • 它给尚未渲染的内容提供一个占位尺寸。
  • 常和 content-visibility: auto 配合,减少滚动时布局跳动。

will-change 应该怎么用?

  • 它提示浏览器某些属性即将变化,可能提前做优化。
  • 不应长期大量使用,否则会增加内存和合成层成本。

CSS 动画性能应该关注哪些属性?

  • 优先动画 transformopacity
  • 避免频繁动画 width、height、top、left、box-shadow 等容易触发布局或绘制的属性。

transition 和 animation 有什么区别?

  • transition 适合状态 A 到状态 B 的过渡。
  • animation 适合关键帧、多阶段、循环或更复杂的动画。

transition-behavior 是什么?

  • 它允许离散属性参与过渡,比如 display、overlay 等场景。
  • 常和 @starting-style、popover、dialog 入场离场动画一起使用。

@starting-style 是什么?

  • 它用于定义元素第一次应用样式或从 display none 出现时的过渡起始状态。
  • 没有它时,某些入场动画可能直接跳到最终状态。

display: none 为什么以前不能直接过渡?

  • display 是离散属性,不像 opacity 那样有连续中间值。
  • 现代 CSS 可结合 transition-behavior: allow-discrete@starting-style 改善部分场景。

View Transitions API 和 CSS 有什么关系?

  • View Transitions 提供页面或状态切换时的视觉过渡能力。
  • CSS 通过伪元素和动画规则控制旧视图、新视图的过渡效果。

Scroll-driven Animations 是什么?

  • 它让动画进度由滚动位置驱动,而不是由时间驱动。
  • 常用于阅读进度、滚动联动、视差和元素进入视口动画。

scroll-snap 有什么用?

  • 它让滚动容器停靠到指定位置。
  • 常用于轮播、横向卡片列表、章节滚动和移动端分页体验。

overscroll-behavior 有什么用?

  • 它控制滚动到边界时是否继续传递滚动链。
  • 常用于弹窗、抽屉、内嵌滚动区域,避免背景跟着滚动。

overflow-anchor 是什么?

  • 它控制浏览器滚动锚定行为。
  • 当上方内容动态插入导致页面跳动时,可以通过它调整或关闭锚定。

backdrop-filter 有什么用?

  • 它对元素背后的区域应用模糊、亮度等滤镜。
  • 常用于毛玻璃效果,但要注意性能和可读性。

filter 和 backdrop-filter 有什么区别?

  • filter 作用于元素自身内容。
  • backdrop-filter 作用于元素背后的背景区域。

clip-path 适合做什么?

  • 它可以裁剪元素形状,比如多边形、圆形、复杂遮罩。
  • 适合视觉效果,但复杂裁剪可能带来绘制成本。

mask 和 clip-path 有什么区别?

  • clip-path 更偏几何裁剪。
  • mask 可以根据透明度或图像控制显示区域,表达能力更强。

mix-blend-mode 有什么用?

  • 它控制元素与背景的颜色混合方式。
  • 常用于视觉设计,但要注意层叠上下文、性能和可读性。

CSS 中 calc() 有什么用?

  • 它可以在 CSS 中做长度、百分比、变量等混合计算。
  • 常用于响应式布局、固定栏加流式内容、设计 token 派生。

min()、max()、clamp() 有什么区别?

  • min() 取较小值,max() 取较大值。
  • clamp(min, preferred, max) 把值限制在最小和最大之间。

clamp() 常用在哪?

  • 常用于响应式字号、容器宽度、间距和图片尺寸。
  • 它能减少大量媒体查询,但不要用 viewport 宽度直接无限缩放字体。

CSS 三角形怎么实现?

  • 传统方式是用宽高为 0 的元素和透明边框。
  • 现代项目也可用 clip-path 或 SVG,语义和可维护性更好。

水平垂直居中有哪些方式?

  • Flex、Grid、绝对定位加 transform、line-height、margin auto 都可以。
  • 现代布局优先用 flex 或 grid,语义简单且适配性好。

如何实现两栏布局?

  • 固定侧栏加自适应主区可以用 flex、grid 或 calc。
  • Grid 写法通常更清晰,比如 grid-template-columns: 240px 1fr

如何实现三栏布局?

  • 可用 Grid:grid-template-columns: 240px 1fr 320px
  • 旧方案如圣杯布局、双飞翼布局现在更多是理解历史和布局原理。

等高列怎么实现?

  • Flex 和 Grid 天然适合等高布局。
  • 不建议再依赖 padding/margin hack 做复杂等高列。

Sticky Footer 怎么实现?

  • 可以用 flex column,让 main 区域 flex: 1
  • 也可以用 Grid 定义 auto 1fr auto 三行布局。

CSS 如何实现毛玻璃效果?

  • 常用半透明背景配合 backdrop-filter: blur(...)
  • 要保证背景对比度和文本可读性,必要时加纯色兜底。

CSS 如何实现骨架屏?

  • 用背景色块模拟内容区域,再用渐变动画制造加载感。
  • 注意动画不要过重,并尊重 prefers-reduced-motion

CSS 如何实现主题切换?

  • 用 CSS 变量定义颜色、间距、阴影等 token。
  • 通过 html[data-theme="dark"] 或媒体查询覆盖变量。

CSS 如何实现响应式卡片?

  • 可以用 Grid 的 repeat(auto-fit, minmax(...))
  • 卡片内部再结合容器查询处理标题、图片和按钮布局。

CSS 如何实现瀑布流?

  • 传统可用 CSS columns,但顺序是按列流动。
  • 新的 masonry 布局仍需关注浏览器支持,生产中常用 JS 或降级方案。

CSS 如何隐藏元素但保留可访问性?

  • 可使用 visually-hidden 模式,让元素视觉隐藏但仍可被屏幕阅读器读取。
  • display: nonevisibility: hidden 通常会让辅助技术也不可见。

display: none 和 visibility: hidden 有什么区别?

  • display: none 不占布局空间。
  • visibility: hidden 仍占布局空间,但视觉不可见。

opacity: 0 和 visibility: hidden 有什么区别?

  • opacity: 0 元素透明但仍可点击、可聚焦,除非额外处理 pointer-events 等。
  • visibility: hidden 通常不可见且不可交互,但仍占空间。

pointer-events: none 有什么用?

  • 它让元素不响应鼠标或触摸事件。
  • 常用于穿透遮罩、禁用装饰层点击,但不要误伤可访问交互。

CSS 可访问性要关注什么?

  • 关注颜色对比度、焦点样式、减少动画、字体可读性、点击区域和语义结构配合。
  • CSS 不应去掉键盘用户所需的焦点提示。

为什么不要随便 outline: none?

  • outline 是键盘用户识别焦点位置的重要提示。
  • 如果去掉默认 outline,必须提供清晰的自定义 :focus-visible 样式。

rem 布局和 viewport 布局怎么选?

  • rem 适合跟随根字号的整体缩放。
  • viewport 单位适合和视口强相关的尺寸,但要注意移动端地址栏和极端屏幕。

CSS 工程化如何避免全局污染?

  • 可以使用命名规范、CSS Modules、Vue scoped、Shadow DOM、@scope、@layer。
  • 对全局 reset、工具类、主题变量要有明确边界。

BEM 命名法解决什么问题?

  • BEM 通过 Block、Element、Modifier 表达组件结构和状态。
  • 它降低选择器耦合,适合无构建隔离或团队协作的大型 CSS。

CSS Modules 的优缺点是什么?

  • 优点是局部作用域、类名冲突少、适合组件化。
  • 缺点是全局覆盖和主题联动需要额外约定。

CSS-in-JS 的优缺点是什么?

  • 优点是样式和组件状态结合紧密,适合动态主题和组件封装。
  • 缺点可能是运行时成本、SSR 配置复杂、调试和缓存不如静态 CSS 直接。

Tailwind CSS 的优势是什么?

  • 它通过原子类减少自定义 CSS,提升样式复用和一致性。
  • 配合设计 token 和构建裁剪,适合快速开发组件化界面。

Tailwind 的风险是什么?

  • 类名过长会影响可读性,复杂状态可能堆叠很多工具类。
  • 团队需要统一抽象边界,避免所有样式都散落在模板里。

原子化 CSS 和传统 CSS 怎么选?

  • 原子化 CSS 适合快速组合和规模化一致性。
  • 传统 CSS 更适合复杂语义样式、内容排版和需要强表达的视觉区域。

CSS reset 和 normalize 有什么区别?

  • reset 倾向清除浏览器默认样式。
  • normalize 倾向保留合理默认值并修正浏览器差异。

现代项目还需要 CSS reset 吗?

  • 通常仍需要,但应保持克制。
  • 可以用 :where() 降低 reset 优先级,避免影响组件覆盖。

PostCSS 是什么?

  • PostCSS 是 CSS 转换工具平台,本身负责解析和转换流程。
  • autoprefixer、cssnano、postcss-preset-env、移动端单位转换等都是常见插件。

Autoprefixer 根据什么添加前缀?

  • 它根据 Browserslist 配置判断需要兼容哪些浏览器。
  • 团队应统一 Browserslist,避免本地、构建和 CSS 兼容目标不一致。

CSS 压缩主要做什么?

  • 删除空白、合并规则、缩短颜色、优化重复声明。
  • 压缩要避免破坏 CSS 变量、calc、现代颜色函数和兼容性 hack。

CSS Tree Shaking 是什么?

  • 它尝试移除未使用的 CSS 规则。
  • 动态类名、富文本、第三方组件和运行时拼接会让误删风险变高。

PurgeCSS 类工具要注意什么?

  • 要把动态类名加入 safelist。
  • 对 CMS 内容、Markdown、组件库样式和运行时生成类名要特别谨慎。

CSS 代码分割有什么意义?

  • 按路由或组件拆分 CSS 可以减少首屏样式体积。
  • 但拆太细可能增加请求和样式闪烁风险。

CSS 加载会阻塞渲染吗?

  • 普通外链 CSS 通常会阻塞页面渲染,浏览器需要 CSSOM 才能正确绘制。
  • 关键 CSS 内联、非关键 CSS 延迟加载可以改善首屏。

Critical CSS 是什么?

  • Critical CSS 是首屏渲染必须的最小 CSS。
  • 把它内联到 HTML 可减少首屏阻塞请求,但要控制内联体积。

FOUC 是什么?

  • FOUC 是无样式内容闪烁,页面先显示未应用样式的内容。
  • 常见原因是 CSS 加载延迟、SSR 样式注入顺序错误或异步样式切换。

CSS 动画为什么可能导致卡顿?

  • 如果动画触发布局、绘制或大量合成层,会占用主线程和 GPU 资源。
  • 优先使用 transform、opacity,并减少同时动画的元素数量。

重排和重绘有什么区别?

  • 重排是布局几何信息变化,需要重新计算布局。
  • 重绘是视觉样式变化但布局不变,比如颜色、背景变化。

哪些 CSS 属性容易触发重排?

  • width、height、margin、padding、top、left、font-size、display 等可能触发布局。
  • transform 通常不触发布局,更适合动画。

CSS 如何影响 LCP?

  • 阻塞 CSS、字体加载、首屏大图样式、隐藏首屏内容都可能影响 LCP。
  • 优化重点是关键 CSS、资源优先级、图片尺寸和首屏渲染路径。

CSS 如何影响 CLS?

  • 图片无尺寸、字体替换、异步样式加载、广告位无占位都可能造成布局偏移。
  • 提前设置尺寸、用 aspect-ratio 和稳定占位能降低 CLS。

字体加载会带来什么问题?

  • 可能出现 FOIT、FOUT 和布局偏移。
  • 可以用 font-display、预加载关键字体、子集化和合理 fallback 优化。

font-display 有哪些常见值?

  • 常见有 auto、block、swap、fallback、optional。
  • 业务中常用 swap 或 optional,在可读性和视觉稳定之间权衡。

可变字体是什么?

  • 可变字体用一个字体文件支持多个字重、宽度或轴。
  • 它能减少字体文件数量,但单文件体积和浏览器支持仍要评估。

line-height 为什么建议不用纯像素?

  • 相对值或无单位 line-height 更容易随字体缩放。
  • 无单位 line-height 可继承比例,组件适配更稳定。

CSS 中 inherit、initial、unset、revert 有什么区别?

  • inherit 强制继承父级,initial 回到规范初始值。
  • unset 对可继承属性表现为 inherit,对不可继承属性表现为 initial;revert 回到上一层来源的值。

revert-layer 是什么?

  • 它把属性回退到当前级联层之前的结果。
  • 常用于和 @layer 配合,撤销某一层的声明。

all 属性有什么用?

  • all 可以一次性重置除 unicode-bidi、direction 等少数属性外的大部分属性。
  • 适合隔离组件,但使用不当会破坏继承和可访问性。

Shadow DOM 对 CSS 有什么影响?

  • Shadow DOM 提供样式封装边界,外部样式默认进不去,内部样式默认出不来。
  • 可通过 CSS 自定义属性、part、theme 等机制暴露可定制接口。

::part 是什么?

  • ::part() 允许外部页面给 Web Component 暴露出来的内部部件加样式。
  • 它是 Shadow DOM 组件可主题化的重要能力。

::slotted 是什么?

  • ::slotted() 用于选择插槽传入的元素。
  • 它只能选择 slotted 元素本身,不能深入选择其内部后代。

Popover 和 CSS 有什么关系?

  • 原生 Popover 元素进入 top layer 后,可通过 :popover-open::backdrop 等样式控制表现。
  • 配合 @starting-style 和离散过渡可以实现更自然的出现和关闭动画。

dialog 的 ::backdrop 有什么用?

  • ::backdrop 用于控制对话框背后的遮罩层。
  • 它也适用于 fullscreen、popover 等 top layer 场景中的背景层。

top layer 是什么?

  • top layer 是浏览器用于显示 dialog、popover、fullscreen 等元素的特殊层。
  • 它通常高于普通 z-index 层叠体系。

CSS Anchor Positioning 是什么?

  • 它允许一个元素根据另一个锚点元素定位。
  • 适合 tooltip、popover、菜单等浮层,但生产使用要确认浏览器支持和降级。

CSS Masonry 布局是什么?

  • Masonry 是瀑布流布局能力,让网格项目按可用空间自动堆叠。
  • 目前仍要谨慎看兼容性,真实项目常需要降级或 JS 方案。

@supports 有什么用?

  • 它可以基于浏览器是否支持某个 CSS 特性来写条件样式。
  • 适合现代 CSS 渐进增强,比如容器查询、subgrid、backdrop-filter。

渐进增强在 CSS 中怎么做?

  • 先写所有浏览器可用的基础样式,再用 @supports、媒体查询或新特性增强体验。
  • 这样旧环境可用,新环境更好。

CSS 兼容性应该怎么判断?

  • 看目标用户浏览器、Browserslist、Can I Use、MDN 兼容表和 Baseline 状态。
  • 不能只看“Chrome 支持”,还要看公司实际用户环境。

Baseline 是什么?

  • Baseline 是 Web 平台用于描述特性是否已在主流浏览器中广泛可用的一套参考。
  • 面试中提到 Baseline,可以体现你关注现代 CSS 的可用性边界。

CSS 中媒体特性 hover 和 pointer 有什么用?

  • hover 判断设备是否支持悬停能力。
  • pointer 判断指针精度,适合区分鼠标、触屏和粗略点击设备。

移动端为什么不要只依赖 hover?

  • 触屏设备没有稳定的 hover 语义。
  • 交互状态应保证点击、焦点和键盘访问都可用。

打印样式要注意什么?

  • 使用 @media print 优化颜色、背景、分页、隐藏交互控件。
  • 票据、合同、后台报表等场景尤其要测试打印输出。

CSS 分页相关属性有哪些?

  • 常见有 break-beforebreak-afterbreak-inside
  • 打印、PDF、长文档导出时比较常用。

CSS 如何处理滚动条样式?

  • 现代 CSS 可使用 scrollbar-colorscrollbar-width,WebKit 内核还支持 ::-webkit-scrollbar 系列。
  • 要注意跨浏览器差异和可访问性。

accent-color 有什么用?

  • 它可以改变 checkbox、radio、range 等原生表单控件强调色。
  • 相比完全自定义控件,保留了更多原生可访问性。

caret-color 有什么用?

  • 它控制输入框光标颜色。
  • 常用于深色主题、品牌主题和富文本编辑器。

resize 属性有什么用?

  • 它控制元素是否允许用户拖拽调整尺寸。
  • 常用于 textarea、编辑器面板、调试窗口。

user-select 有什么用?

  • 它控制文本是否可被用户选中。
  • 按钮、拖拽元素可禁用选择,但正文内容不应随便禁用。

touch-action 有什么用?

  • 它告诉浏览器哪些触摸手势由浏览器处理,哪些交给页面。
  • 移动端拖拽、画布、轮播组件常用它减少延迟和冲突。

CSS 如何做状态样式?

  • 简单状态可用伪类、data 属性、aria 属性和 :has()
  • 复杂业务状态应由 JS 或框架维护,再映射成类名或属性。

data 属性写样式有什么好处?

  • data 属性能表达组件状态,比如 data-state="open"
  • 相比堆多个类名,状态语义更清晰,也方便测试和调试。

aria 属性能不能用于样式选择?

  • 可以,例如 [aria-expanded="true"]
  • 但不能为了样式滥用 aria,aria 首先要表达真实可访问语义。

表单样式现代化有哪些方式?

  • 使用 accent-color、appearance、伪类校验、:focus-visible、:user-invalid 等。
  • 完全自定义表单控件时要补齐键盘、焦点和屏幕阅读器体验。

appearance: none 有什么用?

  • 它可以移除某些原生控件的默认外观。
  • 使用后需要自己补足状态、焦点和可访问反馈。

CSS 如何处理主题 token?

  • 把颜色、字号、间距、圆角、阴影等抽象为 CSS 变量。
  • 组件使用语义 token,比如 --color-bg-card,而不是直接使用品牌原色。

语义 token 和基础 token 有什么区别?

  • 基础 token 表示原始值,比如 blue-500、space-4。
  • 语义 token 表示用途,比如 text-primary、bg-surface,更适合换主题。

CSS 代码评审重点看什么?

  • 看选择器是否过强、是否污染全局、响应式是否稳定、状态是否完整。
  • 还要看可访问性、性能、兼容性和是否符合设计系统。

CSS Bug 常见排查顺序是什么?

  • 先用 DevTools 看实际命中的规则、被覆盖的规则、盒模型和层叠上下文。
  • 再检查布局容器、媒体查询、变量值、资源加载和浏览器兼容。

DevTools 看 CSS 问题主要看哪里?

  • 看 Styles、Computed、Layout、Performance、Layers、Accessibility。
  • 对动画和卡顿问题,还要看渲染流水线和主线程长任务。

CSS 变量值异常怎么排查?

  • 在 Computed 面板看变量最终来源和 fallback。
  • 检查级联顺序、主题选择器、作用域、拼写和变量是否继承到当前元素。

样式在本地正常线上异常可能是什么原因?

  • CSS 加载顺序、压缩合并、浏览器版本、缓存、构建裁剪、动态类名都可能导致差异。
  • 先确认线上实际 CSS 文件和本地构建产物是否一致。

CSS 文件顺序为什么重要?

  • 同层级、同优先级规则下,后加载的样式会覆盖先加载的样式。
  • 使用 @layer 可以让顺序管理更显式。

为什么组件库样式常被业务覆盖困难?

  • 可能是组件库选择器优先级过高、样式注入顺序靠后,或使用了内联样式。
  • 解决方式包括暴露 CSS 变量、降低优先级、使用 layer、提供 classNames/slots。

CSS Modules 中如何写全局样式?

  • 通常使用 :global(...)
  • 应限制全局选择器范围,避免破坏模块隔离。

Vue scoped 样式为什么影响不到子组件内部?

  • scoped 会给当前组件元素加属性选择器,只作用于当前模板范围。
  • 如果确实要穿透子组件,可使用 :deep(),但要控制范围。

:deep() 为什么要谨慎使用?

  • 它会穿透组件封装,容易依赖第三方组件内部 DOM。
  • 组件库升级后内部结构变化,deep 样式可能失效。

React 项目 CSS 方案怎么选?

  • 小项目可用 CSS Modules 或 Tailwind。
  • 复杂设计系统可结合 CSS 变量、原子类、静态提取 CSS-in-JS 或组件库方案。

SSR 中 CSS 要注意什么?

  • 要避免样式闪烁、注入顺序不一致、服务端和客户端 className 不匹配。
  • CSS-in-JS 项目还要正确收集关键样式并注入 HTML。

CSS-in-JS hydration 问题是什么?

  • 服务端生成的 className 或样式顺序与客户端不一致时,可能出现样式错乱。
  • 要保证同版本依赖、稳定生成规则和正确 SSR 配置。

CSS 和 JS 动画怎么选?

  • 简单状态过渡优先 CSS。
  • 复杂时间线、物理动画、手势驱动和业务编排可用 JS 动画库。

requestAnimationFrame 和 CSS transition 有什么区别?

  • CSS transition 由浏览器根据声明式规则执行。
  • requestAnimationFrame 让 JS 每帧控制动画,灵活但更容易写出性能问题。

GPU 加速是不是一定更快?

  • 不一定,合成层过多会增加内存和合成成本。
  • 只应对确实频繁变化、适合合成的元素做提升。

transform: translateZ(0) 还能随便用吗?

  • 不建议随便用,它可能强制创建合成层。
  • 现代项目更推荐按需使用 will-change,并在动画结束后清理。

CSS Houdini 是什么?

  • Houdini 是一组底层 CSS 扩展 API,让开发者参与 CSS 解析、绘制、布局等过程。
  • 实际项目中最常见的是 @property 和部分 Paint API 实验。

Paint API 适合什么场景?

  • 适合用代码生成背景、图案、装饰效果。
  • 生产使用要谨慎看兼容性和降级方案。

CSS 如何实现不固定高度展开动画?

  • 可以用 grid 行高过渡、max-height 折中、JS 测量高度,或现代离散过渡方案。
  • 选择取决于内容复杂度、性能要求和兼容性。

height: auto 为什么不能传统 transition?

  • auto 不是明确数值,浏览器无法简单插值。
  • 可以改用 transform、grid-template-rows、max-height 或 JS 计算。

Grid 展开收起动画怎么写?

  • 外层从 grid-template-rows: 0fr 过渡到 1fr
  • 内层内容设置 overflow: hidden,可实现不固定高度的展开效果。

CSS 如何做三角提示箭头?

  • 可用伪元素配合 border、transform rotate、clip-path 或 anchor positioning。
  • 浮层箭头要同时处理定位、边界碰撞和阴影。

CSS 中伪类和伪元素有什么区别?

  • 伪类描述元素状态或结构位置,比如 :hover:nth-child()
  • 伪元素表示元素的某个虚拟部分,比如 ::before::after::marker

::marker 有什么用?

  • 它可以控制列表标记的样式。
  • 适合自定义 ul、ol 的标记颜色、大小和部分字体属性。

::selection 有什么用?

  • 它控制用户选中文本时的高亮样式。
  • 可用于品牌化选区,但要保证对比度。

::placeholder 样式要注意什么?

  • placeholder 不是 label,不应承载关键表单说明。
  • 样式上要保证可读,但通常弱于正常输入文本。

nth-child 和 nth-of-type 有什么区别?

  • nth-child 按所有兄弟元素位置计算。
  • nth-of-type 只按同标签类型的兄弟元素位置计算。

nth-child 的 of 语法有什么用?

  • :nth-child(2n of .item) 可以只在匹配 .item 的兄弟集合里计数。
  • 它让结构选择更精确,减少额外包裹或类名。

CSS 中 @media、@container、@supports 怎么分工?

  • @media 判断视口、设备和用户偏好。
  • @container 判断组件容器条件,@supports 判断特性支持。

媒体查询断点应该怎么定?

  • 不应只按设备型号定,而应根据布局在哪些宽度开始破裂来定。
  • 设计系统可提供常用断点,但组件细节可用容器查询补充。

clamp 字号是否一定推荐?

  • 推荐用于合理范围内的响应式字体。
  • 不应让字号随视口无限缩放,仍要保证移动端和大屏可读性。

CSS 如何处理 RTL?

  • 使用逻辑属性、文本方向属性和不依赖 left/right 的布局。
  • 图标、箭头、边距和动画方向都要检查。

direction 和 writing-mode 有什么区别?

  • direction 控制文本和行内方向,比如 LTR/RTL。
  • writing-mode 控制书写模式,比如横排或竖排。

vertical-align 为什么有时不生效?

  • 它主要影响行内、inline-block 和表格单元格的对齐。
  • 对普通块级元素垂直居中无效,应使用 flex/grid 等布局。

line-height 居中为什么不适合多行文本?

  • line-height 等于高度只适合单行文本。
  • 多行文本会导致行距异常,应使用 flex/grid 或 padding 控制。

图片底部为什么有空隙?

  • img 默认是 inline 元素,会和文字基线对齐,底部留出下行空间。
  • 可设置 display: block 或调整 vertical-align

inline-block 元素之间为什么有空隙?

  • HTML 中的换行和空格会成为行内空白。
  • 可通过去掉空白、设置父级 font-size 0、使用 flex/grid 解决。

CSS 如何让表格列宽稳定?

  • 使用 table-layout: fixed 并设置列宽。
  • 对长文本配合 overflow 和 text-overflow 处理。

position absolute 的 containing block 怎么确定?

  • 通常相对最近的非 static 定位祖先。
  • transform、filter、contain 等属性也可能创建包含块,影响定位参照。

fixed 为什么有时不相对视口?

  • 某些祖先元素设置 transform、filter、perspective 等会改变 fixed 的包含块。
  • 这会导致 fixed 看起来像相对某个容器定位。

CSS 如何处理 1px 边框?

  • 可使用媒体查询、transform scale、渐变背景或直接依赖现代高分屏渲染。
  • 真实项目要结合设计要求和设备表现,不必过度 hack。

DPR 对 CSS 有什么影响?

  • CSS 像素和设备物理像素不是一回事。
  • 图片清晰度、canvas、细边框和图标资源都要考虑 DPR。

backdrop-filter 性能差怎么办?

  • 减少模糊半径和覆盖面积,避免大面积实时模糊。
  • 必要时用半透明纯色或预渲染背景降级。

CSS 如何减少样式重算成本?

  • 减少复杂全局选择器,限定 :has() 范围,避免频繁改影响大量节点的类名。
  • 对大型区域可用 contain、content-visibility 和组件边界优化。

CSS 选择器性能现在还重要吗?

  • 普通选择器性能通常不是瓶颈,可读性更重要。
  • 但极宽泛选择器、复杂 :has()、超大 DOM 和频繁状态切换仍值得关注。

CSS 和设计系统如何配合?

  • 设计系统应把颜色、字体、间距、圆角、阴影抽象为 token。
  • CSS 层面负责把 token 落到主题、组件变量和状态样式。

组件样式 API 应该暴露什么?

  • 优先暴露 CSS 变量、slot/part、状态属性和稳定 className。
  • 不建议让使用方依赖内部 DOM 结构做深层覆盖。

CSS 如何支持白标或多品牌?

  • 使用语义 token 和主题包,在品牌层覆盖变量。
  • 组件内部避免写死品牌色,减少多品牌维护成本。

CSS 文件过大怎么治理?

  • 做样式分层、删除无用样式、拆分路由 CSS、抽取设计 token、限制全局覆盖。
  • 同时结合 bundle 分析和运行时 Coverage 找真实未使用规则。

Chrome Coverage 看 CSS 有什么用?

  • 它能显示页面加载后哪些 CSS 规则没有被使用。
  • 但只能代表当前路径和交互状态,不能简单全删。

CSS 面试如何回答才不水?

  • 每题尽量说清概念、使用场景、风险和项目实践。
  • 遇到新特性要补一句兼容性和降级策略,这会比只背语法更像真实经验。