一文搞懂 Flex 弹性布局:为什么它成为现代 CSS 布局的首选?

学习 CSS 的时候,经常会听到一句话:

不会 Flex,就不会写页面。

刚开始学习的时候,我一直很好奇:

  • 什么是弹性布局?
  • 为什么大家都推荐用 Flex?
  • flex: 1 到底是什么意思?
  • flex-growflex-shrinkflex-basis 又分别有什么作用?

这篇文章主要记录一下自己的学习过程,希望能帮助和我一样刚开始学习前端布局的同学。


什么是 Flex?

Flex,全称 Flexible Box(弹性盒子)。

它是 CSS 提供的一种现代布局方案,用来更加方便地排列页面中的元素。

相比传统的:

  • 浮动布局(float)
  • 定位布局(position)

Flex 使用起来更加简单,也更适合响应式页面开发。

一句话理解:

css 复制代码
Flex 就是一种让子元素能够自动排列、自动伸缩的布局方式。

如何开启 Flex 布局?

只需要给父元素设置:

css 复制代码
display: flex;

例如:

xml 复制代码
<div class="container">
    <div>1</div>
    <div>2</div>
    <div>3</div>
</div>
css 复制代码
.container{
    display:flex;
}

此时:

三个子元素就会自动排列在一行。


Flex 的默认排列方向

Flex 开启以后:

默认会把子元素放到:

css 复制代码
主轴(Main Axis)

默认情况下:

主轴就是:

复制代码
X 轴(从左到右)

布局效果:

css 复制代码
┌───────────────────────────┐
│ A    B    C               │
└───────────────────────────┘

如果需要改成竖直方向:

可以使用:

css 复制代码
flex-direction: column;

这样:

主轴就变成了:

复制代码
Y 轴

flex-grow:控制放大

当父容器还有剩余空间时。

子元素默认不会自动放大。

例如:

父容器:

复制代码
1000px

三个子元素:

复制代码
100px

100px

100px

总共:

复制代码
300px

还剩:

复制代码
700px

如果:

css 复制代码
flex-grow:1;

三个子元素就会:

复制代码
按照比例分配剩余空间。

例如:

css 复制代码
.item{
    flex-grow:1;
}

最终:

三个元素都会变宽。


按比例放大

例如:

css 复制代码
.item1{
    flex-grow:1;
}

.item2{
    flex-grow:2;
}

.item3{
    flex-grow:1;
}

比例就是:

yaml 复制代码
1 : 2 : 1

剩余空间:

会按照:

shell 复制代码
25%

50%

25%

进行分配。


flex-shrink:控制缩小

当父容器空间不足时。

Flex 默认会压缩子元素。

例如:

父容器:

复制代码
300px

三个子元素:

复制代码
150px

150px

150px

总宽:

复制代码
450px

明显放不下。

如果:

css 复制代码
flex-shrink:1;

Flex 会自动:

复制代码
按比例缩小所有子元素。

如果:

css 复制代码
flex-shrink:0;

表示:

复制代码
禁止缩小。

此时:

可能会出现滚动条。


flex-basis:默认大小

flex-basis 可以理解成:

复制代码
子元素的初始宽度。

例如:

css 复制代码
.item{
    flex-basis:200px;
}

表示:

Flex 在计算布局之前:

先认为:

复制代码
每个元素宽度都是 200px。

然后:

再结合:

  • grow
  • shrink

计算最终大小。


flex 简写

平时最常见的是:

css 复制代码
flex:1;

实际上:

完整写法是:

css 复制代码
flex-grow

flex-shrink

flex-basis

例如:

css 复制代码
flex:0 0 200px;

等价于:

css 复制代码
flex-grow:0;

flex-shrink:0;

flex-basis:200px;

意思就是:

复制代码
宽度固定 200px。

既不放大。

也不缩小。

flex-wrap:允许换行

默认情况下:

Flex 所有子元素都会:

复制代码
挤在同一行。

如果空间不足:

默认不会换行。

例如:

css 复制代码
display:flex;

效果:

复制代码
□□□□□□□□□□□□

如果:

css 复制代码
flex-wrap:wrap;

表示:

复制代码
空间不足时

允许自动换行。

布局:

复制代码
□□□□

□□□□

□□□□

对于:

商品列表。

图片墙。

标签布局。

都非常有用。


三栏布局

Flex 最经典的应用之一:

就是:

复制代码
左侧菜单

中间内容

右侧工具栏

例如:

复制代码
┌──────────────────────────────┐
│200px│     自适应     │200px│
└──────────────────────────────┘

实现方式:

左右固定:

css 复制代码
left{
    width:200px;
}

right{
    width:200px;
}

中间:

css 复制代码
center{
    flex:1;
}

其中:

css 复制代码
flex:1

表示:

复制代码
自动占满剩余空间。

这也是 Flex 最常见的使用场景。


为什么会调整 HTML 顺序?

很多网站:

例如:

新闻网站。

博客。

搜索引擎。

都会优先加载:

复制代码
主体内容。

原因:

复制代码
主体内容最重要。

因此:

HTML 可以写成:

css 复制代码
<main></main>

<aside></aside>

<aside></aside>

但是:

页面展示:

希望变成:

复制代码
左

中

右

这时候:

可以使用:

css 复制代码
order:-1;

改变:

复制代码
视觉顺序。

例如:

css 复制代码
.left{
    order:-1;
}

最终:

虽然:

HTML 中:

主体内容最先加载。

但是:

页面依然能够显示:

复制代码
左侧

主体

右侧

既兼顾了:

SEO。

又兼顾了:

页面布局。


我的理解

学习 Flex 后,我最大的感受就是:

以前使用:

  • float
  • position

布局时。

需要考虑很多问题:

  • 清除浮动
  • 高度塌陷
  • 定位计算

而 Flex:

只需要:

css 复制代码
display:flex;

很多布局问题就能轻松解决。

尤其是在:

  • 导航栏
  • 卡片布局
  • 后台管理系统
  • 三栏布局
  • 响应式页面

Flex 已经成为现代前端开发中最常用的布局方式。


总结

一句话记住今天的内容:

css 复制代码
Flex(Flexible Box)是一种现代 CSS 布局方案。

它默认让子元素沿主轴排列,并提供了灵活的放大、缩小、换行等能力。

其中:

flex-grow:控制放大比例;

flex-shrink:控制缩小比例;

flex-basis:设置初始大小;

flex-wrap:控制是否换行;

flex:是 grow、shrink、basis 的简写。

掌握 Flex,基本可以完成日常绝大多数页面布局开发。
相关推荐
用户059540174468 小时前
AI记忆存储一致性踩坑实录:每天手工回归200条对话,直到我用pytest+Redis搭建自动化验证
前端·css
思码梁田1 天前
CSS letter-spacing 属性详解:掌控字符之间的呼吸感
前端·css
贾伟康1 天前
【安心陪诊 Agent v1.1】首页可信设计实战:HTML/CSS 状态卡与急症分流
css·html·harmonyos·ai agent·首页设计
AZaLEan__1 天前
CSS文档流相关:BFC
前端·css
‘’林花谢了春红‘’2 天前
小玩意 生日快乐
css·html·css3
梨想橙汁2 天前
CSS零基础入门:语法、引入方式与基础样式全解析
css
七牛开发者2 天前
RAG 工程里的上下文剪枝:如何减少 68% 的上下文
前端·css·github
叉歪2 天前
为 UnoCSS 扩展无限色阶与主题换色
前端·css
TheITSea2 天前
4、React+Tailwind CSS
前端·css·react.js