Skip to content

CSS 布局技术

1. Flexbox 布局

题目:介绍一下 CSS 中的 Flex 布局,如何实现一个垂直居中且两端对齐的容器?

难度:

考点: CSS 布局基础

答案要点:

Flex 布局是基于轴线的弹性布局方案,通过设置容器属性来控制子元素的排列和空间分配。

  • 设置 display: flex 开启布局
  • 使用 align-items: center 实现交叉轴(垂直)居中
  • 使用 justify-content: space-between 实现主轴两端对齐
  • flex-grow、flex-shrink 和 flex-basis 的缩写含义

代码示例:

css
.container {
  display: flex;
  align-items: center;      /* 垂直居中 */
  justify-content: space-between; /* 两端对齐 */
}

常见坑:

  • 忘记设置容器高度导致垂直居中无效
  • 混淆 justify-content 和 align-items 的作用对象

追问:

  • flex: 1 代表什么意思?
  • 当子元素宽度总和超过容器时,flex-shrink 是如何计算压缩比例的?

题目:在 CSS 布局中,Flex 布局的 flex: 1 代表什么含义?

难度:

考点: CSS 布局、Flexbox 属性

答案要点:

flex: 1 是一个简写属性,它决定了子元素如何分配父容器的剩余空间。

  • 组成部分: 它是 flex-grow: 1, flex-shrink: 1, flex-basis: 0% 的缩写
  • flex-grow: 定义放大比例,1 表示占用剩余空间的 1 份
  • flex-shrink: 定义缩小比例,1 表示空间不足时等比例缩小
  • flex-basis: 定义在分配多余空间之前的项目占据的主轴空间

常见坑:

  • 误以为 flex: 1 等同于 flex: 1 1 auto(实际 basis 是 0%)
  • 不清楚 flex-basis 与 width 的优先级关系

追问:

  • flex: autoflex: none 分别代表什么?

2. Grid 布局

题目:谈谈 CSS 布局中 Flex 和 Grid 的使用场景

难度:

考点: CSS 基础

答案要点:

Flex 是一维布局系统,侧重于轴线上的空间分配;Grid 是二维布局系统,侧重于行和列的网格划分。

  • Flex 场景: 导航栏、垂直居中、简单的列表排列
  • Grid 场景: 复杂的页面大框架、不规则的多行多列布局
  • 响应式: Grid 的 grid-template-areas 在处理响应式布局切换时比 Flex 更简洁
  • 性能: 对于简单布局 Flex 性能略好,但 Grid 在处理复杂结构时能减少嵌套层级

常见坑:

  • Flex 容器下子元素的 min-width 默认为 auto,可能导致内容溢出
  • 混淆 justify-content 和 align-items 的作用轴

追问:

  • 如何实现一个自适应宽度的瀑布流布局?

3. BFC(块级格式化上下文)

题目:请简述 CSS 盒模型以及 BFC 的触发条件和应用场景

难度:

考点: CSS 布局基础

答案要点:

盒模型决定了元素如何在页面上占据空间,而 BFC 是页面上的一个独立渲染区域。

  • 盒模型: 分为标准盒模型(content-box)和怪异盒模型(border-box),区别在于 width 是否包含 padding 和 border
  • BFC 触发: 可以通过 overflow: hiddendisplay: flex/inline-blockposition: absolute/fixed 等方式触发
  • 应用场景: 解决外边距重叠(Margin Collapse)、清除浮动、防止元素被浮动元素覆盖
  • 渲染规则: BFC 内部的元素在垂直方向一个接一个排列,计算高度时浮动元素也参与计算

常见坑:

  • 混淆标准盒模型和 IE 盒模型的计算公式
  • 认为设置 display: block 就能触发 BFC

追问:

  • 如果想让两个相邻 div 的 margin 不重叠,除了 BFC 还有什么办法?

题目:介绍一下 CSS 中的 BFC 及其应用场景

难度:

考点: 布局原理

答案要点:

BFC(块级格式化上下文)是 Web 页面中一个独立的渲染区域,内部元素的布局不会影响到外部。

  • 触发条件: 根元素、浮动元素(float 不为 none)、绝对定位(absolute/fixed)、display 为 inline-block/table-cell、overflow 不为 visible
  • 布局规则: 内部 Box 会在垂直方向一个接一个放置;垂直方向的距离由 margin 决定;属于同一个 BFC 的两个相邻 Box 的 margin 会发生重叠
  • 主要用途: 清除内部浮动(解决父元素高度塌陷)、防止垂直 margin 重叠、实现自适应两栏布局

常见坑:

  • 认为只要设置了 overflow: hidden 就一定会解决所有布局问题,忽略了其对溢出内容隐藏的副作用

追问:

  • 除了 BFC,你还了解 IFC 或 GFC 吗?

4. 居中方案

题目:CSS 中实现水平垂直居中的几种方式

难度:

考点: CSS 布局

答案要点:

方案代码适用场景
Flexdisplay: flex; justify-content: center; align-items: center;现代浏览器
Griddisplay: grid; place-items: center;现代浏览器
绝对定位 + transformposition: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);已知/未知尺寸
绝对定位 + marginposition: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto;已知尺寸
table-celldisplay: table-cell; text-align: center; vertical-align: middle;兼容旧浏览器

5. 盒模型

题目:简单介绍一下 CSS 的盒模型,以及如何切换它们?

难度:

考点: CSS 布局基础

答案要点:

盒模型是浏览器对页面元素进行布局的基础,它规定了元素的内容、内边距、边框和外边距如何结合在一起。

  • 标准盒模型: width 和 height 只包含 content,不包含 padding 和 border
  • IE 盒模型(怪异盒模型): width 和 height 包含了 content、padding 和 border
  • 切换方式: 使用 box-sizing 属性,content-box 对应标准模型,border-box 对应 IE 模型
  • 实际应用: 现代开发通常推荐使用 border-box,因为它更符合直觉,方便计算布局尺寸

常见坑:

  • 混淆两种模式下 width 的实际含义
  • 忽略了 padding 和 border 会撑开标准盒模型元素的情况

追问:

  • 如果给一个元素设置 padding: 10%,它是相对于谁的百分比?

6. 对话气泡布局

题目:谈谈 CSS 中如何实现一个类似 ChatGPT 的气泡对话布局?

难度:

考点: Flexbox、布局设计

答案要点:

对话布局通常采用 Flex 垂直容器,配合 align-self 处理左右对齐,并解决长文本溢出问题。

  • 容器属性: display: flex; flex-direction: column;
  • 对齐方式: 用户消息 align-self: flex-end,AI 消息 align-self: flex-start
  • 文本处理: word-break: break-word 防止长字符撑破容器,max-width 限制宽度
  • 滚动策略: overflow-y: auto 配合 flex-grow 实现内容区自适应

常见坑:

  • 头像与气泡的对齐在多行文本下容易错位

追问:

  • 如何实现气泡下方的"复制"按钮仅在 Hover 时显示?

7. 光标闪烁效果

题目:CSS 如何实现一个类似 ChatGPT 的光标闪烁效果?

难度:

考点: CSS 动画、伪元素

答案要点:

利用伪元素和 keyframes 动画模拟垂直线条的显隐。

  • 伪元素: 在内容容器后添加 ::after 伪元素
  • 样式模拟: 设置 width, height, background-color 为黑色或主题色
  • 动画: 使用 opacity 从 0 到 1 的循环切换,或 visibility 切换
  • 步进函数: 使用 steps(1)linear 达到跳动感

代码示例:

css
.typing-cursor::after {
  content: '';
  display: inline-block;
  width: 2px;
  height: 1.2em;
  background-color: currentColor;
  margin-left: 2px;
  animation: blink 1s step-end infinite;
}

@keyframes blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0; }
}

常见坑:

  • 动画导致页面频繁重排(Reflow),应优先使用 opacity
  • 光标在换行时的位置偏移问题

8. 响应式布局

题目:如何实现移动端适配?

难度: ★★

考点: 响应式设计

答案要点:

  • Viewport 设置: <meta name="viewport" content="width=device-width, initial-scale=1">
  • REM 适配: 根据屏幕宽度动态设置 html 的 font-size
  • VW/VH 适配: 直接使用视口单位
  • Flexible 方案: 结合 rem 和 viewport
  • 媒体查询: 针对不同断点设置不同样式

代码示例:

javascript
// REM 适配方案
function setRem() {
  const designWidth = 375;
  const html = document.documentElement;
  const width = html.clientWidth;
  html.style.fontSize = (width / designWidth) * 100 + 'px';
}
window.addEventListener('resize', setRem);
setRem();

9. 清除浮动

题目:清除浮动的方法有哪些?

难度:

考点: 浮动布局

答案要点:

方法代码优缺点
额外标签<div style="clear: both;"></div>简单,但增加无意义标签
伪元素.clearfix::after { content: ''; display: block; clear: both; }推荐方案
BFCoverflow: hiddendisplay: flow-root可能带来副作用

推荐方案:

css
.clearfix::after {
  content: '';
  display: block;
  clear: both;
}

.clearfix {
  *zoom: 1; /* IE6/7 */
}