🌊 什么是文档流(Normal Flow)?
在 HTML 中,每个元素默认都处于文档流中:
- 块级元素 (如
div,p,h1等):
默认独占一行,从上到下排列,可以设置宽高,适合做容器。 - 行内元素 (如
span,a,strong等):
在同一行内从左到右排列,不能直接设置宽高,受文本影响。 - 行内块元素 (
display: inline-block):
可以设置宽高,又不会独占一行,看起来很适合做横向布局。
✅ 优点:兼容性好,控制简单。
❌ 缺点:有空白间隙问题(换行或空格会被渲染成一个空格),对齐麻烦,响应式支持差。
💡 那有没有更好的多列/多行布局方式?
当然有!随着网页越来越复杂,我们需要更灵活、更强大的布局方案。
历史演进:
- 早期用
float+position做布局 → 复杂且难维护 - 后来出现
display: table-cell→ 不够语义化 - 再后来有了
inline-block→ 有缺陷,不适合复杂响应式 - ✅ 直到 Flexbox(弹性布局) 出现 ------ 真正为布局而生!
先来使用inline-block
基础框架
css
.box{
background-color: pink;
height: 100px;
width: 50%;
margin-bottom: 10px;
}
.box:nth-child(2){
background-color: blue;
}
.item{
flex:1;
font-size: 20px;
color: black;
background-color: green;
}
.item:nth-child(odd){
background-color: yellow;
}
</style>
</head>
<body>
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<div class="box"></div>
</body>
形成这样的页面
加入弹性布局
依旧存在许多问题,box为什么上下交错,还有换行符会产生空白间隙等
🧩 弹性布局(Flexbox)是什么?
Flexbox 是 CSS3 提供的一种一维布局模型,专为在容器中高效分配空间、对齐内容而设计。
它解决了传统布局的痛点:
- 轻松实现水平/垂直居中
- 动态调整子元素大小以填充可用空间
- 简单实现多列等分布局
- 完美支持响应式设计
🔧 如何开启弹性布局?
只需要在父容器上设置:display: flex;
css
.box{
display: flex;
background-color: pink;
height: 100px;
width: 50%;
margin-bottom: 10px;
/* display: inline-block;行内块级元素 */
}
.box:nth-child(2){//选中第二个box
background-color: blue;
}
.item{
flex:1;//相同权重三个item均分box
font-size: 20px;
color: black;
/* display: inline-block; */
background-color: green;
}
.item:nth-child(odd){//选中两边的item
background-color: yellow;
}
一旦开启,这个容器就变成了弹性容器(flex container) ,它的直接子元素自动成为弹性项目(flex items) ,并按照 flex 规则进行排列。
🔄 弹性布局 vs inline-block 的对比
| 特性 | inline-block |
flex |
|---|---|---|
| 设置宽高 | ✅ 可以 | ✅ 可以 |
| 消除空白间隙 | ❌ 需要 hack(如注释或负边距) | ✅ 自动消除 |
| 居中对齐 | ❌ 复杂(line-height, transform) | ✅ 一行代码搞定 |
| 等分空间 | ❌ 计算麻烦 | ✅ flex: 1 即可 |
| 响应式 | ❌ 手动处理 | ✅ 天然支持 |
| 子项顺序控制 | ❌ 不行 | ✅ order 属性 |
🎯 使用场景推荐
✅ 推荐使用 Flex 的场景:
- 导航栏水平排列
- 卡片式布局(多列等高)
- 表单排布
- 居中弹窗
- 页脚始终在底部(圣杯布局)
❌ 不建议用 Flex 的情况:
- 复杂二维网格(此时应使用
grid布局)
✅ 总结:为什么你需要弹性布局?
"
inline-block虽好,可不要贪杯。"
虽然 inline-block 曾经是解决横向布局的好办法,但它带着与生俱来的"酒气"------空白间隙、对齐困难、响应式乏力。
而 Flexbox 就像一位 sober(清醒)的布局大师,干净利落地解决了这些问题,让我们能用更少的代码,做出更强大、更稳定的页面结构。