【CSS】flex布局详解

布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性。

2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。

Flex 是 Flexible Box 的缩写,意为"伸缩盒模型"或者"弹性盒模型",用来为盒状模型提供最大的灵活性。

1. 伸缩容器和伸缩项目

1.1 概念定义

伸缩容器: 给元素设设置 display: flex 或者 display:inline-flex,该元素就变为伸缩容器。

伸缩项目: 伸缩容器的子元素就是伸缩项目。

1.2 伸缩项目的特点

  • 一个元素既可以是容器也可以是项目

  • 没有脱离文档流,可以水平排列(沿着主轴方向,主轴方向默认水平),也没有空白

  • 不管原来显示模式是什么,变成伸缩项目就具备伸缩项目的特点

  • 伸缩项目权重等级比浮动高,小于定位。也就是同时设置伸缩和浮动,显示伸缩,同时设置伸缩和定位,显示定位

  • 伸缩项目具有独立的显示模式

    • 默认宽高被内容撑开,不存在外边距的塌陷合并(区别块元素)
    • 可以完美设置宽高、内外边距(区别于行内元素)
    • 不会被父元素作为文本(区别于行内块元素)
  • 伸缩项目具有伸缩性

容器没有特点,重点是项目

2. 设置主轴方向和换行方式

主轴main axis: 伸缩项目会沿着主轴进行排列,第一个伸缩项目在主轴起点处,然后依次排列

侧轴cross axis: 侧轴永远与主轴保持垂直,修改主轴方向,侧轴也随之改变

img

2.1 设置主轴方向flex-direction

给伸缩容器设置属性flex-direction,可以改变主轴方向

语义
row默认水平从左到右image.png
row-reverse水平从右到左image.png
column竖直从上到下image.png
column-reverse竖直从下到上image.png

2.2 设置换行方式flex-wrap

给伸缩容器设置属性flex-wrap,可以改变伸缩项目在主轴上的换行方式

语义
nowrap不换行默认image.png
wrap自动换行image.png
wrap-reverse自动换行且翻转image.png

2.3 同时设置主轴方向和换行方式flex-flow

给伸缩容器设置属性flex-flow可以同时设置主轴方向和换行方式,相当于复合属性,也可以写一个值

3. 在主轴上的对齐方式 justify-content

给伸缩容器设置 justify-content , 该属性的值如下:

语义
flex-start主轴起点对齐image.png
flex-end主轴终点对齐image.png
center居中对齐image.png
space-between两端对齐image.png
space-around两端的间距是中间间距的一半image.png
space-evenly两端的间距与中间间距相同image.png

4. 在侧轴上的对齐方式

4.1 一条主轴线(伸缩项目在主轴上不换行) align-items

给伸缩容器设置 align-items,属性值如下:

语义
stretch拉伸,默认值。 如果伸缩项目不设置侧轴上的长度,会拉伸至于伸缩容器侧轴长度一致。image.png
flex-start侧轴起点对齐image.png
flex-end侧轴终点对齐image.png
center居中对齐image.png
baseline基线对齐image.png

4.2 多条主轴线 (伸缩项目在主轴上发生换行) align-content

给伸缩容器设置 align-content,属性值如下:

语义
stretch拉伸,默认值。 如果伸缩项目不设置侧轴上的长度,会拉伸至于伸缩容器侧轴长度一致。image.png
flex-start侧轴起点对齐image.png
flex-end侧轴终点对齐image.png
center居中对齐image.png
space-between两端对齐image.png
space-around两端的间距是中间间距的一半image.png
space-evenly两端的间距与中间间距相同image.png

5. 伸缩项目的伸缩性

5.1 伸缩项目在主轴上的长度 flex-basis

  1. 该属性设置的是伸缩项目在主轴上的长度,优先级高于 width 或者 height。
  2. 该属性默认值 auto,默认,伸缩项目在主轴上的长度按照 width 或者 height 的设置。

image.png

5.2 扩展比率 flex-grow

伸缩项目扩展的前提:

  1. 伸缩容器在主轴方向上有富余空间
  2. 伸缩项目的扩展比率不能是 0

伸缩项目扩展的规则:

各伸缩项目按照各自的扩展比率,瓜分伸缩容器的富余空间

image.png

5.3 收缩比率flex-shrink

伸缩项目收缩的前提:

  1. 伸缩容器在主轴上的长度不够(小于伸缩项目在主轴上的长度和)
  2. 收缩比率不能是 0
  3. 伸缩项目在主轴上不能自动换行

伸缩项目收缩的规则:

既要考虑收缩比率,也要考虑伸缩项目原本在主轴上的长度

image.png

5.4 flex 复合属性

flex: 扩展比率 收缩比率 basis;
/* 简写 */
flex: 1;  /* flex:1 1 0 */
flex: auto; /* flex: 1 1 auto*/
flex: none;  /* flex:0 0 auto */
flex: 0 auto;  /*flex:0 1 auto*/

6. 伸缩项目排序

给伸缩项目设置属性 order
属性的值是纯数字,可以是负值,值越大,排序越靠后

image.png

7. 单独设置伸缩项目在侧轴上的对齐方式 align-self

给伸缩项目设置 align-self,属性值:

语义
auto默认值,按照伸缩容器中 align-items 的设置
stretch拉伸
flex-start侧轴起点对齐
flex-end侧轴终点对齐
center居中对齐
baseline基线对齐

8. 总结

8.1 容器属性

属性属性值说明
flex-direction(主轴排列方向)row默认值,主轴为水平,起点在左端,从左往右排列
row-reverse主轴为水平,起点在右端,从右往左排列
column主轴为垂直方向,起点在上边,从上往下排列
colum-reverse主轴为垂直方向,起点在下边,从下往上排列
flex-wrap(项目在容器中一行无法显示的时候如何换行)nowrap默认值,不换行/列
wrap主轴是水平时,从上到下换行;主轴为垂直时。从左到右换行
wrap-reverse主轴是水平时,从下到上换行;主轴为垂直时。从右往左换行
justify-content(项目在容器中主轴上对齐方式)flex-start默认值,左对齐
flex-end右对齐
center居中对齐
space-between两端对齐
space-around每个项目两侧的间距相等
align-items(项目在侧轴上对齐方式)flex-start侧轴起点对齐
flex-end侧轴终点对齐
center侧轴中点对齐
baseline伸缩项目的第一行文字的基线对齐
stretch默认值,如果伸缩项目未设置高度或设为auto,将占满整个容器的高度
align-content(侧轴方向上有多根轴线的对齐方式,如果只有一根不起作用)flex-start与侧轴的起点对齐
flex-end与侧轴的终点对齐
center与侧轴的中点对齐
space-between与侧轴两端对齐,轴线之间的间隔平均分布
space-around每根轴线两侧的间隔都相等
stretch默认值,轴线占满整个侧轴

8.2 项目属性

属性说明
order(定义项目的排列顺序)数字数值越小,排列越靠前,默认为0
flex-grow(项目放大比例)数字默认为0,即如果存在剩余空间,也不放大。
flex-shrink(项目的缩小比例)数字默认为1,即如果空间不足,该项目将缩小。
flex-basis(在分配多余空间之前,伸缩项目占据的主轴空间)长度/auto默认值为auto,即项目的本来大小。
align-self(当前项目可以和其他项目拥有不一样的对齐方式,覆盖align-items属性)flex-start侧轴起点对齐
flex-end侧轴终点对齐
center侧轴中点对齐
baseline伸缩项目的第一行文字的基线对齐
stretch默认值,如果伸缩项目未设置高度或设为auto,将占满整个容器的高度
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值