你是不是有过这种崩溃时刻:想让三个卡片并排居中,加了 margin: 0 auto 没用;想让文字垂直居中,调 padding 调了半天还是歪的;最后一堆 float:left 堆上去,结果父元素直接 “塌了”?
别愁了!今天给你扒 CSS 里的 “布局万能钥匙”——Flex 布局,小索奇当年刚学的时候,直接把它当成了救星,以前两小时调不好的布局,现在 20 分钟搞定!
简单说就是,Flex 布局能让你把容器里的元素当成 “弹性项”,想怎么排就怎么排,不用再跟 float、position 死磕。只要给父容器加一句 display: flex;,瞬间解锁各种对齐、分布、排序技能,是不是很神奇?
先给你看个最实用的例子:三个商品卡片水平居中,且间距相等。以前你可能得给每个卡片加 margin-right,最后一个还要单独清掉,麻烦得很。用 Flex 的话,代码干净到离谱:
/* 父容器 /
.card-container {
display: flex; / 开启 Flex 布局 /
justify-content: space-between; / 元素沿主轴均匀分布 /
align-items: center; / 元素在交叉轴居中对齐 */
width: 90%;
margin: 0 auto;
}
/* 子元素(卡片) */
.card {
width: 30%;
height: 200px;
background: #f5f5f5;
}
这里的 justify-content 管的是 “主轴” 方向的排列,默认主轴是水平的,所以 space-between 就是让三个卡片左右顶边,中间间距相等。align-items 管的是 “交叉轴”,也就是垂直方向,center 就是让卡片在容器里上下居中。
这背后的逻辑其实很简单:Flex 把容器分成了两根轴,主轴和交叉轴永远垂直。你要是想让元素竖着排,只要加一句 flex-direction: column;,主轴就变成垂直方向了,是不是特灵活?
说到这儿可能有人会问:“我加了 display: flex;,怎么子元素突然变高了?” 哈哈,这就是新手最容易踩的坑!Flex 里的 align-items 默认值是 stretch,意思是 “拉伸子元素填满交叉轴”。所以如果父容器有高度,子元素没设高度,就会被自动拉长,看着就很怪。
解决方法超简单:要么给子元素设固定高度,要么把 align-items 改成 flex-start(顶对齐)或 center(居中)。小索奇亲测,这个坑至少绊倒过 80% 的初学者,你是不是也中过招?
再给你说个进阶技巧:flex-grow 和 flex-shrink 的用法。比如你做导航栏,左边 logo 固定宽度,右边菜单想占满剩余空间,这时候 flex-grow 就派上用场了:
/* 父容器 */
.nav {
display: flex;
width: 100%;
}
/* logo /
.logo {
width: 120px;
flex-shrink: 0; / 禁止缩小 */
}
/* 菜单容器 /
.menu {
flex-grow: 1; / 占满剩余空间 */
display: flex;
justify-content: flex-end;
}
这里的 flex-grow: 1 意思是 “如果有剩余空间,全部归我”,而 flex-shrink: 0 是 “就算空间不够,我也不缩小”,完美解决了自适应布局的问题。以前用百分比调这个,稍微改个元素宽度就全乱了,对吧?
还有个容易搞混的点:align-items 和 align-content 的区别。简单说,align-items 管的是 “单个行” 的元素对齐,align-content 管的是 “多个行” 的整体对齐。比如你的容器里有 6 个元素,加了 flex-wrap: wrap; 分成两行,这时候用 align-content: space-around;,两行之间会产生间距;但用 align-items 的话,只会控制每行内部的元素对齐,两行之间没间距。
你平时调多行布局的时候,是不是也分不清这俩属性?评论区说说你最头疼的 CSS 布局问题,小索奇帮你出主意!
前面忘了提一句,Flex 布局也不是万能的。比如你想做文字环绕图片的效果,Flex 就搞不定,还得用 float。但 90% 的页面布局场景,Flex 都能轻松 hold 住,比传统布局高效太多了。
我是【即兴小索奇】,点击关注,后台回复 领取,获取更多相关资源