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: auto和flex: 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: hidden、display: flex/inline-block、position: 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 布局
答案要点:
| 方案 | 代码 | 适用场景 |
|---|---|---|
| Flex | display: flex; justify-content: center; align-items: center; | 现代浏览器 |
| Grid | display: grid; place-items: center; | 现代浏览器 |
| 绝对定位 + transform | position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); | 已知/未知尺寸 |
| 绝对定位 + margin | position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; | 已知尺寸 |
| table-cell | display: 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; } | 推荐方案 |
| BFC | overflow: hidden 或 display: flow-root | 可能带来副作用 |
推荐方案:
css
.clearfix::after {
content: '';
display: block;
clear: both;
}
.clearfix {
*zoom: 1; /* IE6/7 */
}