Flexbox(弹性盒模型)布局完全指南

Github:sueRimn

来源:A guide to Flexbox

这个指南讲诉了flexbox的所有内容,重点介绍了父元素(flex容器)和子元素(flex元素)的所有不同可能属性。它还包括历史记录、演示、模式和浏览器支持图表。

背景

Flexbox布局(弹性盒模型)模块的目的在于提供一种更有效的方法在容器中的项之间布局、对齐和分配空间,即使它们的大小未知或是动态的(因此使用“flex一词)。

flex布局背后的主要思想是让容器能够更改其项(item)的宽度/高度(和顺序),以最佳地填充可用空间(主要是为了适应各种显示设备和屏幕大小)。flex容器(container)扩展项以填充可用的空闲空间,或者收缩项以防止溢出。

最重要的是,与常规布局(基于垂直的块和基于水平的内联块)相比,flexbox布局是与方向无关的。虽然这些常规方法在页面上运行得很好,但是它们缺乏灵活性来支持大型或复杂的应用程序(特别是在改变方向、调整大小、拉伸、收缩等方面)。

注意:Flexbox布局最适合应用程序的组件和小规模布局,而Grid布局则适用于更大规模的布局。

基本术语

由于flexbox是一个完整的模块而不是一个单独的属性,所以它涉及到很多东西,包括它的整个属性集。其中一些是要在容器上设置的(父元素,称为“flex container”),而其他的是要在子元素上设置的(称为“flex item”)。

如果“常规”布局基于块和内联流方向,那么flex布局则基于“flex-flow方向”。请从规范中查看这个图,解释flex布局背后的主要思想。 item将沿着主轴(main axis)(从主轴开始(main-start)到主轴结束(main-end))或纵轴()(从纵轴开始(cross-start)到纵轴结束(cross-end))布置。

main axis:伸缩容器的主轴是放置伸缩项的。注意,它不一定是水平的,它取决于flex-direction属性(参见下面)。

main-start|main-end:flex项被放置在容器中,从main-startmain-end

main size:伸缩项(flex item)的宽度或高度,无论在主维度(main)中是哪个,都是项的主尺寸。flex itemmain``size属性是“width”或“height”属性,两者在主维度中都有。

cross axis:垂直于主轴(main axis)的轴称为横轴。它的方向取决于主轴方向。

cross-start|cross-end:伸缩线由item填充,并从伸缩容器的cross-start侧开始,一直到corss-end侧,然后放入容器中。

cross size:flex item的宽度或高度,无论在corss维度中是哪个,都是itemcross sizecross size属性是在corss维度中的“宽度”或“高度”中的任何一个。

父元素属性(flex container) 子元素属性(flex item)
dispaly order
 
定义了一个flex容器,内联或块取决于它给定的值。它为所有直接子元素启用flex上下文
注意:css列对flex容器没有影响
默认情况下,flex item按源顺序排列。然而,order属性控制它们在flex容器中出现的顺序
.container{
display:flex;//或者 inline-flex
}
.item{
order:<整数值>;//默认为0
}
flex-direction flex-grow
这将建立主轴,从而定义放置在flex容器中的方向flex item
flexbox(除了可选的包装)是一个单向布局概念。可以将flex item主要放在水平行或垂直列中
这定义了flex item在必要时增长的能力。
它接受一个作为比例的无单位值。它指定itemflex容器中应该占用多少可用空间。
如果所有项目都将flex- growth设置为1,容器中剩余的空间将平均分配给所有子元素。如果其中一个子元素的值为2,那么剩余的空间将会占用两倍于其他元素的空间(或者至少它会尝试这样做)
注意:负数无效
.container{ 
flex-direction:row / row-reverse / column / column-reverse;
}

row(默认):ltr是从左到右;rtl是从右到左;
row-reverse:ltr是从右到左,rtl是从左到右
column:从上到下
column-reverse:从下到上

.item{
flex-grow: <数值>; //默认为0
}
flex-wrap flex-shrink
返回顶部
默认情况下,flex item都会试着放在一行上。您可以更改此属性,并允许根据需要使用此属性对项进行包装 这定义了flex item在必要时的伸缩能力
.container{
flex-wrap: nowrap / wrap / wrap-reverse;
}

nowrap(默认):所有flex item将在一条线上
wrap:flex item将会从上到下分为多行
wrap-reverse:flex item将会从下到上分为多行

.item{
flex-shrink:<数值>;
}
负数无效
flex-flow(用于父felx容器元素 flex-basis
这是一个简化的flex-directionflex-wrap属性,它们一起定义flex容器的主轴和交叉轴。默认值是row nowrap 这定义了在分配剩余空间之前元素的默认大小。它可以是一个长度(例如20%,5rem,等等)或者一个关键字。
auto关键字的意思是“查看我的宽度或高度属性”(这是由main-size关键字临时完成的,直到被弃用)。
content关键字的意思是“根据项目的内容调整大小”——这个关键字还没有得到很好的支持,因此很难进行测试,而且更难知道它的兄弟max-contentmin-contentfit-content做了什么。
felx-flow: <'felx-direction'> <'flex-wrap'> .item{
flex-basis: <长度> / auto; //默认是auto
}
如果设置为0,则不考虑内容周围的额外空间
如果设置为auto,则根据其flex-growth值分配额外的空间
justify-content flex
这定义了沿着主轴的对齐。
当一行中的所有flex item都是不灵活的,或者都是灵活的,但已经达到最大大小时,它可以帮助分配剩余的额外空闲空间。当项目溢出行时,它还对它们的对齐方式施加一些控制。
这是flex-growthflex-shrinkflex-base组合的简写。
第二个和第三个参数(flex-shrinkflex-base)是可选的。默认值是0 1 auto。
.container{
justify-content: flex-start / felx-end / center / space-around / space-evently;
}
flex-start(默认):item向行的开始聚集flex-end:item往行尾聚集
center:item在行内居中
space-between:item在行内均匀分布,第一个在行首,最后一个在行尾
space-around:item在行内均匀分布,周围空间相等,在视觉上并不是相等的
space-evently:item是均匀分布的,任何两个item之间的间距(以及边缘的空间)是相等的
.item{
flex: none
align-items flex-atart
这定义了flex item如何沿着当前行上的交叉轴的默认行为。
可以将其视为交叉轴(垂直于主轴)的justify-content版本。
这允许为单个flex项重写默认对齐(或由align-items指定的对齐)
.container{
align-items: stretch / flex-start / flex-end / center / baseline;
}
stretch(默认):拉伸填充容器(仍然考虑最小宽度/最大宽度)
flex-start:itemcross-start边为边对齐
flex-end:itemcross-end线为边对齐
center:itemcross-axis居中
baseline:item沿它们的基线对齐
.item{
align-self: auto / flex-start /flex-end / center / baseline / stretch;
}
注意:floatclearvertical对一个flex item没有影响
align-content  
当交叉轴中有额外的空间时,这将使flex容器的行对齐,类似于调整内容在主轴中对齐单个条目的方式
注意:
 
.container{
aligbn-content: flex-start / flex-end / center / space-between / space-around / stretch;
}
flex-satrt:行包装到容器顶部
flex-end:行包装到容器底部
center:行在容器中
sapce-between:行均匀分布,第一行在容器顶部,最后一行在容器底部
strecth(默认):行拉伸填充容器剩余空间
 

例子

居中

以一个很简单的例子解决一个常见的问题:居中显示

.parent{
dispaly:flex;
height:300px;
}
.child{
width:100px;
height:100px;
margin:auto;
}

这取决于在flex容器中设置marginauto的空白会吸收额外的空间。因此,设置auto的垂直边距将使项目完美地位于两个轴的中心。

自适应

现在让我们使用更多的属性。考虑一个包含6个项的列表,它们都具有固定的尺寸,但是它们可以自动调整大小。我们希望它们均匀地分布在水平轴上,以便在调整浏览器大小时一切正常(没有媒体查询!)。

.flex-container{
dispaly:flex;
flex-flow:row wrap;
justify-content:space-around;
}

响应式

我们再试试其他的,假如我们有靠右对齐的导航栏,我们希望它们在中等尺寸屏幕中居中以及在小屏幕中单列显示。

.navigation{
display:flex;
flex-flow:row wrap;
justify-content:flex-end;//交叉轴的右边显示
}
//中等屏幕
@media all and (max-width:800px){
.navigation{
justify-content:space-around;
}
}
//小屏幕
@media all and (max-width:500px){
.navigation{
flex-direction: column;
}
}

其他资源

Flexbox in the CSS specifications

Flexbox at MDN

Flexbox(弹性盒模型)完全指南的更多相关文章

  1. React Native - FlexBox弹性盒模型

    FlexBox布局 1. 什么是FlexBox布局?   弹性盒模型(The Flexible Box Module),又叫FlexBox,意为"弹性布局",旨在通过弹性的方式来对 ...

  2. flexbox弹性盒模型

    div { display:flex; } div a{ }

  3. 【css】弹性盒模型

    弹性盒模型flexBox 弹性盒模型是c3的一种新的布局模式 它是指一种当页面需要适应不同屏幕大小以及设备类型时,确保元素有恰当行为的布局方式. 引入弹性盒模型布局的目的是提供一种更有效的方法来对一个 ...

  4. (转)详解css3弹性盒模型(Flexbox)

    今天刚学了css3的弹性盒模型,这是一个可以让你告别浮动.完美实现垂直水平居中的新特性. Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似 ...

  5. flexbox-CSS3弹性盒模型flexbox完整版教程

    原文链接:http://caibaojian.com/flexbox-guide.html flexbox-CSS3弹性盒模型flexbox完整版教程 A-A+ 前端博客•2014-05-08•前端开 ...

  6. CSS3弹性盒模型flexbox布局基础版

    原文链接:http://caibaojian.com/using-flexbox.html 最近看了社区上的一些关于flexbox的很多文章,感觉都没有我这篇文章实在,最重要的兼容性问题好多人都没有提 ...

  7. CSS3弹性盒模型flexbox完整版教程

    http://caibaojian.com/flexbox-guide.html 来自CSS Tricks上的一个教程,原文为:A Complete Guide to Flexbox.文中详细的介绍了 ...

  8. css3弹性盒模型(Flexbox)

    Flexbox是布局模块,而不是一个简单的属性,它包含父元素和子元素的属性. Flexbox布局的主体思想是似的元素可以改变大小以适应可用空间,当可用空间变大,Flex元素将伸展大小以填充可用空间,当 ...

  9. 详解css3弹性盒模型(Flexbox)

    目前没有浏览器支持 box-flex 属性. Firefox 支持替代的 -moz-box-flex 属性. Safari.Opera 以及 Chrome 支持替代的 -webkit-box-flex ...

随机推荐

  1. 局域网git服务器搭建(基于win7 + bonobo git server)

    公司内网有一台win7系统的服务器. 准备在上面部署git后台, 用于内网项目版本管理. 搜索了相关资料后, 在根据公司环境, 决定采用win7 + bonobo git server + git的方 ...

  2. mybatis 在xml文件中获取当前时间的sql

    在Service等地方获取当前时间: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日 ...

  3. 对css盒模型的理解

    介绍一下标准css的盒子模型?低版本IE的盒子模型有什么不同的? 1.有两种:IE盒子模型(怪异模式).W3c盒子模型(标准模式). 2.盒模型组成:内容(content).内边距(padding). ...

  4. 如何学好java

    今天发现这么一篇文章,对于笔者谈的:"一方面很努力学习,一方面又觉得不踏实",我感同身受.觉得文章写得不错,在此献给一些在java中努力的朋友们,希望能有所收获. 文章原内容: 近 ...

  5. 如何查看linux中文件打开情况

    前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. linux下有哪些文件 在介绍lsof命 ...

  6. python从开始到放弃想标题的day12

    上次有说道函数的返回值,但是不是所有的数据类型都有返回值,一些常用的比如str基本都有返回值,list基本都没有返回值,dict基本都有返回值,还有就是函数和函数之间的数据是互不影响的,哪怕是一个函数 ...

  7. timers模块

    timers模块 var timers = require('timers'); function A() { //将A对象注册到定时器里 timers.enroll(); //进行激活,如果不激活, ...

  8. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...

  9. [解读REST] 2.REST用来干什么的?

    衔接上文[解读REST] 1.REST的起源,介绍了REST的诞生背景.每当笔者遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不 ...

  10. BAT面试题:请使用递归构建N叉树

    题目要求: 现在我们拥有全国的省.市.县.镇的行政信息,比如 浙江省 -> 杭州市 -> 西湖区 --> xx街道,请将这些信息构建成一棵树,根节点为全国,叶子节点为镇. 我的误解: ...