说说flexbox(弹性盒布局模型),以及适用场景

android FlexboxLayout 设置固定列数 flexbox布局_html

一、是什么

1、flexible box 简称 flex,意为 ”弹性布局” ,可以简便、完整、响应式地实现各种页面布局

2、采用 flex 布局的元素,称为 flex 容器 container

3、它的所有子元素自动成为容器成员,称为 flex 项目 item

android FlexboxLayout 设置固定列数 flexbox布局_默认值_02


4、容器中默认存在两条轴, 主轴交叉轴 ,呈90度关系。项目默认沿主轴排列,通过 flex-direction 来决定主轴的方向

5、每根轴都有起点和终点,这对于元素的对齐非常重要

二、属性

关于 flex 常用的属性,我们可以划分为 容器属性容器成员属性

容器属性有:

  • (1)flex-direction
  • (2)flex-wrap
  • (3)flex-flow
  • (4)justify-content
  • (5)align-items
  • (6)align-content

1、flex-direction

(1)决定主轴的方向(即项目的排列方向)

.container {   
    	flex-direction: row | row-reverse | column | column-reverse;  
	}

(2)属性对应如下:

  • (1) row(默认值) :主轴为水平方向,起点在左端
  • (2) row-reverse :主轴为水平方向,起点在右端
  • (3) column :主轴为垂直方向,起点在上沿。
  • (4) column-reverse :主轴为垂直方向,起点在下沿

(3)如下图所示:

android FlexboxLayout 设置固定列数 flexbox布局_两端对齐_03

2、flex-wrap

(1)弹性元素永远沿主轴排列,那么如果主轴排不下,通过 flex-wrap 决定容器内项目是否可换行

.container {  
    	flex-wrap: nowrap | wrap | wrap-reverse;
	}

(2)属性对应如下:

  • (1) nowrap(默认值) :不换行
  • (2) wrap :换行,第一行在上方
  • (3) wrap-reverse :换行,第一行在下方

(3)默认情况是不换行,但这里也不会任由元素直接溢出容器,会涉及到元素的弹性伸缩

3、flex-flow

(1)是 flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap

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

4、justify-content

(1)定义了项目在 主轴上 的对齐方式

.box {
    	justify-content: flex-start | flex-end | center | space-between | space-around;
	}

(2)属性对应如下:

  • (1) flex-start(默认值) :左对齐
  • (2) flex-end :右对齐
  • (3) center :居中
  • (4) space-between :两端对齐,项目之间的间隔都相等
  • (5) space-around :两个项目两侧间隔相等

(3)效果图如下:

android FlexboxLayout 设置固定列数 flexbox布局_html5_04

5、align-items

(1)定义项目在 交叉轴上 如何对齐

.box {
 		align-items: flex-start | flex-end | center | baseline | stretch;
	}

(2)属性对应如下:

  • (1)stretch(默认值) :如果项目未设置高度或设为auto,将占满整个容器的高度
  • (2) flex-start :交叉轴的起点对齐
  • (3) flex-end :交叉轴的终点对齐
  • (4) center :交叉轴的中点对齐
  • (5) baseline : 项目的第一行文字的基线对齐

6、align-content

(1)定义了 多根轴线 的对齐方式。如果项目只有一根轴线,该属性不起作用

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

(2)属性对应如下:

  • (1) stretch(默认值) :轴线占满整个交叉轴
  • (2) flex-start :与交叉轴的起点对齐
  • (3) flex-end :与交叉轴的终点对齐
  • (4) center :与交叉轴的中点对齐
  • (5) space-between :与交叉轴两端对齐,轴线之间的间隔平均分布
  • (6) space-around :每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍

(3)效果图如下:

android FlexboxLayout 设置固定列数 flexbox布局_css_05

容器成员属性如下:

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

1、order

(1)定义项目的排列顺序。数值越小,排列越靠前, 默认为 0

.item {
    	order: <integer>;
	}

2、flex-grow

(1)上面讲到当容器设为 flex-wrap: nowrap; 不换行的时候,容器宽度有不够分的情况,弹性元素会根据 flex-grow 来决定

(2)定义项目的放大比例(容器宽度 > 元素总宽度时如何伸展)

默认为0,即如果存在剩余空间,也不放大

.item {
    	flex-grow: <number>;
	}

(3)如果所有项目的 flex-grow 属性都为 1 ,则它们将等分剩余空间(如果有的话)

android FlexboxLayout 设置固定列数 flexbox布局_html5_06

(4)如果一个项目的 flex-grow 属性为 2 ,其他项目都为 1 ,则前者占据的剩余空间将比其他项多一倍

android FlexboxLayout 设置固定列数 flexbox布局_html_07


(5)弹性容器的宽度正好等于元素宽度总和,无多余宽度,此时无论flex-grow是什么值都不会生效

3、flex-shrink

(1)定义了项目的缩小比例(容器宽度 < 元素总宽度时如何收缩),默认为 1 ,即如果空间不足,该项目将缩小

.item {    
		flex-shrink: <number>; 
		/* default 1 */
	}

(2)如果所有项目的 flex-shrink 属性都为 1 ,当空间不足时,都将等比例缩小

(3)如果一个项目的 flex-shrink 属性为 0 ,其他项目都为 1 ,则空间不足时,前者不缩小

android FlexboxLayout 设置固定列数 flexbox布局_html_08


(4)在容器宽度有剩余时, flex-shrink 也是不会生效的

4、flex-basis

(1)设置的是元素在主轴上的初始尺寸,所谓的初始尺寸就是元素在 flex-growflex-shrink 生效前的尺寸

(2)浏览器根据这个属性,计算主轴是否有多余空间,默认值为 auto ,即项目的本来大小。如设置了 width 则元素尺寸由 width / height 决定(主轴方向),没有设置则由内容决定

.item {    
		flex-basis: <length> | auto; 
		/* default auto */
	}

(3)当设置为 0 的是,会根据内容撑开

(4)它可以设为跟 widthheight 属性一样的值(比如350px),则项目将占据固定空间

5、flex

(1) flex 属性是 flex-grow , flex-shrinkflex-basis 的简写,默认值为 0 1 auto ,也是比较难懂的一个复合属性

.item {  
		flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
	}

(2)一些属性有:

  • (1) flex: 1 = flex: 1 1 0%
  • (3) flex: 2 = flex: 2 1 0%
  • (3) flex: auto = flex: 1 1 auto
  • (4) flex: none = flex: 0 0 auto,常用于固定尺寸不伸缩

(3) flex:1flex:auto 的区别,可以归结于 flex-basis: 0flex-basis: auto 的区别

(4)当设置为 0(绝对弹性元素) ,此时相当于告诉 flex-growflex-shrink 在伸缩的时候不需要考虑我的尺寸

(5)当设置为 auto(相对弹性元素) ,此时则需要在伸缩时将元素尺寸纳入考虑

(6)注意:建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值

6、align-self

(1)允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性

(2)默认值为 auto ,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch

.item {    
		align-self: auto | flex-start | flex-end | center | baseline | stretch;
	}

(3)效果图如下:

android FlexboxLayout 设置固定列数 flexbox布局_html5_09

三、应用场景

1、在以前的文章中,我们能够通过 flex 简单粗暴的实现元素水平垂直方向的居中,以及在两栏三栏自适应布局中通过 flex 完成,这里就不再展开代码的演示

2、包括现在在移动端、小程序这边的开发,都建议使用 flex 进行布局