CSS布局之弹性盒子-flexbox(上)

弹性盒子是一种新技术,但在如今各个浏览器都广泛支持的情况下,它已经开始准备广泛应用了。 弹性盒子提供了工具,允许快速创建曾经被证明用CSS很难实现的一些复杂,灵活的布局和功能。

一、 为什么是弹性盒子?

长久以来,唯一可用的且有稳定的跨浏览器兼容性的能用来构建 CSS 布局的工具只有 floats 和positioning。它们是既可行,表现也不错的布局方案,但是在某些布局方面它们就有限制,并且难以实现。

以下简单的布局要求是难以或不可能用这样的工具( floats 和positioning)方便且灵活的实现的:

  • 在父内容里面垂直居中一个块内容。
  • 使容器的所有子项占用等量的可用宽度/高度,而不管有多少宽度/高度可用。
  • 使多列布局中的所有列采用相同的高度,即使它们包含的内容量不同。

二、flex容器和flex项目

采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。

三、flex 模型说明

当元素表现为 flex 框时,它们沿着两个轴来布局:

flex_model.png
  • 主轴(main axis)是沿着 flex 元素放置的方向延伸的轴(比如页面上的横向的行、纵向的列)。主轴的开始和结束被称为main startmain end
  • 交叉轴(cross axis)是垂直于 flex 元素放置方向的轴。交叉轴的开始和结束被称为 cross startcross end
  • 设置了 display: flex 的父元素表示文档中的一个区域(或节),比如,内容中的一个专题组,一般来说会有包含一个标题(heading)。一般通过是否包含一个标题被称之为 flex 容器(flex container)。
  • 在 flex 容器中表现为柔性的盒子的元素被称之为 flex 项flex item)元素。
主轴和侧轴.png
  • 项目默认沿主轴排列,单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

四、flexbox属性

关于flex布局,有12个属性, 其中6个设置在容器上,6个设置在项目上。

设置在容器上的属性

  1. justify-content – 将flex元素和主轴对齐
  2. flex-direction – 定义主轴方向
  3. flex-wrap – flex元素必须单行或者自动换行
  4. flex-flow – flex-direction和flex-wrap的缩写
  5. align-items – 将flex元素在交叉轴上对齐
  6. align-content – 当交叉轴有多余空间时,对齐容器内的轴线

设置在项目上的属性

  1. order – 决定flex元素的顺序
  2. align-self – 自身对齐交叉轴,覆盖父元素设置的align-items
  3. flex-grow –定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
  4. flex-shrink –定义项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
  5. flex-basis –在分配多余空间之前,项目占据的主轴空间
  6. flex –flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选

12个属性中,除去一些融合缩写属性,属性值可谓五花八门,而且组合使用的话,还有很多注意点,建议大家可以玩下这个flexbox小青蛙的游戏,游戏几乎包含了所有的常用属性和属性值,形象且容易记忆。flexbox小青蛙游戏答案

五、容器上主轴方向相关属性

属性比较多,我们使用设置容器和项目上、主轴和交叉轴四种来分类相关属性,好记不容易搞混。

设置在容器上的属性

  1. justify-content – 将flex元素和主轴对齐,即水平对齐元素。

语法:

justify-content: flex-start|flex-end|center|space-between|space-around

属性值:

flex-start: 元素向主轴起点对齐。
即从行首开始排列。每行第一个弹性元素与行首对齐,同时所有后续的弹性元素与前一个对齐。
flex-end: 元素向主轴终点对齐。
即从行尾开始排列。每行最后一个弹性元素与行尾对齐,其他元素将与后一个对齐。
center: 元素在主轴居中。
space-between:元素之间保持相等的距离。
即在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素与行首对齐,每行最后一个元素与行尾对齐。
space-around:元素周围保持相等的距离。
即在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素到行首的距离和每行最后一个元素到行尾的距离将会是相邻元素之间距离的一半。

*注意:前三个属性很好理解,下面我重点通过代码加图示说明space-between和space-around的区别。

*{
    margin: 0;
    padding: 0;
}
.test {
    width: 600px;
    border: 1px solid #000;
    margin: 10px;

    display: flex;
    justify-content: space-between;
}
div p{
    width: 100px;
    height: 100px;
    line-height: 100px;
    text-align: center;
    background-color: orange;
}
<div class="test">
    <p>1</p>
    <p>2</p>
    <p>3</p>
</div>
space-between.png
*{
    margin: 0;
    padding: 0;
}
.test {
    width: 600px;
    border: 1px solid #000;
    margin: 10px;

    display: flex;
    justify-content: space-around;
}
div p{
    width: 100px;
    height: 100px;
    line-height: 100px;
    text-align: center;
    background-color: orange;
}
<div class="test">
    <p>1</p>
    <p>2</p>
    <p>3</p>
</div>
space-around.png
  1. align-items – 将flex元素在交叉轴上对齐,即纵向对齐元素。

语法:

align-items: stretch|center|flex-start|flex-end|baseline

属性值:

flex-start: 元素向侧轴起点对齐。
flex-end: 元素向侧轴终点对齐。
center: 元素在侧轴居中。如果元素在侧轴上的高度高于其容器,那么在两个方向上溢出距离相同。
baseline: 元素在容器的基线位置显示。
stretch: 元素被在侧轴方向被拉伸到与容器相同的高度或宽度。

  1. flex-direction – 定义主轴方向,即元素在容器里摆放的方向。

语法:

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

属性值:

row: 元素摆放的方向和文字方向一致。
row-reverse: 元素摆放的方向和文字方向相反。
column: 元素从上放到下。
column-reverse: 元素从下放到上。

注意
默认,flex以行为方向,justify-content控制横向对齐,align-items控制纵向对齐。
当flex以列为方向时,justify-content控制纵向对齐,align-items控制横向对齐。

注意:当你调转行或列的方向后,flex-start和flex-end对应的方向也被调转了。

  1. flex-wrap – flex元素必须单行或者自动换行成多行。

语法:

flex-wrap: nowrap|wrap|wrap-reverse

属性值:

nowrap: 所有的元素都在一行。
wrap: 元素自动换成多行。
wrap-reverse: 元素自动换成逆序的多行。

  1. align-content – 当交叉轴有多余空间时,对齐容器内的轴线。即使用align-content来决定行与行之间隔多远。

语法:

align-content: stretch|center|flex-start|flex-end|space-between|space-around

属性值:

flex-start: 多行都集中在顶部。
即所有行从交叉轴起点开始填充。第一行的交叉轴起点边和容器的交叉轴起点边对齐。接下来的每一行紧跟前一行。
flex-end: 多行都集中在底部。即所有行从交叉轴末尾开始填充。最后一行的交叉轴终点和容器的交叉轴终点对齐。同时所有后续行与前一个对齐。
center: 多行居中。
即所有行朝向容器的中心填充。每行互相紧挨,相对于容器居中对齐。容器的垂直轴起点边和第一行的距离相等于容器的垂直轴终点边和最后一行的距离。
space-between: 行与行之间保持相等距离。
space-around: 每行的周围保持相等距离。
stretch: 每一行都被拉伸以填满容器。

这可能有些容易混淆,align-content决定行之间的间隔,而align-items决定元素整体在容器的什么位置。只有一行的时候align-content没有任何效果。

  1. flex-flow – flex-direction和flex-wrap的缩写

语法:

flex-flow: flex-direction flex-wrap

flex-direction和flex-wrap两个属性经常会一起使用,所以有缩写属性flex-flow。这个缩写属性接受两个属性的值,两个值中间以空格隔开。
你可以用flex-flow: row wrap去设置行并自动换行。

好,容器上的属性先介绍到这,下节介绍项目上的属性。弹性盒子-flexbox(下)

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

推荐阅读更多精彩内容

  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 4,483评论 0 26
  • 前言 FlexBox是css3的一种新的布局方式,天生为解决布局问题而存在的它,比起传统的布局方式,我们使用Fle...
    zevei阅读 1,418评论 23 3
  • title: flex布局date: 2017-07-07 14:13:33tags: css笔记 flexbox...
    Gary23阅读 1,531评论 0 0
  • Flexbox布局官方称之为CSS Flexible Box布局模块,他是CSS3中的一种新的布局模式。Flexb...
    流动码文阅读 700评论 0 3
  • 简书的Markdown貌似不支持插入iframe,所以文章里的JSFiddle示例都改做截图了,如果有需要可以点击...
    kangflict阅读 1,117评论 2 8