关于 Flexbox 的若干问题

当初开始学习使用 Flexbox 就是从🍭FLEXBOX FROGGY这个小游戏开始的
另外,还有关于 Grid 布局的孪生兄弟游戏:🍭GRID GARDEN

CSS 中的布局模式

CSS 布局可以由 tablefloatpositiondisplay 等方式实现,但是这些布局在使用中往往也会伴随一些副作用,想要实现一个比较「复杂」的布局也往往要花费比较大的精力

CSS2.1 中定义了四种布局模式,由一个盒与其兄弟、祖先盒的关系决定其尺寸与位置的算法

  • 块布局: 呈现文档的布局模式
  • 行内布局: 呈现文本的布局模式
  • 表格布局: 用表格呈现 2D 数据的布局模式
  • 定位布局: 能够直接地定位元素的布局模式,定位元素基本与其他元素没有任何关系

CSS3 引入的 Flexbox (伸缩)布局模式,主要思想是让容器由有能力让其子项目能够改变其宽度、高度(甚至顺序),以最佳方式填充可用空间

Flexbox 布局方向不可预知,不像常规的布局(块:从上到下,内联:从左到右),常规布局更适合页面布局,而对于大型或复杂的布局就缺乏灵活性

新版本 Flexbox 的基本使用

Flexbox 具有多个版本,这里的新版本指的是 W3C 在 2014 年 9 月为 Flexbox 推出的最新版本语法
Flexbox 相关术语可以参考 W3C 的🍭Flexbox 模型

浏览器支持度:

Browser|Version|Addition

Browser Version Addition
Chrome 29+
Firefox 28+
Internet Explorer 11+
Opera 17+
Safari 6.1+ (prefixed with -webkit-)
Android 4.4+
iOS 7.1+ (prefixed with -webkit-)

兼容旧版本 Flexbox 可以参考🍭Using Flexbox

Flexbox 容器

Flex model -- *.wepb 图片,请在 Chrome 浏览器中打开

设置 Flexbox dispaly 属性display: flex | inline-flex
⚠️注意:设置 Flexbox 布局后,floatclearvertical-align 在伸缩项目上失效

Flexbox 相关属性

父元素上的属性

方向:flex-direction: row | row-reverse | column | column-reverse

row
row
row

row
-
reverse

c
o
l
u
m
n

c
o
l
u
m
n
-
reverse

换行:flex-wrap: nowrap | wrap | wrap-reverse

nowrap
nowrap
nowrap
nowrap
nowrap
nowrap
nowrap
nowrap

wrap
wrap
wrap
wrap
wrap
wrap
wrap
wrap
wrap
wrap
wrap

1
wrapr-reverse
2
wrapr-reverse
3
wrapr-reverse
4
wrapr-reverse
5
wrapr-reverse
6
wrapr-reverse

方向 & 换行:flex-flow: <flex-direction> || <flex-wrap>

主轴对齐:justify-content: flex-start | flex-end | center | space-between | space-around

flex-start
flex-start
flex-start

flex-end
flex-end
flex-end

center
center
center

space-between
space-between
space-between

space-around
space-around
space-around

侧轴对齐:align-items: stretch | flex-start | flex-end | center | baseline

stretch
stretch

flex-start
flex-start

flex-end
flex-end

center
center

line-heigth: 60px;
baseline

堆栈伸缩行:align-content: stretch | flex-start | flex-end | center | space-between | space-around

stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch
stretch

flex-start
flex-start
flex-start
flex-start
flex-start
flex-start
flex-start
flex-start
flex-start
flex-start
flex-start
flex-start

flex-end
flex-end
flex-end
flex-end
flex-end
flex-end
flex-end
flex-end
flex-end
flex-end
flex-end
flex-end

center
center
center
center
center
center
center
center
center
center
center
center
center
center

space-between
space-between
space-between
space-between
space-between
space-between
space-between
space-between

space-around
space-around
space-around
space-around
space-around
space-around
space-around
space-around

子元素上的属性

显示顺序:order: <Integer>

A -> order: 0
B -> order: 2
C -> order: -1
D -> order: 4

flex-basis: <Length> | auto
定义了在分配多余空间之前,伸缩元素占据的主轴空间,浏览器根据这个属性,计算主轴是否有多余空间
需要配合 flex-grow flex-shrink 使用,设置 flex-basis 后,伸缩元素的 widthheight 属性将会失效

放大比例:flex-grow: <Number>

flex-grow: 0;
flex-grow: 1;
flex-grow: 2;

收缩比例:flex-shrink: <Number>

flex-basis: 60%; flex-shrink: 0;
flex-shrink: 1;
flex-shrink: 0;

收放比例:flex: <flex-grow> || <flex-shrink> || <flex-basis>

默认值为:flex: 0 1 auto

子元素对齐:align-self: auto | stretch | flex-start | flex-end | center | baseline

auto
stretch
flex-start
flex-end
center
baseline

参考连接:
A Visual Guide to CSS3 Flexbox Properties