flex 布局

flexflexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为flex布局。

display

.container {
  display: flex | inline-flex;
}

定义一个flex容器,为内容创建了一个新的flex环境
注意:当设置 flex 布局之后,子元素的 floatclearvertical-align 的属性将会失效。

1. 父容器display: flex
2. 父容器display: inline-flex


flex: 将元素作为弹性伸缩盒显示
inline-flex: 将元素作为内联块级弹性伸缩盒显示
使用flex时父元素是block元素,而声明了inline-flex的父元素变成了inline元素

原理

赋予父容器更改子元素宽高(或顺序)的能力,来更好的填充可用的空间(主要使其适应各种显示设备和屏幕尺寸)。一个使用flexbox布局的父容器会伸展每个子元素来填充可用的空间,或者压缩它们来阻止超出父容器。

最重要的是,flexbox布局在方向上是不可预知的,这一点和常归布局不同(常规布局中块是基于竖直方向排列的,而内联是基于水平方向)。这些常规布局在页面中显示都没问题,但它们缺乏灵活性,难以支撑大型复杂应用的需求,特别是响应方向、大小、伸展、收缩等这些变化。

适用场景

flexbox最适合用在组件和小规模的布局中,如果是更复杂的布局,Grid布局会比较好一些。
由于flexbox是一个完整的模块,它不单单是一个属性,而是包含了一整套新的属性集。这些属性中一些是用来设置父容器的,而另外一些是设置子元素的。

flex 基本概念


flexbox主要由父容器和它的直接子元素组成,父容器被称为flex容器(flex container),而其直接的子元素称作为flex子类(flex item)
以下flex容器简称为containerflex子类简称item

main axis和cross axis

flex box中存在两条轴,主轴main axis,和侧轴cross axis

  • main axis: flex容器的主轴主要用来配置flex项目。注意,它不一定是水平,这主要取决于flex-direction属性。
  • main-start | main-end: flex项目的配置从容器的主轴起点边开始,向主轴终点边结束
  • cross axis: 与主轴垂直的轴称作侧轴,是侧轴方向的延伸
  • cross-start | cross-end: 伸缩行的配置从容器的侧轴起点边开始,往侧轴终点边结束

item 是沿着main axis(起点main-start终点main-end)或者cross axis(起点cross-start终点cross-end)排列

main size和cross size

  • main size: 每个item占据的主轴空间为main sizeitem的主轴长度是width还是height,由主轴方向决定。
  • cross size: 每个item占据的交叉轴的空间为cross sizeitem的侧轴长度是widthheight,由侧轴方向决定

要记住并不是宽度是main size,高度是cross size,是要根据主轴的方向来定义哪个是main size。如果垂直方向是主轴,则item的高度就是main size


下面来分别介绍flex containerflex item

flex容器

属性

flex容器六种属性,分别是:
1. flex-direction
2. flex-wrap
3. flex-flow
4. justfy-content
5. align-items
6. align-content

flex-direction


创建了主轴,定义了itemflex容器中的方向。 flexbox是单向布局,可以将item放在水平行或垂直列中

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

row(默认): 如果书写方式是ltr,那么item从左向右排列;如果书写方式是rtl,那么item从右向左排列
row-reverse: 如果书写方式是ltr,那么item从右向左排列;如果书写方式是rtl,那么item从左向右排列
column:row类似,只不过方向是从上到下排列
column-reverse:row-reverse类似,只不过方向是从下向上排列
点我看Demo

flex-wrap


默认情况下,项目都排在主轴线上,使用 flex-wrap 可实现项目的换行

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

nowrap(默认): 不换行,所有item会在一行
wrap: 多行显示,向下折行
wrap-reverse: 多行显示,向上折行
点我看Demo

flex-flow

flex-directionflex-wrap 的简写形式,能够同时定义flex容器的主轴和交叉轴

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

默认值: row nowrap中间有空格

justify-content

这个属性定义了item在主轴方向对齐方式

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

flex-start: 以主轴main-start端对齐
flex-end: 以主轴main-end方向对齐
center: 主轴居中
space-between: 两端对齐,item之间相等间隔。如果是间距负数,或该行只有一个item,则此值等效于flex-start
space-around: 每个item两侧的间隔相等,所以item之间的间隔比item与边缘的间隔大一倍。如果剩余空间是负数,或该行只有一个item,则该值等效于center
点我看Demo

align-items

这个属性定义了item 在侧轴上的对齐方式

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

stretch(默认): 当cross size未设置或者为auto时,拉伸至等于容器高度(会受到min-width/max-width的限制)
flex-start: 以侧轴的cross-start端对齐
flex-end: 以侧轴的cross-end端对齐
center: 以侧轴的中点对齐
baseline: 以item的第一行文字的基线对齐
点我看Demo

align-content


当侧轴上还有空间时,align-content属性可以指定container中多行item之间的对齐方式
注意:定义了多根轴线的对齐方式,如果item只有一根轴线,那么该属性将不起作用
如下:
flex-wrap: nowrap ,容器仅存在一根轴线,因为item不会换行,就不会产生多条轴线。
flex-wrap: wrap ,容器可能会出现多条轴线,这时候你就需要去设置多条轴线之间的对齐方式了。

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

flex-start: 在侧轴的开始处将所有item连接起来,最后将空间全部包含在内
flex-end: 在侧周的末端将所有item连接起来,所有空间都在开头
center: 将所有item拼接在十字轴的中间,每个末端的空间均等
space-between: 除了子元素之间的所有空间以及它们在交叉轴上的所有空间都是等量的
space-around: 具有非常相似的效果space-between,但Flexbox子系列的每一端都有较少的空间
点我看Demo


flex item

注意:一旦声明了flex布局,那么float, clear和vertical-align对item将无效

属性

flex item 六种属性,分别是:
1. order
2. flex-basis
3. flex-grow
4. flex-shrink
5. flex
6. align-self

order

默认情况,item按文档顺序显示。order属性可以改变item的出现的位置。(索引从0开始)

.item {
  order: <integer>; /* default is 0 */
}

点我看Demo

flex-grow

定义item放大比

flex-grow.png

.item {
  flex-grow: <number>; /* default 0 */
}

点我看Demo

flex-shrink

定义item的收缩比例,当item宽度之和大于容器的宽度,才会发生收缩

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

number等于负数无效
点我看Demo

flex-basis

定义item在主轴方向上的初始大小,浏览器根据此属性,计算主轴是否有多余空间。如果不使用 box-sizing来改变盒模型的话,那么这个属性就决定了flex元素的内容盒(content-box)的宽或者高(取决于主轴的方向)的尺寸大小。

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

默认值:auto,即项目本来的大小, 这时候 item 的宽高取决于 widthheight的值
当主轴为水平方向的时候,当设置了 flex-basis,项目的宽度设置值会失效,flex-basis 需要跟 flex-growflex-shrink 配合使用才能发挥效果。

  • flex-basis值为 0 % 时,是把该项目视为零尺寸的,故即使声明该尺寸为 140px,也并没有什么用。
  • flex-basis 值为 auto 时,则跟根据尺寸的设定值(假如为 100px),则这 100px 不会纳入剩余空间。

flex

flex-grow, flex-shrinkflex-basis的简写

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

flex-shrinkflex-basis为可选项
默认为0 1 auto
快捷值:auto (1 1 auto)none (0 0 auto)
点我看Demo

align-self


允许单个项目有与其他项目不一样的对齐方式

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

align-self作用在flex item上,属性值的效果和align-items的相似

flexbugs

浏览器前缀

flex布局需要加一些浏览器前缀来兼容大多数的浏览器。Flex布局的前缀不只是在属性前面添加浏览器前缀,不同浏览器下的属性名和属性值都不同,这是因为Flexbox布局的标准一直在变,一共有old, tweener, new 三个版本。

可能处理前缀的最好方法是使用新的语法书写CSS并通过Autoprefixer运行CSS,能够很好地处理这个问题。

Flex布局的三个版本

  • new: 现在的最新版
  • tweener: 2011过度版本
  • old: 2009版本

兼容性

chrome safari firefox Opera IE Edge Android iOS
20- 3.1+ 2-21 10 2.1+ 3.2+
21+ 6.1+ 22+ 12.1+ 10 12+ 4.4+ 7.1+
21+ 6.1+ 22+ 12.1+ 11+ 12+ 4.4+ 7.1+

混合三个版本使用可以兼容到:

  • Chrome any
  • Firefox any
  • Safari any
  • Opera 12.1+
  • IE 10+
  • iOS any
  • Android any
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容