大家好,我是刘布斯。
flex 是前端使用最多的布局方式,如果看到类似这种写法:
.container {
display: flex;
justify-content: space-between;
align-items: center;
}
你可能会想:“这不就很标准的 flex 三件套吗?”
是的,写是写出来了。但是你真不一定理解 flex 是怎么“流动”的。
今天就想从我在 flex 开发上踩过的坑,给大家加深一下对 flex 布局的理解。
印象特别深的是,有一次做后台系统的小模块,设计稿是左边文字,右边按钮,一行展示完,文字要自动省略。
很简单的一个需求,结果上线后测试告诉我,日文版本上的按钮,直接被挤出屏幕了……
那一刻我才意识到,对 flex 的认知只停留在“它可以横着排列元素”这个层面。
当时的代码大概是这样:
<div class="container">
<div class="text">这里是一大段标题文字</div>
<button class="action">按钮</button>
</div>
.container {
display: flex;
justify-content: space-between;
align-items: center;
}
.text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
文本也设置了省略号,本认为文字会自动“藏起来”,但上线后才发现部分语言下会把按钮挤走。
先来看看 ChatGPT 的解释:
.text
元素没有设置 min-width: 0
overflow: hidden
,它其实不会生效,除非你显式加上 min-width: 0
没有让文字区域“愿意收缩”
flex-shrink: 1
,可以收缩,但它需要前提是外部容器空间不足 并且 你没有阻止它缩。flex-shrink: 0
,或者设置了固定宽度,文字区域就会被无限压缩或挤没。justify-content: space-between
并不能保证你左边内容不会膨胀
那么该如何修改呢?
正确处理方式是:
.container {
display: flex;
align-items: center;
}
.text {
flex: 1;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.action {
flex-shrink: 0;
}
flex: 1
表示文字区域可以占满剩余空间min-width: 0
是关键!让文字愿意“缩”flex-shrink: 0
是对按钮说:“我不想缩小我自己”就这么一个布局上的小问题,我当时却花了大半天,在 devtools 中一点点调样式。从那以后我再也不敢小看 flex: 1
和 min-width: 0
了。
有次,我带的一个实习生在写轮播图的箭头组件,他说“箭头总是被压缩到一团,明明设置了 padding”。
我看了一眼结构,是典型的 flex 写法,箭头放在 container 两边,中间是轮播图片容器。问题出在箭头的宽度是固定死的,但图片容器用了 flex: 1
,没有处理收缩和最小宽度的关系。
我让他加上一句 min-width: 0
,问题就解决了。他愣了半天,说:“原来这个属性这么关键?”
我点了点头,心里却在想,当年我被这个问题折磨到怀疑人生的时候,也是这个表情。
我面试时也会顺手考 flex 相关的题目,场景不会太复杂,一般会包含这几个点:
这些题不难,但能拉开差距。写惯了 UI 的人和只看过教程的人,调出来的效果就是不一样。
只要遇到 flex 写不对的情况,我不急着 Google,而是先拿浏览器的 devtools 开“元素轮廓 + 尺寸显示”,一点点去看哪个元素在哪一层塌了。
你得亲眼看到 flex 是怎么把空间“分掉”的,才能真正理解它为啥错了。
Flex 这个东西,文档上只需要 10 分钟读完,但真正理解它,可能需要好几个月。
而且写完了你还会不断被打脸。被产品打,被测试打,被不同屏幕尺寸打。打着打着,你就真的会了。
说到底,它是你写出来的,不是你背出来的。
如果你最近正好也在学 CSS 布局,建议你别急着上 Grid,先把 flex 写到“用得顺手”。你会发现,90% 的页面,其实只靠它就能解决。
等你哪天看到一个复杂的 UI,不加 className、不加备注,也能凭经验判断“这块要写 flex,这块要留 shrink”,那才是真掌握了。
还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果近期准备或者正在找工作,千万不要错过,题库主打无广告和更新快哦~。
老规矩,也给我们团队的辅导服务打个广告。