CSS 是我学前端时最挫败的部分。逻辑我都会,JavaScript 写得动,但只要一到布局,整个人就懵了:为什么这个 div 又掉下去了?为什么居中这么难?为什么我抄的代码到自己页面上就变形?直到我把布局的三套体系——float、flex、grid——按出现顺序重新走了一遍,才真正打通。这篇日记记录我认知变化的过程,希望对同样卡在布局上的你有帮助。
一、float 时代:用错工具的痛苦
最早学布局时,我所有东西都用 float。导航栏 float:left,侧边栏 float:right,主体 float:left,然后 clearfix 清浮动。能做出来,但每个细节都很难调:间距对不齐、高度塌陷、响应式一塌糊涂。
当时的我不知道一件事:float 设计初衷根本不是用来布局的,它是为了实现文字环绕图片。把它当布局工具,等于用螺丝刀敲钉子,能敲进去,但每次都费劲。
这段经历让我明白了一件事:理解一个属性的设计意图,比记住它的用法更重要。float 不是为布局生的,所以拿它布局处处别扭。
二、flex 的顿悟:一维布局终于顺了
转折点是我第一次真正用 flex。当时我要做一个导航栏:logo 在左,菜单在中,按钮在右。用 float 我得调半天,用 flex 三行 CSS 就搞定:
.nav {
display: flex;
justify-content: space-between; // 主轴两端对齐
align-items: center; // 交叉轴居中
}
那一刻我真的有种"原来如此"的感觉。flex 把布局抽象成了"主轴 + 交叉轴"两个方向,你只要说清楚沿主轴怎么排、沿交叉轴怎么对齐,剩下的事它全帮你做了。
flex 适合一维布局——一行或一列。导航栏、按钮组、卡片横排、表单输入行,这些用 flex 都是一行代码的事。我把项目里所有 float 布局全换成了 flex,代码量减了一半,bug 少了一大截。
布局的痛苦,90% 来自用错了维度的工具。一维的问题用一维的工具,二维的才用二维的。
三、grid 的进阶:二维布局有了画布
但有些布局 flex 还是搞不定,比如一个完整的页面骨架:头部、侧边、主体、底部,要同时控制行和列。这时我遇到了 grid。grid 是真正的二维布局工具,它让你像画格子一样规划页面。
.layout {
display: grid;
grid-template-columns: 220px 1fr; // 侧边固定宽,主体自适应
grid-template-rows: auto 1fr auto; // 头尾自适应,主体撑满
grid-template-areas:
"header header"
"side main"
"footer footer";
min-height: 100vh;
}
.header { grid-area: header; }
.side { grid-area: side; }
.main { grid-area: main; }
.footer { grid-area: footer; }
用 grid-template-areas 把整个页面骨架画出来,谁在哪一格一目了然。这种"先画结构再填内容"的思路,让布局第一次变得可规划、可维护。响应式也简单,加一个媒体查询改 areas 就行。
四、关键概念清单
把布局打通后,我把关键概念收敛成了这张清单,每次卡住就回来对照:
- 盒模型:content、padding、border、margin,box-sizing 决定宽高算谁。
- 文档流:默认排列规则,脱离文档流(float、absolute、fixed)会带来副作用。
- flex 的两轴:主轴用 justify-content,交叉轴用 align-items,方向用 flex-direction。
- grid 的两条线:列用 grid-template-columns,行用 grid-template-rows,区域用 areas。
- 定位:relative 是相对自己,absolute 找最近的非 static 父级,fixed 相对视口,sticky 是滚动到阈值后固定。
- 响应式:移动优先,用 min-width 媒体查询逐步增强。
五、心得:布局的本质是"表达意图"
从懵到通,我最大的收获不是记住了多少属性,而是理解了布局的本质:布局是用 CSS 向浏览器"表达意图"。float 表达的是"环绕",flex 表达的是"一维分布",grid 表达的是"二维网格"。你表达的意图越准确,浏览器给你的结果就越省心。
所以学布局不要背属性表,要去问每个工具"你为解决什么问题而生"。懂了这个问题,剩下的属性自然就记住了。布局从此不再是玄学,而是一种清晰的表达。