面试大厂,这些 CSS 问题一定要掌握

在现代前端中,面试对于 CSS 的考察要求较低,几乎无法与 JavaScript 相提并论,甚至无法与 JavaScript 的某一细分专题相提并论。

在现代前端面试中,虽然 CSS 考察的比重不及 JavaScript,但掌握核心的 CSS 知识点依然是前端工程师的必备技能。本文系统整理了前端面试中高频的 CSS 面试题,包含答案详解和代码示例,助你轻松应对技术面试。

💡 更多前端面试题,请查看前端面试题库

盒模型

CSS 的盒模型主要包括以下两种,可通过 box-sizing 属性进行配置:

  • content-box:默认属性。width 只包含 content
  • border-box:width 包含 (content、padding、border)

CSS specificity (权重)

css specificity 即 css 中关于选择器的权重,以下三种类型的选择器依次下降

  1. id 选择器,如 #app
  2. classattributepseudo-classes 选择器,如 .header[type="radio"]:hover
  3. type 标签选择器和伪元素选择器,如 h1p::before

其中通配符选择器 *,组合选择器 + ~ >,否定伪类选择器 :not() 对优先级无影响

另有内联样式 <div class="foo" style="color: red;"></div>!important(最高) 具有更高的权重

:not 的优先级影响 - codepen 可以看出 :not 对选择器的优先级无任何影响

CSS Specificity - codepen 可以看出十几个 class 选择器也没有一个 id 选择器权重高

补充问题:

  1. 100 个 class 选择器和 id 选择器那个比较高
  2. 属性选择器和类选择器哪个权重较高
  3. 通配符选择器和元素选择器哪个权重教高

’+’ 与 ’~’ 选择器有什么不同

z-index 与层叠上下文

z-index 高数值一定在低数值前边吗,div 层级如下所示

  • A -> 3
    • AA -> 1000
  • B -> 4
    • BB -> 10

代码见 zindex - codepen

不一定,更复杂的示例见 层叠上下文 - MDN

水平垂直居中

宽高不定的块状元素水平垂直居中,可见以下示例

同时提供几种不同的思路:

  • flex:
    • justify-content: center
    • align-content: center
  • grid
    • place-items: center
  • absolute/translate
    • position: absolute
    • left/top: 50%
    • transform: translate(50%)
  • ##absolute/inset##

左侧固定、右侧自适应

提供 flexgrid 布局的两种思路

  • flex:
    • 左侧: flex-basis: 200px
    • 右侧: flex-grow: 1; flex-shrink: 0;
  • grid
    • 父容器: grid-template-columns: 200px 1fr;
.container
  .left
  .main
.container {
  display: grid;
  grid-template-columns: 300px 1fr;
}

三栏均分布局

同样提供 flexgrid 的两种方案

  • flex:
    • 方案一: flex: 1;
    • 方案二: flex-basis: calc(100% / 3)
  • grid:
    • 父容器: grid-template-columns: 1fr 1fr 1fr

进一步问题:如何实现十六列均分布局?

如何画一个正方形/长宽固定的长方形

过去的解决方案是使用 padding。一个元素的 padding 如若设置为百分比,则代表的是以父元素宽度为基准,根据这个原理,可设置长宽比。但实际上意义有限,毕竟你把 padding 给占了,content 无任何区域。

现代化的解决方案是使用长宽比的 CSS 属性: aspect-ratio

CSS 如何避免样式冲突

1. BEM 式: .home-page .home-page-btn

.home-page {
  .home-page-btn {}
}

BEM 有一个缺点,就是有些太长,可适当简化,只包裹该页面组件的根类名,但有可能增加样式冲突的风险

.home-page {
  .btn {}
}

2. CSS Scoped

scoped css 会对当前组件(scope)下所有元素生成唯一的属性或类名,对所有 CSS 规则将携带唯一属性实现作用域的命名保护

// 手动写
.btn {}
 
// 编译后
.btn .jsx-1287234 {}
 

css scoped demo

3. CSS Module

module css 会对类名进行 hash 化

css modules demo

CSS 变量

:root{
  --bgcolor: #aaa;
  --color: #000;
}

CSS 配置暗黑模式

最简单来讲,可通过媒体查询 @media (prefers-color-scheme: dark) 与 CSS 变量实现。

@media (prefers-color-scheme: dark) {
    :root{
    }
}