Flexbox 布局(国内很多人称为弹性布局)正式的全称为 CSS Flexible Box布局模块,它是CSS3新增的一种布局模式。它可以很方便地用来改善动态或未知大小的元素的对齐,方向和顺序等等。flex容器的主要特性是它可以调整其子元素的宽度或高度去填充可用的空白区,以最优的方式达到兼容不同屏幕大小。

很多设计人员和开发人员发现使用Flexbox来布局很容易,可以使用更少的代码,更简单的方式实现更复杂的布局,也使整个开发过程更为简单。Flexbox布局算法不同于那些基于垂直或水平的块或内联布局。Flexbox布局应该用于小的应用程序组件之中,而新的CSS 网格布局模块正在兴起,来处理大规模布局。

本指南将以可视化的方式重点介绍 flex 属性是如何影响布局的,不是解释 flex 属性是如何工作。

基础

在我们开始介绍 flexbox属性之前,让我们先稍微介绍一下 flexbox模型。flex布局由被称为 flex container(flex容器) 的父容器 和被称为 flex item(flex项)的直接子元素构成。

在上面的图片中,您可以看到用于描述 flex container(flex容器) 及其子元素的属性和术语。关于他们意义的更多信息,请阅读 W3C flexbox模型 的官方文档。

愚人码头注:
要是看英文比较吃力,你可以查看 《Flexbox布局(CSS3 弹性布局,Flexible Box)之 基本概念解析》 这篇文章。

从2009年的最初草案开始,flexbox布局经历了多次迭代和几个版本的语法变更,所以为了避免混乱,我们将只使用最新的工作草案(2014年9月)中的语法。如果你需要维护旧的浏览器兼容性,你可以阅读这篇文章,了解如何以最好的方式做到这一点。

愚人码头注:
目前解决flexbox版本兼容性问题,一般可以使用Autoprefixer后处理程序来实现css3代码自动补全;
如果你使用 Sass,也可以使用 @mixin (混入)来解决 flexbox版本兼容,推荐一个github项目:sass-flex-mixin

浏览器对最新flexbox规范的支持情况:

  • Chrome 29+
  • Firefox 28+
  • Internet Explorer 11+
  • Opera 17+
  • Safari 6.1+ (加前缀 -webkit-)
  • Android 4.4+
  • iOS 7.1+ (加前缀 -webkit-)

如果你需要查看更多浏览器兼容性,你可以看这里

使用

使用flexbox布局只要在父级HTML元素上设置display属性:

  1. .flex-container {
  2. display: -webkit-flex; /* Safari */
  3. display: flex;
  4. }

或者如果你想将它像一个内联元素显示使用:

  1. .flex-container {
  2. display: -webkit-inline-flex; /* Safari */
  3. display: inline-flex;
  4. }

注意:这是需要你在父容器上设置的唯一属性,并且其所有直接子元素将自动成为 flex item(flex项)。

有几种方法可以将 flexbox 属性进行分组,迄今为止,我发现的了解 flexbox 选项的最简单的方法是将 flexbox 属性分成 flex container(flex容器)和 flex item(flex项) 两组。下面,我们将按照这两个分组解释每个flexbox 属性是如何在视觉上影响布局的。

Flexbox container 属性

flex-direction

这个属性通过设置 flex container(flex容器) 的主轴方向,来指定 flex item(flex项) 在 flex container(flex容器) 中是如何布局的。flex item(flex项) 可以在两个主轴方向上排列布局,水平横向和垂直纵向两种。

属性值:

  1. .flex-container {
  2. -webkit-flex-direction: row; /* Safari */
  3. flex-direction: row;
  4. }

值为 row 方向,那么在ltr上下文中,所有 flex item(flex项) 从左到右排成一行。如图:

  1. .flex-container {
  2. -webkit-flex-direction: row-reverse; /* Safari */
  3. flex-direction: row-reverse;
  4. }

值为 row-reverse 方向,那么在ltr上下文中,所有 flex item(flex项) 从右到左排成一行。( 愚人码头注:reverse 为相反方向,很好记忆吧)如图:

  1. .flex-container {
  2. -webkit-flex-direction: column; /* Safari */
  3. flex-direction: column;
  4. }

值为 column 方向,那么所有 flex item(flex项) 从上到下排成一列。如图:

  1. .flex-container {
  2. -webkit-flex-direction: column-reverse; /* Safari */
  3. flex-direction: column-reverse;
  4. }

值为 column-reverse 方向,那么所有 flex item(flex项) 从下到上排成一列。如图:

默认值: row

注意:rowrow-reverse的排列方式取决于书写模式,所以如果是在rtl上下文中,它们会反向排序。

flex-wrap

默认情况下,flexbox 理念是将容器中的所有子元素设置在一行中。flex-wrap属性可以控制 flex container(flex容器) 以单行还是多行布局其flex item(flex项),以及在新行上的排列方向。

属性值:

  1. .flex-container {
  2. -webkit-flex-wrap: nowrap; /* Safari */
  3. flex-wrap: nowrap;
  4. }

flex item(flex项) 会显示成一行,默认情况下,它们会自动伸缩,以适应 flex container(flex容器)的宽度。如图:

  1. .flex-container {
  2. -webkit-flex-wrap: wrap; /* Safari */
  3. flex-wrap: wrap;
  4. }

flex item(flex项)会在flex container(flex容器)中, 按照从左到右,从上到下的顺序显示成多行。如图:

  1. .flex-container {
  2. -webkit-flex-wrap: wrap-reverse; /* Safari */
  3. flex-wrap: wrap-reverse;
  4. }

flex item(flex项)会在flex container(flex容器)中, 按照从左到右,从下到上的顺序显示成多行。如图:

默认值: nowrap

注意:这些属性取决于书写模式,所以如果是在rtl上下文中,它们会反向排序。

flex-flow

这个属性是设置flex-directionflex-wrap属性的速记写法(简写或缩写)。

属性值:

  1. .flex-container {
  2. -webkit-flex-flow: || ; /* Safari */
  3. flex-flow: || ;
  4. }

默认值: row nowrap

justify-content

justify-content属性用来指定 flex item(flex项)在当前 flex container(flex容器)主轴线(main axis)上的对齐方式。当所有flex item(flex项)都在同一行并且不可伸缩,或是可伸缩但已经达到它们最大尺寸的时候,它可以分配主轴线(main axis)上的剩余空间。

属性值:

  1. .flex-container {
  2. -webkit-justify-content: flex-start; /* Safari */
  3. justify-content: flex-start;
  4. }

在ltr上下文中, flex item(flex项)会在 flex container(flex容器)中靠左对齐。如图:

  1. .flex-container {
  2. -webkit-justify-content: flex-end; /* Safari */
  3. justify-content: flex-end;
  4. }

在ltr上下文中, flex item(flex项)会在 flex container(flex容器)中靠右对齐。如图:

  1. .flex-container {
  2. -webkit-justify-content: center; /* Safari */
  3. justify-content: center;
  4. }

flex item(flex项)会在 flex container(flex容器)中靠中间对齐(居中对齐)。如图:

  1. .flex-container {
  2. -webkit-justify-content: space-between; /* Safari */
  3. justify-content: space-between;
  4. }

flex item(flex项)之间以相等的间距显示,第一个和最后一个flex item(flex项)会在 flex container(flex容器)中靠两侧边缘对齐(愚人码头注:类似于常说的两端对齐)。如图:

  1. .flex-container {
  2. -webkit-justify-content: space-around; /* Safari */
  3. justify-content: space-around;
  4. }

flex item(flex项)以相同的空间间隔显示,甚至第一个和最后一个flex item(flex项)。如图:

默认值: flex-start

愚人码头注:
特别说明的是:上面都是flex container(flex容器)主轴线 横向的例子,即flex-direction:row;。纵向的例子可以使用flex-direction:column;试试…。

align-items

flex item(flex项)可以在 flex container(flex容器)的当前交叉轴(cross axis)上对齐方式,类似于justify-content,但是在垂直方向。
此属性设置所有flex item(flex项)的默认对齐方式,并且包括匿名元素。

愚人码头注:
justify-content是设置flex item(flex项)在主轴线(main axis)上的对齐方式;
align-items是设置flex item(flex项)在交叉轴(cross axis)上对齐方式;

属性值:

  1. .flex-container {
  2. -webkit-align-items: stretch; /* Safari */
  3. align-items: stretch;
  4. }

flex item(flex项)会从cross startcross end结束,填满整个 flex container(flex容器)的高度(或宽度)。如图:

愚人码头注:
这里解释一下填满整个 flex container(flex容器)的宽度的情况:
当 flex-direction:column; 或者 flex-direction:column-reverse;时,将flex item(flex项)的宽度设置auto或者100%就可以了。

  1. .flex-container {
  2. -webkit-align-items: flex-start; /* Safari */
  3. align-items: flex-start;
  4. }

flex item(flex项)会以flex container(flex容器) 的交叉轴起始(cross start)线对齐。如图:

  1. .flex-container {
  2. -webkit-align-items: flex-end; /* Safari */
  3. align-items: flex-end;
  4. }

flex item(flex项)会以flex container(flex容器) 的交叉轴结尾(cross end)线对齐。如图:

  1. .flex-container {
  2. -webkit-align-items: center; /* Safari */
  3. align-items: center;
  4. }

flex item(flex项)会以flex container(flex容器) 的交叉轴(cross axis)的中间对齐。如图:

  1. .flex-container {
  2. -webkit-align-items: baseline; /* Safari */
  3. align-items: baseline;
  4. }

flex item(flex项)会按照她们的文本基线(baseline)对象。

愚人码头注:
科普:文本基线(英语:Baseline)指的是多数字母排列的基准线。详细说明请查看维基百科中关于Baseline的说明

默认值: stretch

注意:有关于文本基线计算的更多说明可以查看这里

align-content

当flex container(flex容器)的交叉轴(cross axis)上存在多余空间(愚人码头注:未被填充满)时,align-content 属性可以控制 flex item(flex项)在 flex container(flex容器)的交叉轴(cross axis)上的对齐方式。类似于justify-content在主轴(main axis)方向上各个 flex item(flex项)的对齐。

属性值:

  1. .flex-container {
  2. -webkit-align-content: stretch; /* Safari */
  3. align-content: stretch;
  4. }

flex item(flex项)在每行flex item(flex项)的后面都显示分布式空间。如图:

  1. .flex-container {
  2. -webkit-align-content: flex-start; /* Safari */
  3. align-content: flex-start;
  4. }

flex item(flex项)会堆砌在flex container(flex容器)的交叉轴(cross axis)的起始位置上。如图:

  1. .flex-container {
  2. -webkit-align-content: flex-end; /* Safari */
  3. align-content: flex-end;
  4. }

flex item(flex项)会堆砌在 flex container(flex容器)的交叉轴(cross axis)的结束位置上。如图:

  1. .flex-container {
  2. -webkit-align-content: center; /* Safari */
  3. align-content: center;
  4. }

flex item(flex项)会堆砌在flex container(flex容器)的交叉轴(cross axis)的居中位置上。如图:

  1. .flex-container {
  2. -webkit-align-content: space-between; /* Safari */
  3. align-content: space-between;
  4. }

flex item(flex项)的行与行之间以相等的间隔显示,第一行和最后一行分别显示在flex container(flex容器)的交叉轴(cross axis)的两端。如图:

  1. .flex-container {
  2. -webkit-align-content: space-around; /* Safari */
  3. align-content: space-around;
  4. }

flex item(flex项)的每一行以相等的间隔显示。如图:

默认值: stretch

注意:这个属性只有当 flex container(flex容器)有多行 flex item(flex项)时才生效,如果只有一行,那么这个属性没有效果。

flex container(flex容器)的注意点

  • 所有的column-*属性在flex container(flex容器)上都不会有效果
  • ::first-line 与 ::first-letter伪类在flex container(flex容器)上不会被应用。

flex item(flex项)的属性

order

order属性用来控制 flex container(flex容器)中 flex item(flex项)的排列顺序。默认情况下,以它们被添加到 flex container(flex容器)中的顺序排序(愚人码头注:可以理解为以HTML结构的顺序排序)。

属性值:

  1. .flex-item {
  2. -webkit-order: ; /* Safari */
  3. order: ;
  4. }

flex item(flex项)可以使用这个简单的属性重新排序,而不需要重新修改HTML代码。

默认值: 0

flex-grow

当 flex container(flex容器)存在剩余空间时,可以用flex-grow这个属性来确定 flex item(flex项)的拉伸比例。

属性值:

  1. .flex-item {
  2. -webkit-flex-grow: ; /* Safari */
  3. flex-grow: ;
  4. }

如果所有 flex item(flex项)具有相同的flex-grow值,那么所有 flex item(flex项)在 flex container(flex容器)中具有相同的大小。

第二个 flex item(flex项) 相对于其他 flex item(flex项) 占用更多空间。

默认值: 0

注意:负数值无效。

flex-shrink

当 flex container(flex容器)空间不足时,可以用flex-shrink这个属性来确定 flex item(flex项)的收缩比例。

属性值:

  1. .flex-item {
  2. -webkit-flex-shrink: ; /* Safari */
  3. flex-shrink: ;
  4. }

默认情况下,所有 flex item(flex项)都可以收缩,但如果我们将它设置为 0(不收缩),它们将保持原来的大小。

默认值: 1

注意:负数值无效。

flex-basis

这个属性看作widthheight属性相同的值,并在 flex 伸缩比例分配剩余空间之前,指定 flex item(flex项)的初始主要大小(愚人码头注: flex-grow 和 flex-shrink 伸缩比例分配剩余空间之前)。

属性值:

  1. .flex-item {
  2. -webkit-flex-basis: auto | <width>; /* Safari */
  3. flex-basis: auto | <width>;
  4. }



flex-basis
指定了第4个 flex item(flex项)元素的初始大小。如图:

默认值: 1

注意: auto 值存在一个问题,将在未来解决。

flex

这个属性是flex-growflex-shrinkflex-basis属性的速记写法(简写或缩写)。 除了其他值,它也可以设置为auto(即:1 1 auto)和none(即:0 0 auto)。

  1. .flex-item {
  2. -webkit-flex: none | auto | [ ? || ]; /* Safari */
  3. flex: none | auto | [ ? || ];
  4. }

默认值: 0 1 auto

注意:W3C鼓励使用 flex 简写,而不是每个属性都分开写,因为速记正确地重置了未指定的属性,以适应常见用途

align-self

这个align-self属性允许覆盖单个的 flex item(flex项)默认对齐方式(或由align-items指定的值)。请参阅flex container(flex容器)的align-items说明以了解可用的值。

属性值:

  1. .flex-item {
  2. -webkit-align-self: auto | flex-start | flex-end | center | baseline | stretch; /* Safari */
  3. align-self: auto | flex-start | flex-end | center | baseline | stretch;
  4. }

第3和第4个 flex item(flex项)通过align-self属性覆盖了其默认的对齐方式。如图:

默认值: auto

注意:align-self 取值为auto值时,其值被计算为父级元素的align-items属性的值,或者如果元素没有父元素,那么其值为stretch

flex item(flex项)的注意点

float,clearvertical-align在flex item(flex项)上都不会起作用,也不会让它脱离文档流。

Flexbox属性可视化指南的更多相关文章

  1. 转载:CSS3 Flexbox可视化指南

    0. 目录 目录 引言 正文 1 引入 2 基础 3 使用 4 弹性容器Flex container属性 41 flex-direction 42 flex-wrap 43 flex-flow 44 ...

  2. CSS3 Flexbox可视化指南

    0. 目录 目录 引言 正文 1 引入 2 基础 3 使用 4 弹性容器Flex container属性 41 flex-direction 42 flex-wrap 43 flex-flow 44 ...

  3. Flex布局 Flexbox属性具体解释

    原文:A Visual Guide to CSS3 Flexbox Properties Flex布局官方称为CSS Flexble Box布局模型是CSS3为了提高元素在容器中的对齐.方向.顺序,甚 ...

  4. Go内存分配器可视化指南【译】【精】

    当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂.一切看起来都像一个神秘的黑盒子.因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥 ...

  5. CSS3 Flexbox(伸缩盒/弹性盒模型)可视化指南

    在http://css.doyoe.com/(CSS参考手册)中,本文对应其中的伸缩盒 引入 Flexbox布局官方称为CSS Flexible Box Layout Module是一个CSS3新的布 ...

  6. CSS3 Flexbox不迷路指南

    Flexbox早有耳闻,但是决定切实尝试一番,还是因为看了这条围脖: 我觉得用flexbox可以实现,但是发觉无从下手,属性特性都不了解.趁此机会,学习下. 英文原版参考资料在这里:A Complet ...

  7. Flexbox属性查询列表

    1.任何一个flexbox布局的第一步是需要创建一个flex容器.为此给元素设置display属性的值为flex.在Safari浏览器中,你依然需要添加前缀-webkit. .flexcontaine ...

  8. flexbox属性速览及常见布局实现

    CSS3 弹性盒子(Flex Box)弹性盒子是即 CSS2 浮动布局后, CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同 ...

  9. 我的Vue之旅、01 深入Flexbox布局完全指南

    花了几个小时整合的"A Complete Guide to Flexbox"最新版本,介绍了flexbox的所有属性,外带几个实用的例子. 传统布局.Flexbox 布局的传统解决 ...

随机推荐

  1. Java第三周学习日记

    Day01 1.线程 进程:进程就是正在运行的应用程序.进程负责了内存空间的划分. 线程:一个进程中的代码是由线程去执行的,线程也就是其中一个执行路径. 多线程:一个进程中有多个线程可以同时执行任务. ...

  2. Action Result

    操作返回的内容成为操作结果 大多数情况下返回ViewResult,基类ActionResult 6钟标准类型: ViewResult:视图结果,包含HTML标记等元素 EmptyResult:空结果 ...

  3. 从blob字段读取图片 在浏览器显示

    public byte[] GetProImg(string JID) { byte[] Buffer = null; using (OracleConnection conn = new Oracl ...

  4. Angular2 和TypeScript

    Angular2 和TypeScript 原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者: ...

  5. Spark学习笔记-如何运行wordcount(使用jar包)

    IDE:eclipse Spark:spark-1.1.0-bin-hadoop2.4 scala:2.10.4 创建scala工程,编写wordcount程序如下 package com.luoga ...

  6. [LA] 2031 Dance Dance Revolution

    Dance Dance Revolution Time limit: 3.000 seconds Mr. White, a fat man, now is crazy about a game nam ...

  7. PowerShell_零基础自学课程_3_如何利用Powershell ISE调试PS脚本

    微软在推出PS的同时,没有忘记其一贯的作风,什么东东都弄一个IDE环境,这不微软没有忘记给PS也来一个IDE的环境, 通过这个IDE环境,可以建立psl文件,可以调试psl文件. 1.IDE界面 我们 ...

  8. C++基本要点复习--------coursera程序设计实习(PKU)的lecture notes

    因为一些特性复杂,很多时候也用不到一些特性,所以忘记了,算是随笔,也当作一个临时查找的手册.没有什么顺序,很杂. 1.构造函数通过函数重载的机制可以有多个(不同的构造函数,参数个数,或者参数类型不同. ...

  9. java获得指定日期的前一天,后一天的代码

    /** * 获得指定日期的前一天 * @param specifiedDay * @return * @throws Exception */ public static String getSpec ...

  10. hadoop 1.2.1 安装步骤 伪分布式

    最近在系统的学习hadoop 课程第一步是安装hadoop1.x,具体安装步骤如下: 一.系统安装 本文使用centos6.5安装,具体安装步骤省略 二.jdk安装 下载jdk1.7.0_51解压,在 ...