前言
在 Flex 和 Grid 统治现代前端之前,table 布局和 float 布局是网页排版的两大支柱。理解它们的特性,不仅能帮助我们维护老项目,更能深刻理解 CSS 的渲染机制和 BFC 概念。
一、 Table 布局(模拟表格行为)
CSS 允许我们通过 display 属性,让普通的 div 拥有表格的排版特性,而不需要写臃肿的 <table> 标签。
1. 核心属性对应关系
| CSS 属性值 | 对应 HTML 标签 | 作用 |
|---|---|---|
display: table | <table> | 定义块级表格容器。 |
display: table-row | <tr> | 定义表格行。 |
display: table-cell | <td> | 核心属性:定义单元格。 |
display: table-column | <col> | 定义列属性。 |
2. table-cell 的独特优势
table-cell 至今在某些场景(如多列等高布局、垂直居中)依然非常有用:
- 垂直居中:设置
vertical-align: middle即可轻松实现内部元素垂直居中。 - 等高布局:同一行内的
table-cell元素天然等高。 - 限制:
table-cell元素不支持 margin。
二、 为什么现在不再推荐使用真正的 <table> 标签布局?
虽然 display: table 很有用,但直接用 HTML 的 <table> 标签做整体网页布局已被淘汰,原因如下:
-
渲染性能(逐行显示 vs 整体加载) :
div+css:支持增量渲染,浏览器可以一边下载一边显示内容。table:属于延迟渲染。浏览器通常需要接收到完整的表格代码并计算出每一列的宽度后,才会一次性渲染。如果表格很大,用户会面临较长时间的白屏。
-
灵活性:
table布局结构死板,很难实现响应式(Responsive)适配。 -
文件体积:
table嵌套层级深,代码冗余度高,增加带宽压力。
三、 Float 浮动布局(经典重难点)
1. 浮动的本质
浮动设计的初衷是实现“文字环绕图片”。它让元素向左/右偏移,直到遇到父容器边缘或另一个浮动元素。
2. 核心特性
- 多个同级块元素同时在一个方向浮动,从方向上水平依次排列
- 浮动后的div宽度会变成0,但是其内容物可能撑起它的宽和高
- div的浮动对前面的html元素没影响,对后面的html元素有影响
- 浮动元素脱离文档流,即不再占有原来的位置,浮动起来了
- 浮动元素碰到包含它的边框或者浮动元素的边框停留(浮动元素是贴在一起的,不会有缝隙)
3. 浮动引发的“灾难”:高度坍塌
当子元素全部浮动时,父元素会因为检测不到内容高度而缩减为 0。
四、 清除浮动(Clearfix)的四大法宝
1. 触发父元素 BFC(最推荐)
给父元素设置 overflow: hidden; 或 auto。
- 原理:BFC 区域在计算高度时,强制要求包含内部的浮动元素。
2. 万能清除法(::after 伪类)
目前业内最主流的标准做法:
.clearfix::after {
content: "";
display: block; /* 必须是块级 */
clear: both; /* 清除左右浮动 */
visibility: hidden;
height: 0;
}
3. 额外标签法
在结尾加 <div style="clear:both;"></div>。
- 缺点:增加无意义的 HTML 结构,不推荐。
4. BFC 避让(解决元素遮挡)
如果后面的元素被浮动元素遮挡,给后面的元素设置 overflow: hidden 触发其自身的 BFC,它就会自动避开浮动区域,不再重叠。