## Flex
[TOC]
----
### 简介
```html
<style>
.container {
display: flex;
/* display: inline-flex; */
/* 设为 Flex 布局以后,子元素的 `float` 、`clear` 和 `vertical-align` 属性将失效。 */
}
</style>
<div class="container">
<div class="item"></div>
<div class="item"></div>
...
</div>
```
弹性布局,容器中项目的宽度、高度可以根据容器的大小而自动伸缩,故称为 “弹性布局”。
传统的弹性布局,依靠 `width: auto | 100%` 这类非固定值的属性值,而 flex 有更灵活的方式来控制项目如何填充容器以及布局。
本文档主要内容是对 https://css-tricks.com/snippets/css/a-guide-to-flexbox/ 、 https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 的精简整理,方便快速查阅。
----
### 容器属性
#### flex-direction
```css
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/flex-direction.svg)
控制主轴的方向,默认值 `row` 表示 横向的 从左到右。
----
#### flex-wrap
```css
.container {
flex-wrap: nowrap | wrap | wrap-reverse;
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/flex-wrap.svg)
定义项目在容器内是否能换行(当一行放不下时),默认值 `nowrap` 表示不换行。
----
#### justify-content
```css
.container {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right ... + safe | unsafe;
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/justify-content.svg)
定义项目沿主轴的对齐方式,可决定如何分配剩余空间,默认值 `flex-start`。
----
#### align-items
```css
.container {
align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe;
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/align-items.svg)
可视为交叉轴的 `justify-content` 版本。定义了项目沿交叉轴的对齐方式(上下对齐),默认值 `stretch` 表示拉伸高度,如果项目未设置高度或设为 `auto`,则项目将占满整个容器的高度。
----
#### align-content
```css
.container {
align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline + ... safe | unsafe;
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/align-content.svg)
**仅对多行项目有效**,多行时定义项目沿交叉轴的布局方式,默认值 `flex-start`。
----
#### gap
```css
.container {
gap: 10px;
gap: 10px 20px; /* row-gap column-gap */
row-gap: 10px;
column-gap: 20px;
}
```
![](https://css-tricks.com/wp-content/uploads/2021/09/gap-1.svg)
定义项目之间的间隔大小(左右和上下的空间间距,仅项目之间的间距,而不是与容器间的空间)。因为轴向对齐的影响,所以此属性可认为是最小间距配置。
请注意,为了便于展示效果,本文的示例图默认都是有 `gap` 值的效果。
----
### 项目属性
#### order
```css
.item {
order: 5; /* default is 0 */
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/order.svg)
定义项目的排序,默认情况下项目的 `order` 属性都为 0,弹性项目按源代码顺序排列。(数值越小,排列越靠前)
----
#### flex-grow
```css
.item {
flex-grow: 2; /* default 0 */
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/flex-grow.svg)
定义项目的放大比例,**默认值 0 即如果存在剩余空间,也不放大**(负数无效)。它决定了项目如何分配弹性容器的剩余空间。
如果所有项目都将 `flex-grow` 设置为 1 ,则容器中的剩余空间将平均分配给所有子项。如果其中一项的值为 2 ,则该项将占用其他任一项目空间的两倍(或者至少会尝试)。
----
#### flex-shrink
```css
.item {
flex-shrink: 3; /* default 1 */
}
```
![](https://www.ruanyifeng.com/blogimg/asset/2015/bg2015071015.jpg)
类似 `flex-grow` 属性,定义了项目的缩小比例,**默认值 1,即如果空间不足,项目将缩小**(负数无效)。
如果所有项目的 `flex-shrink` 属性都为 1,当空间不足时,都将等比例缩小。如果一个项目的 `flex-shrink` 属性为 0,其他项目都为 1,则空间不足时,前者不缩小。
`flex-wrap: wrap;` 换行时,空间不足 的情况是指一行不足以放一个项目的情况。
如果不换行,也不允许缩小,那么项目将在一行溢出到容器外(此时用 overflow 控制溢出效果)。
----
#### flex-basis
```css
.item {
flex-basis: <length> | auto; /* default auto */
}
```
![](https://www.w3.org/TR/css-flexbox-1/images/rel-vs-abs-flex.svg)
定义项目的默认宽度,默认值 `auto`,可以设为跟 `width` 属性一样的值(比如350px),则项目将占据固定空间。
当项目同时设置 `width` 属性时,以 `flex-basis` 优先级高为准,但当 `flex-basis: auto` 时,则以 `width` 属性为准。
`flex-basis: 0 || 0%` 等同 `width: min-content`。
----
#### align-self
```css
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
```
![](https://css-tricks.com/wp-content/uploads/2018/10/align-self.svg)
允许项目覆盖由 `align-items` 指定的对齐方式。
> 注意, `float` 、 `clear` 和 `vertical-align` 对弹性项目没有影响。
----
### 属性简写
#### flex-flow
```css
.container {
flex-flow: column wrap;
}
```
`flex-direction` 和 `flex-wrap` 属性的简写,它们共同定义了 Flex 容器的主轴和交叉轴。默认值 `row nowrap`。
----
#### flex
```
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
```
这是 `flex-grow` 、`flex-shrink` 、 `flex-basis` 的简写。第二个和第三个参数( `flex-shrink` 和 `flex-basis` )是可选的。默认值为 `0 1 auto`。
注意,如果省略了 `flex-basis` 属性,则会将其更改为 `0%`:
```css
flex: 5;
flex-grow: 5;
flex-shrink: 1;
flex-basis: 0%;
```
> `.item { margin-right: auto; }` 可以影响 flex 项目的空间分配,这点很有用,可以产生让项目右侧就像多出来一个 `flex-grow: 1;` 的项目一样的效果。
----
### 栅格系统实现
[Flexbox 打造栅格系统 - 知乎](https://zhuanlan.zhihu.com/p/21887541)
栅格系统要素:容器,项目,装订线(项目间距)。这些在 flex 容器中浑然天成,所以用 flex 实现12栅格系统就非常简单了。
```css
.container {
display: flex;
justify-content: flex-star
gap: 15px;
padding: 15px;
}
.col-1 {
flex: 0 0 8.33333%;
}
...
.col-3 {
flex: 0 0 25%;
}
...
.col-12 {
flex: 0 0 100%;
}
```
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖