column分栏布局只是文字布局吗_「一劳永逸」48张小图带你领略flex布局之美

本文通过48张图详细讲解了Flex布局的基本概念,包括主轴、交叉轴以及如何通过`flex-direction`设置主轴方向。介绍了父容器的`justify-content`和`align-items`属性,以及子容器的`flex`属性,帮助开发者轻松掌握Flex布局,解决布局难题。
摘要由CSDN通过智能技术生成

前言


最近在项目中,遇到布局问题,有时候,需要堆叠很多的样式,去排版,一定程度上增加了代码量,那么有没有更加方便的布局方式呢?


48张图带你从0到1掌握flex布局方式。

flex布局在某种程度上,简便我们布局的一个难题,接下来的篇幅将介绍它的使用

b7a07c95c290bbf104090f5f9936306f.png

flex基本概念


要想熟练掌握flex布局的话,你需要理解两个概念:容器

d550344ccbd2859a650ad451bcde8bf3.png


从上面图来看,我们将flex布局分为两部分讲,容器

  • 主轴(mian axis)
  • 交叉轴(cross axis)

容器

  • 父容器(container)
  • 子容器(item)

打个预防针,flex布局涉及到12个CSS属性,父容器,子容器各6个。
接下来先梳理常见的属性,不常见的放在进阶部分来梳理。

我们知道,包括主轴交叉轴,那么它们的方向是如何决定呢?我们直接从一张图看懂它

895722b2c79a16234655742666831430.png


默认情况下,主轴的方向是从左向右的,交叉轴垂直于主轴,逆时针方向90度,那么接下来我们看flex-direction是如何决定主轴的。讲这个之前,我们需要明白

  • 交叉轴是由主轴决定的,主轴又是由flex-direction决定的。
  • flex-direction属性设置在父容器上,这样子才可以生效。

flex-direction: row | row-reverse | column | column-reverse 复制代码

6c9b0a9e68670456345970826b2b5add.png


首先布局如下
<div class="wrapper"> <div class="flex1">子盒子#flex1: 1 </div> <div class="flex2">子盒子#flex2: 1 </div> </div> 复制代码
接下来,我们看看他们的效果吧


flex-direction: row
当你给父盒子(wrapper)设置属性 flex-direction: row 复制代码
效果

ee343aa5d336eaad61b91b4c24ece787.png

结论

  • flex容器的主轴被定义为与文本方向相同。 主轴起点和主轴终点与内容方向相同。
  • 简单理解就是主轴沿着水平方向向右

flex-direction: row-reverse
当你给父盒子(wrapper)设置属性 flex-direction: row-reverse 复制代码
效果

12ed14fdb734a2a2031ed1108d72e51d.png


我们可以看到这两个盒子的位置发生了变化,这个就是主轴起点和主轴终点位置置换的原因。结论

  • 表现和row相同,但是置换了主轴起点和主轴终点。
  • 简单理解就是主轴沿着水平方向向左,与文本方向相反。

flex-direction: column
当你给父盒子(wrapper)设置属性 flex-direction: column 复制代码
效果

13f09c87ed471d00483699521be7b693.png


可以看到,子盒子的布局发生了变化,形成了在Y轴上的布局方式,并且书写方式跟布局一样。结论

  • flex容器的主轴和块轴相同。主轴起点与主轴终点和书写模式的前后点相同
  • 简单的理解,就是主轴变成Y轴方向,方向从上到下布局。

flex-direction: column-reverse
当你给父盒子(wrapper)设置属性 flex-direction: column-reverse 复制代码
效果

99cde90907f6213896eb95bba5fa7430.png


可以看到,子盒子的布局跟column差不多,唯一不同的是,方向上发生了变化。结论

  • 表现和column相同,但是置换了主轴起点和主轴终点
  • 简单的理解,就是主轴变成Y轴方向,方向从下到上,与书写的方向相反。

容器
这里就分为父容器子容器,我们先来看看父容器
父容器

  • justify-content: 设置子元素在主轴方向上的对齐方式
  • align-items: 设置子元素在交叉轴方向上的对齐方式

e7948dfbead2bdb217957bf6cc371328.png

justify-content
这个属性设置在父容器上,决定子元素在主轴方向上的对齐方式,我们看看它们具体表现吧


justify-content: flex-start
当你给父盒子(wrapper)设置属性 justify-content: flex-start 复制代码
效果

9cf4d9479c44ac9fd908e999aa5871e9.png

结论,子元素沿着主轴方向开始对齐。


justify-content: flex-end
当你给父盒子(wrapper)设置属性 justify-content: flex-end 复制代码
效果

b23eefcbc27ecbf937aade0535b9e29c.png

结论,子元素沿着主轴方向终点对齐。


justify-content: center
当你给父盒子(wrapper)设置属性 justify-content: center 复制代码
效果

6bdc8b9898216ef29fcce4bcd45f9ed6.png

结论,子元素在主轴方向上水平居中。


justify-content: space-between
当你给父盒子(wrapper)设置属性 justify-content: space-between 复制代码
效果

c17641ba15a3d84f9cdad5172ea5b3f7.png

结论,子元素在主轴方向上两端对齐,项目之间间隔相等


justify-content: space-around
当你给父盒子(wrapper)设置属性 justify-content: space-around 复制代码
效果

4c6f945b0b71a654ba48f8b008efca8b.png

结论,子元素在主轴方向上均匀排列每个元素,每个元素周围分配相同的空间


align-items
这个属性设置在父容器上,决定子元素在交叉轴方向上的对齐方式,我们看看它们具体表现吧


align-items: flex-start
当你给父盒子(wrapper)设置属性 align-items: flex-start 复制代码

3c7c941d1c965bf1f73e4e111b939cc0.png

结论,子元素在交叉轴方向上起点对齐。


align-items: flex-end
当你给父盒子(wrapper)设置属性 align-items: flex-end 复制代码

de70c76fcf1dcfeb69c613284b341c70.png

结论,子元素在交叉轴方向上终点对齐。


align-items: center
当你给父盒子(wrapper)设置属性 align-items: center 复制代码

6227f0005fb61b3f8ae8da49a92328ef.png

结论,子元素在交叉轴方向上居中对齐。


align-items: baseline
当你给父盒子(wrapper)设置属性 align-items: baseline 复制代码

4b5516a1bf66982e4290e3dcd42003f7.png

结论,子元素在交叉轴方向上以文字基线对齐,具体不清楚的,可以自行百度。


align-items: stretch
当你给父盒子(wrapper)设置属性 align-items: stretch 复制代码

64df5d4251609a7b2aafc75cc450d273.png

结论,这个属性是默认的,如果项目未设置高度或者设为 auto,将占满整个容器的高度。


子容器
先看张图片

2cb24df20ea157c348e0b73c52584136.png


子容器的话,这里就介绍两个属性

  • flex属性 定义在主轴是如何伸缩的
    • 子容器是有弹性的,它们会自动填充剩余空间,子容器的伸缩比由flex属性决定。
    • flex是多个属性的缩写,允许1-3个值的连写,具体参考上面的图。
  • align-self属性 单独设置子容器如何沿交叉轴排列
    • 每个子容器都可以单独定义沿交叉轴排列方式。
    • 该属性的取值跟父容器中的align-items属性一致,如果两者相同的话,则以子容器align-self属性为主。

flex作用规则

  • 三个属性的简写,是flex-grow flex-shrink flex-basis的简写
  • 常用简化写法
    • flex:1 —> flex:1 1 0%;
    • flex:3 —> flex:3 1 0%;
    • 注意:flexbox布局和原来的布局是两个概念,部分css属性在flexbox盒子里面不起作用,eg:float, clear, column,vertical-align 等等

注意 flex-grow flex-shrink flex-basis 这三个属性会在后续介绍 复制代码
具体的flex取值问题,可以参照下面的图

2323958c6cd568381a7ad841bb8fef43.png

align-self作用规则
// 起始端对齐 align-self : flex-start; 复制代码

a2c5d345a4414530f80e9f5751c889a8.png

// 末尾段对齐 align-self : flex-end; 复制代码

e1714a13ce0e2b1b73a5a3e6572b9cfe.png

基线对齐// 末尾段对齐 align-self : baseline; 复制代码

5d9018138af088de888de658a5dc2c82.png


可以看到的话,它们对齐的方式是第一行文字的基线。


拉伸对齐 align-self : stretch; 复制代码

64df5d4251609a7b2aafc75cc450d273.png

flex更深入了解
上面介绍的常见几个属性掌握的话,基本上可以满足日常的开发布局需求,剩下的一些属性,接下来将梳理一遍,这样子的话,早日成为flex布局进阶者
父容器

  • flex-wrap 设置换行方式
    • 绝对子容器是否可以选择换行,一般而言有三种状态,支持换行的话,也支持逆序换行。
  • flex-flow 设置轴向与换行组合
    • 是 flex-direction 和 flex-wrap 的简写。
    • 所以只要掌握,flex-directionflex-wrap即可。
  • align-content 多行沿交叉轴对齐方式
    • 当子容器多行排列时,设置行与行之间的对齐方式。

flex-wrap
设置子容器的换行方式,通常有三个取值
flex-wrap: wrap | nowrap | wrap-reverse 复制代码
三种情况


// 允许换行 flex-wrap : wrap 复制代码
效果

1d984e660ace33de3b093887241b6e65.png

// 不允许换行 flex-wrap : nowrap 复制代码
效果

4c3108637ac07a707a4c0e938de651ba.png

// 允许逆向换行 flex-wrap : wrap-reverse 复制代码
效果

7feafb909b9183d4b89322f64d8f7af9.png

flex-flow
先来一张图

8fda059760d8d9db5c92651a6e77533d.png

更多取值信息请查看 flex-directionflex-wrap
可以查看MDN上,或者把之前的flex-directionflex-wrap 两者取值看过一遍,那么使用这个属性就没有问题啦,这里也就不过多的举例子了,取值有三种情况

  • 单独设置flex-direction取值,比如
    • flex-flow: row | column 复制代码
  • 单独设置flex-wrap取值
    • flex-flow: wrap | nowrap | wrap-reverse 复制代码
  • 同时设置两者取值
    • flex-flow: row wrap flex-flow: column nowrap 复制代码

align-content
这个属性是定义子容器在交叉轴的排列方式,也就是对齐方式。
首先上一张图

ade576ac62c0e6ad0e2005bf7ed48ad3.png


根据这些取值,我们来看看布局效果吧


// 起始端对齐 align-content: flex-start 复制代码
效果

582fe82a966ab0be6295be65ca82a895.png

// 末尾段对齐 align-content: flex-end 复制代码
效果

c38e51773dc4a9d86949b842f687b69a.png

// 居中对齐 align-content: center 复制代码
效果

03d1c1be26516b2a4d9ae7dc2490cc50.png

// 等间距均匀分布 align-content: space-between 复制代码
效果

9ad7dac39dad709a9ddcc4b1ce0d144b.png

// 等边距均匀分布 align-content: space-around 复制代码
效果

9ad7dac39dad709a9ddcc4b1ce0d144b.png

// 拉伸对齐 align-content: stretch 复制代码
效果

73d58b688131cc3dcd2dfbd20fafbdb1.png

// 基线对齐 align-content: baseline 复制代码
效果

d1302aafa484d5f578841725c0c144e2.png

子容器

  • flex-grow 设置扩展比例
  • flex-shrink 设置收缩比例
  • flex-basis 设置基准大小
  • order 设置排列顺序

flex-grow
子容器弹性伸展的比例,简单理解,就是把剩余的空间按比例分配给子容器。
我们看个例子

a5abfe03455d2e95e9589c92522ceea4.png

flex-shrink
子容器弹性收缩的比例。简单理解,就是当你子容器超出的部分,会按照对应的比例给子容器减去对应的值。
我们来看下效果

59d1caf02f765e36df6f2b480e473715.png


当取值为0时,就会溢出,那么我们给它们设置一个值

c7fe88b79c1a1103ec9b19e7a8560b38.png


这样子的超出的部分就会按照比列减去。


flex-basis
有几个点需要注意的是

  • 在不伸缩的情况下,flex-basis给子容器设置大小才有作用。
  • 当主轴为横向时,即
    • flex-direction:row | row-reverse 复制代码
    • flex-basis设置的大小为宽度,并且会覆盖witdh值
  • 当主轴为纵向时,即
    • flex-direction:column | column-reverse 复制代码
    • flex-basis设置的大小为高度,并且会覆盖height值

我们来看看两种情况
当主轴为横向时 flex-direction:row | row-reverse 复制代码
效果

30f4dd61980a6a1f3457c17feb00abd6.png

当主轴为纵向时 flex-direction:column | column-reverse 复制代码
效果

2188fd48a07da63f458c4c4863c9db96.png

order

  • 每个子容器的order属性默认为0
  • 通过设置order属性值,改变子容器的排列顺序。
  • 可以是负值,数值越小的话,排的越靠前。

直接看效果图

a8c7648a6963ba8bd9e7dd8de4f04ec8.png

总结
这个时候,是不是需要总结一下呢
先看看子容器属性

b1b02681fc6abf6136c387e6ad0f3e14.png

再看看父容器属性

f4f6771878078b2bf2ae2ed806ed5127.png


梳理的是常见的属性值,对于一些不常见的属性值,请移步MDN

往期推荐:

君墨学致:零基础学习前端需要掌握的技术和相关教程​zhuanlan.zhihu.com
cf96a6bb32fe5d9afb8906e3a360beb1.png
李想:从菜鸟到大神这篇文章就够了​zhuanlan.zhihu.com


❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话:

  1. 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
    原文作者:TianTianUp
    原文链接:https://juejin.im/post/6866914148387651592
    原文来源:掘金
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值