CSS3(八) CSS3 FLEX布局

Flex 布局

布局的传统方案是基于盒模型,依赖 display 属性+float 属性+position 属性.但是对于那些特殊布局非常不方便,比如垂直居中就不容易实现.

于是在 2009 提出来了弹性盒模型就是 display:box;然后在 2012 年在此基础上又升级了一套新标准就是:Flex 我相信 Flex 布局将会成为未来布局的首选方案

(一)Flex 布局基本概念

1.前提

使用 Flex 布局必须遵循一个前提就是父元素必须加上 display:flex;设为 Flex 布局以后,子元素的float,clear,和vertical-align属性讲全部失效 ####2.容器与项目

  • 父元素设置为 Flex 容器后,我们称为 Flex 容器,简称”容器”。
  • 他的所有子元素自动成为容器成员,称为 Flex 项目。简称”项目”
  • 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end;交叉轴的开始位置叫做 cross start,结束位置叫做 cross end。
  • 项目默认沿主轴排列。单个项目占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size。

2.容器的属性

容器的属性有 6 大类,但是可以合并为 3 类

  • flex-direction:决定主轴的方向(项目排列的方向)
  • flex-wrap:超出后是否换行
  • flex-flow:就是上两个的综合,速记
  • justify-content:项目在主轴的横轴对齐方式
  • align-items:项目在主轴的纵轴对齐方式
  • align-content:需要和 flex-wrap 一起使用。他表示超出后形成的 2 行在纵轴对齐方式

3.1flex-direction:决定主轴的方向即项目排列的反向

.box{display:flex;flex-direction:row|row-reverse|column|column-reverse;}
  • row(默认值):主轴为水平方向,起点在左端.
  • row-reverse:主轴为水平方向,起点在右端
  • column:主轴为垂直方向,起点在上端
  • column-reverse:主轴为垂直方向,起点在下端

3.2 flex-wrap 属性.超出一行后,是否换行

.box{flex-wrap:nowrap||wrap||wrap-reverse;}
  • nowrap(默认):不换行
  • wrap:换行,第一行在上方
  • wrap-reverse:最后一行在上方,第一行在最下方

3.3 flex-flow 属性是上面的 flex-direction 和 flex-wrap 的属性的简写方式,默认值就是 row nowrap

.box{flex-flow:<flex-direction>||<flex-wrap>}

3.4 justify-content 定义了项目在主轴横轴的对齐方式

.box{justify-content:flex-start||flex-end||center||space-between||space-around}
  • flex-start:(默认值)左端对齐
  • flex-end:右端对齐
  • center:居中
  • space-between:两端对齐,项目之间的间隔都相等
  • space-around:每个项目的间隔都相等,项目之间的间隔比项目与边框的间隔大一倍
    具体见下图:
.box{align-items:flex-start||flex-end||center||stretch||baseline}
  • flex-start: 顶端对齐
  • flex-end:尾端对齐
  • center:居中对齐
  • stretch:(默认)如果项目没有设置高度,那么将沾满整个容器的高度
  • baseline:项目第一行的文字的基线对齐

3.6 align-content 定义了多行对齐的方式,如果项目只有一行,则该属性不会起作用

.box{align-content:flex-start||align-end||center||stretch||space-between||space-around}

4.项目

  • order:自定义项目的顺序
  • flex-grow:默认是 0 关闭。后面接数字表示横轴分了多少份
  • flex-shrink:默认是 1.允许缩放。后面接数字。表示横轴缩小了多少份。
  • flex-basis:表示项目基础值
  • flex: grow 值 shrink 值 basis 基础值。(速记版本)
  • align-self:只单个项目的纵轴。不影响其他项目

4.1 order 属性定义了项目的排列顺序,数值越小,排名越靠前默认是 0,要是值一样则看 HTMLDOM 顺序

li{order:4;}

4.2 flex-grow 可以理解为项目占得份数或者放大比例,如果存在剩余空间。也不放大

.box{flex-grow:<number>||默认是0}

如果所有的项目 flex 属性都是 1,那么他们将等分剩余空间。如果一个项目的 flex-grow 属性为 2.其他项目都是 1,则前者占据的剩余空间比其他项目多一倍。

.box{flex-shrink:<number>||默认是1}

如果项目的 flex-shrink 属性都为 1,当空间不足的时候,都将等比例缩小。如果一个项目的 flex-shrink 属性为 0,其他项目都是 1,则空间不足,前者不缩小.

.box{flex-basis:100px||百分比||em||rem||auto默认就是auto}

4.5 flex 属性是 flex-grow,flex-shrink,flex-basis 的简写,默认值就是 0 1 auto,后两个可选

.box{flex:none|[flex-grow] [flex-shrink] [flex-basis]}

该属性有 2 个快捷值: auto(1 1 auto)和 none(0 0 auto)

4.6 align-self 允许单个项目与其他项目不一样的对齐方式,可覆盖

.box{align-self: auto | flex-start | flex-end | center | baseline | stretch;}
auto:他会遵循父元素

总结

简单来说父元素有 4 个属性

  • flex-flow
  • justify-content
  • align-items
  • align-content
    子元素有 3 个属性:
  • order
  • flex
  • align-self

到此 Flex 布局全部结束。

下面这些属于题外话了主要就是弄清楚 FLEX 的宽度是怎么计算的
举个例子
有 3 个 FLEX 项目对应的数值是 flex: 3 1 200px; flex: 2 2 300px;flex: 1 3 600px;

    现在有2种情况
    [当他们的父元素是1000px的时候这个时候你会发现项目元素的总宽度大于了1000px]() 因为200+300+600=1100>1000超出了100PX
    那么他用到的就是shrink
    他先获取压缩总的数据 1*200+2*300+3*600 = 2600
    1*200/2600*100=7.6px; 再用基准值200-7.6=192.4就是项目1实际的宽度
    2*300px/2600*100 = 23px ; 再用基准值300-23 = 277px 就是项目2的实际宽度
    3*600/2600*100 = 69px; 再用基准值600-69 = 531px 就是项目3的实际宽度
    [第二种情况要是他们的父元素是1200px,也就是子元素的所有基准值加在一起小于父元素的宽度]()
     200+300+600 = 1100<1200 实际宽度比总和小100PX
    这个时候看的就是flex-grow了  3+2+1=6 相当于他分了6份了
    项目一的宽度就是 100/6*3 =50 然后再用项目一的基准值+50 = 200+50 = 250
    项目二的宽度就是 100/6*2 = 33再利用项目二的基准值+33 = 300+33 = 333
    项目三的宽度就是100/6*1 = 16.6 再利用项目三的基准值+16.6 = 600+16.6 = 617px

用的最多的

  • flex: 0 1 300px;表示的就是不用铺满,允许伸缩,宽度或者是高度最低 300px
  • 父元素要是 flex-flow:column nowrap;那么子元素的 flex:0 1 300px; 这里的 300px 就是最低的高度
  • 父元素要是 flex-flow:row nowrap;那么子元素的 flex:0 1 300px; 这里的 300px 就是最低的宽度

文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录