学习 CSS 的时候,经常会听到一句话:
不会 Flex,就不会写页面。
刚开始学习的时候,我一直很好奇:
- 什么是弹性布局?
- 为什么大家都推荐用 Flex?
flex: 1到底是什么意思?flex-grow、flex-shrink、flex-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,基本可以完成日常绝大多数页面布局开发。