CSS Grid
- MDN - CSS Grid Layout : https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout
- CSS-Tricks - A Complete Guide to Grid : https://css-tricks.com/snippets/css/complete-guide-grid/
Flexbox
- MDN - Flexbox : https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout
- CSS-Tricks - A Complete Guide to Flexbox : https://css-tricks.com/snippets/css/a-guide-to-flexbox/
居中技术
- CSS-Tricks - Centering in CSS : https://css-tricks.com/centering-css-complete-guide/
- Smashing Magazine - Centering Elements : https://www.smashingmagazine.com/2013/08/absolute-horizontal-vertical-centering-css/
响应式设计
- MDN - Responsive Design : https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Responsive_Design
- A List Apart - Responsive Web Design : https://alistapart.com/article/responsive-web-design/

目录
[1. 盒模型与基础布局](#1. 盒模型与基础布局)
[2. 定位布局 (Positioning)](#2. 定位布局 (Positioning))
[3. 浮动布局 (Float)](#3. 浮动布局 (Float))
[4. 弹性盒子布局 (Flexbox)](#4. 弹性盒子布局 (Flexbox))
[5. 网格布局 (Grid)](#5. 网格布局 (Grid))
[6. 多列布局 (Multi-column)](#6. 多列布局 (Multi-column))
[7. 响应式布局](#7. 响应式布局)
[8. 水平垂直居中](#8. 水平垂直居中)
[9. 布局方案对比与选择](#9. 布局方案对比与选择)
[10. 常见布局实战](#10. 常见布局实战)
[11. 总结](#11. 总结)
布局方式概览

1. 盒模型与基础布局
盒模型是所有布局的基础,理解它至关重要。
1.1 盒模型详解
每个HTML元素都被表示为一个矩形的盒子,由四部分组成:
|-----------------------|----------------|-------------------------------------------------------------------|
| 部分 | 描述 | 常见属性 |
| 内容区 (Content) | 元素的实际内容,如文本、图像 | width, height |
| 内边距 (Padding) | 内容与边框之间的空白区域 | padding-top, padding-right, padding-bottom, padding-left, padding |
| 边框 (Border) | 围绕内边距和内容的边框 | border-width, border-style, border-color, border |
| 外边距 (Margin) | 元素与其他元素之间的空白区域 | margin-top, margin-right, margin-bottom, margin-left, margin |
css
/* 标准盒模型 */
box-sizing: content-box; /* 默认值,width仅包含内容区 */
/* IE盒模型(推荐) */
box-sizing: border-box; /* width包含content+padding+border */
实践建议:在项目根目录设置全局盒模型:
css
*, *::before, *::after {
box-sizing: border-box;
}
1.2 标准流布局
标准流是浏览器默认的布局方式,元素按照HTML中的顺序依次排列。
块级元素 (Block-level)
独占一行,可设置宽高。
如 <div>, <p>, <h1>-<h6>, <ul>, <li>, <table> 等。
行内元素 (Inline-level)
在一行内排列,不可设置宽高。
如 <span>, <a>, <img>, <input>, <strong>, <em> 等。
行内块元素 (Inline-block)
既可在一行内排列,又可设置宽高。
如 <img>, <input>, <button> 等。
元素类型转换
css
display: block; /* 转为块级元素 */
display: inline; /* 转为行内元素 */
display: inline-block; /* 转为行内块元素 */
2. 定位布局 (Positioning)
定位布局允许你将元素从正常文档流中移出,并精确定位。
2.1 定位属性详解
position: static; /* 默认值,遵循标准流 */
position: relative; /* 相对定位,相对于自身原位置偏移,不脱离文档流 */
position: absolute; /* 绝对定位,相对于最近的已定位祖先元素偏移,脱离文档流 */
position: fixed; /* 固定定位,相对于浏览器窗口偏移,脱离文档流 */
position: sticky; /* 粘性定位,基于滚动位置在relative和fixed之间切换 */
|--------------|---------------------------|-------------------|
| 定位类型 | 特点 | 常用场景 |
| Static | 默认值,遵循标准流 | 基础布局 |
| Relative | 相对于自身原位置偏移,不脱离文档流 | 微调位置、为绝对定位子元素提供参考 |
| Absolute | 相对于最近的已定位祖先元素偏移,脱离文档流 | 弹出框、悬浮菜单、绝对定位层 |
| Fixed | 相对于浏览器窗口偏移,脱离文档流 | 固定导航栏、返回顶部按钮 |
| Sticky | 基于滚动位置在relative和fixed之间切换 | 表头固定、侧边栏跟随 |
示例:相对定位为绝对定位提供参考
css
.parent {
position: relative; /* 为子元素的绝对定位提供参考 */
width: 300px;
height: 200px;
background: #f0f0f0;
}
.child {
position: absolute; /* 相对于.parent定位 */
top: 20px;
right: 30px;
width: 100px;
height: 50px;
background: #ff5722;
}
3. 浮动布局 (Float)
浮动布局最初用于文本环绕图片,后来被广泛用于多列布局,但已逐渐被Flexbox和Grid取代。
3.1 浮动属性详解
css
float: left; /* 向左浮动 */
float: right; /* 向右浮动 */
float: none; /* 不浮动(默认值) */
3.2 清除浮动
浮动元素会脱离文档流,导致父元素高度塌陷(无法包含浮动子元素),需要清除浮动。
方法1:使用clear属性(在浮动元素后添加空元素)
css
.clearfix::after {
content: "";
display: table;
clear: both;
}
方法2:使用overflow属性(触发BFC)
css
.parent {
overflow: hidden; /* 或auto */
}
方法3:使用伪元素(推荐)
css
.clearfix::after {
content: "";
display: block;
clear: both;
}
示例:浮动布局与清除浮动
html
<div class="parent clearfix">
<div class="left-column">左列(浮动)</div>
<div class="right-column">右列(浮动)</div>
</div>
css
.left-column {
float: left;
width: 70%;
background: #e0f7fa;
}
.right-column {
float: right;
width: 30%;
background: #ffe0b2;
}
4. 弹性盒子布局 (Flexbox)
Flexbox是一维布局模型,主要用于行或列方向的布局,非常适合对齐和分配容器内空间。
4.1 Flex容器属性
设置flex布局
css
display: flex
display: inline-flex
flex-direction主轴方向
- flex-direction:row(水平从左到右)
- flex-direction:row-reverse(水平从右到左)
- flex-direction:column(垂直从上到下)
- flex-direction:column-reverse(垂直从下到上)
flex-wrap是否换行
- flex-wrap:nowrap(不换行)
- flex-wrap:wrap(按主轴方向换行)
- flex-wrap:wrap-reverse(按主轴反方向换行)
justify-content主轴对齐
- justify-content:flex-start
- justify-content:flex-end
- justify-content:center
- justify-content:space-between
- justify-content:space-around
- justify-content:space-evenly
align-items交叉轴对齐
- align-items :flex-start
- align-items :flex-end
- align-items :center
- align-items :baseline
- align-items :stretch(拉伸填满)
align-content多行对齐(只有多行时生效)
- align-content :flex-start
- align-content :flex-end
- align-content :center
- align-content :space-between
- align-content :space-around
- align-content :stretch
4.2 Flex项目属性
order: 0;
排序顺序:数值越小越靠前(默认为0)
flex-grow: 0;
放大比例:默认为0(不放大)
flex-shrink: 1
缩小比例:默认为1(空间不足时缩小)
flex-basis: auto;
初始大小:auto(默认) | 具体长度值
flex: 0 1 auto;常用:flex: 1 (1 1 0%)
简写:flex: flex-grow flex-shrink flex-basis
align-self: auto;
单独对齐:覆盖父元素的align-items
5. 网格布局 (Grid)
Grid是二维布局模型,可以同时处理行和列,适合复杂的页面整体布局。
5.1 Grid容器属性
设置grid布局
css
display: grid;
display: inline-grid;
grid-template-columns定义列
可以使用长度、百分比、fr单位、auto、minmax()、repeat()
设置三列网格布局
css
grid-template-columns: 1fr 2fr 1fr; /* 三列,中间列是两侧的2倍 */
grid-template-columns: repeat(3, 1fr); /* 三列等宽 */
grid-template-columns: 200px 1fr 200px; /* 固定-自适应-固定 */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* 响应式列 */
grid-template-rows定义行(与列定义方式相同)
css
grid-template-rows: 1fr 2fr 1fr; /* 三行,中间行是上下的2倍 */
grid-template- rows: repeat(3, 1fr); /* 三行等宽 */
grid-template- rows: 200px 1fr 200px; /* 固定-自适应-固定 */
grid-template- rows: repeat(auto-fit, minmax(200px, 1fr)); /* 响应式行 */
grid-template-areas定义区域(模板)
css
grid-template-areas:"header header header"
grid-template-areas:"sidebar content content"
grid-template-areas:"footer footer footer";
grid-gap间距
css
grid-gap: 20px;
等价于分别设置grid-row-gap和grid-column-gap是20px
5.2 Grid项目属性
指定项目位置:可以使用网格线编号或span关键字
grid-column
css
grid-column: 1 / 3; /* 从第1列线到第3列线(跨2列) */
grid-column: 1 / span 2; /* 从第1列线开始,跨2列 */
grid-row
简写:grid-row: start / end;
css
grid-row: 1 / 2; /* 从第1行线到第2行线(占1行) */
grid-row: span 2; /* 跨2行 */
指定项目区域
css
grid-area: header;
/* 对齐:覆盖容器的justify-items/align-items */
justify-self: start; /* 水平方向对齐 */
align-self: start; /* 垂直方向对齐 */
示例:Grid布局实现经典圣杯布局
html
<div class="container">
<header class="header">Header</header>
<aside class="sidebar">Sidebar</aside>
<main class="content">Main Content</main>
<footer class="footer">Footer</footer>
</div>
css
.container {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
min-height: 100vh;
gap: 10px;
}
.header { grid-area: header; background: #ffccbc; }
.sidebar { grid-area: sidebar; background: #c8e6c9; }
.content { grid-area: content; background: #b3e5fc; }
.footer { grid-area: footer; background: #d1c4e9; }
6. 多列布局 (Multi-column)
多列布局主要用于文本内容分栏,类似报纸排版。
列数或列宽
css
column-count: 3; /* 分为3列 */
column-width: 200px; /* 每列理想宽度200px(浏览器会自动计算列数) */
columns: 3 200px; /* 简写形式 */
列间距
css
column-gap: 30px; /* 默认为1em */
列分隔线
css
column-rule: 1px solid #ccc;
元素跨列
css
column-span: all; /* 跨所有列 */
避免元素在列间断裂
css
break-inside: avoid;
示例:文本多列布局
html
<div class="container">
<h2>标题跨所有列</h2>
<p>这里是第一列的内容...</p>
<p>这里是第二列的内容...</p>
<p>这里是第三列的内容...</p>
</div>
css
.container {
/* 列数或列宽 */
column-count: 3; /* 分为3列 */
column-width: 200px; /* 每列理想宽度200px(浏览器会自动计算列数) */
columns: 3 200px; /* 简写形式 */
/* 列间距 */
column-gap: 30px; /* 默认为1em */
/* 列分隔线 */
column-rule: 1px solid #ccc;
}
/* 元素跨列 */
h2 {
column-span: all; /* 跨所有列 */
}
/* 避免元素在列间断裂 */
img, blockquote {
break-inside: avoid;
}
7. 响应式布局
响应式布局通过媒体查询实现,针对不同屏幕尺寸应用不同样式。
基础样式(移动优先)
css
.container {
width: 100%;
padding: 10px;
}
平板设备
css
@media (min-width: 768px) {
.container {
width: 750px;
margin: 0 auto;
}
}
桌面设备
css
@media (min-width: 1024px) {
.container {
width: 960px;
display: grid;
grid-template-columns: 200px 1fr;
}
}
大屏幕设备
css
@media (min-width: 1200px) {
.container {
width: 1140px;
}
}
建议采用移动优先策略,先为移动设备编写基础样式,再逐步为更大屏幕添加增强样式。
8. 水平垂直居中
居中是前端开发中最常见的需求之一,以下是各种布局方式下的居中方案。
8.1 水平居中
|------------------------|---------------------------------------------|------------------------------------------------------------------------------|
| 情况 | 方法 | 代码示例 |
| 行内 / 行内块元素 | text-align: center | .parent { text-align: center; } |
| 块级元素(定宽) | margin: 0 auto | .child { width: 300px; margin: 0 auto; } |
| Flexbox | justify-content: center | .parent { display: flex; justify-content: center; } |
| Grid | justify-items: center 或 place-items: center | .parent { display: grid; justify-items: center; } |
| 绝对定位(定宽) | left: 50%; margin-left: -width/2 | .child { position: absolute; left: 50%; margin-left: -150px; width: 300px; } |
| 绝对定位(不定宽) | left: 50%; transform: translateX(-50%) | .child { position: absolute; left: 50%; transform: translateX(-50%); } |
8.2 垂直居中
|---------------|---------------------------------------------|----------------------------------------------------------------------------|
| 情况 | 方法 | 代码示例 |
| 单行文本 | line-height 等于容器高度 | .parent { height: 100px; line-height: 100px; } |
| Flexbox | align-items: center | .parent { display: flex; align-items: center; } |
| Grid | align-items: center 或 place-items: center | .parent { display: grid; align-items: center; } |
| 绝对定位(定高) | top: 50%; margin-top: -height/2 | .child { position: absolute; top: 50%; margin-top: -75px; height: 150px; } |
| 绝对定位(不定高) | top: 50%; transform: translateY(-50%) | .child { position: absolute; top: 50%; transform: translateY(-50%); } |
| 表格单元格 | display: table-cell; vertical-align: middle | .parent { display: table-cell; vertical-align: middle; } |
8.3 水平垂直居中
|---------------------------|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
| 方法 | 适用情况 | 代码示例 |
| Flexbox | 推荐 ,简单高效 | .parent { display: flex; justify-content: center; align-items: center; } |
| Grid | 推荐 ,简单高效 | .parent { display: grid; place-items: center; } |
| 绝对定位 +transform | 需要脱离文档流 | .child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } |
| 绝对定位 +margin auto | 需要脱离文档流,必须定宽定高 | .parent { position: relative; } .child { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; width: 200px; height: 100px; } |
示例:Flexbox水平垂直居中(推荐)
html
<div class="parent">
<div class="child">内容</div>
</div>
css
.parent {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
height: 200px;
background: #e0f7fa;
}
.child {
padding: 20px 40px;
background: #0097a7;
color: white;
}
9. 布局方案对比与选择
|-------------|--------------------|-----------------|------------------|
| 布局方案 | 优点 | 缺点 | 适用场景 |
| 标准流 | 简单自然,无需额外样式 | 布局能力有限 | 基础文档布局 |
| 定位 | 精确控制元素位置 | 容易造成布局混乱,维护困难 | 小范围精确调整、弹出层 |
| 浮动 | 兼容性好,可实现多列布局 | 需要清除浮动,容易造成布局混乱 | 简单图文混排(已不推荐) |
| Flexbox | 一维布局强大,对齐灵活,响应式友好 | 二维布局不如Grid | 一维布局(行/列)、对齐、导航栏 |
| Grid | 二维布局强大,网格系统完善,代码简洁 | 兼容性稍差(但已足够好) | 页面整体框架、复杂网格系统 |
| 多列布局 | 适合文本分栏,类似报纸排版 | 主要用于文本,不适合复杂布局 | 文章内容分栏展示 |

10. 常见布局实战
10.1 固定侧边栏+自适应内容区(经典布局)
方法1:使用Flexbox
css
.container {
display: flex;
min-height: 100vh;
}
.sidebar {
width: 250px;
flex-shrink: 0; /* 防止被压缩 */
background: #333;
color: white;
}
.content {
flex-grow: 1; /* 占据剩余空间 */
background: #f4f4f4;
}
方法2:使用Grid
css
.container {
display: grid;
grid-template-columns: 250px 1fr;
min-height: 100vh;
}
10.2 粘性页头+滚动内容区
使用position: sticky
css
.header {
position: sticky;
top: 0;
z-index: 100;
background: rgba(255, 255, 255, 0.95);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.content {
padding: 20px;
}
10.3 响应式网格卡片布局
使用Grid + minmax实现响应式
css
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
padding: 20px;
}
.card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
padding: 20px;
}
10.4 悬浮按钮
使用position: fixed
css
.fab {
position: fixed;
bottom: 30px;
right: 30px;
width: 56px;
height: 56px;
border-radius: 50%;
background: #2196f3;
color: white;
display: flex;
justify-content: center;
align-items: center;
font-size: 24px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
cursor: pointer;
transition: transform 0.3s;
}
.fab:hover {
transform: scale(1.1);
}
11. 总结
- 优先使用现代布局:Flexbox 和 Grid 是现代前端布局的基石,优先考虑使用它们。
- 移动优先:采用移动优先的响应式设计策略,为小屏幕设备提供基础体验,再逐步增强。
- 语义化HTML:使用正确的HTML5语义化标签(<header>, <nav>, <main>, <article>, <aside>, <footer>),使结构更清晰,利于可访问性和SEO。
- 盒模型统一:在项目根元素设置 * { box-sizing: border-box; },统一盒模型计算方式。
- 避免过度嵌套:保持DOM结构相对扁平,避免过深的嵌套,这有助于提高性能和可维护性。
- 善用开发者工具:浏览器开发者工具的布局(Layout)面板是调试布局的利器,学会使用它。
- 清除浮动:如果不得不使用浮动,记得使用伪元素 ::after 清除浮动。
- 考虑可访问性:确保布局对屏幕阅读器等辅助技术友好,使用适当的ARIA属性。
- 性能优化:避免使用过于复杂的选择器,合理使用CSS动画和过渡,避免强制同步布局。