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. oracle学习笔记(六) JDBC使用

    JDBC使用 1. 导包 直接使用IDEA导入依赖包即可 新建一个lib,把jar包放在这里 2. 加载驱动 Class.forName("oracle.jdbc.driver.Oracle ...

  2. CSS中盒模型的理解

    今天突然看到一篇关于CSS中盒模型的文章,忽然觉得自己竟然遗忘了很多小的地方,所以写一篇文章来记忆一下 (摘抄于千与千寻写的CSS盒子模型理解,并在自己基础上添加了一些东西,希望更完善,对大家有帮助) ...

  3. SAP HUM 拆包之后的HU号码依旧存在

    比如HU 194811210666,已经被执行了Unpack操作. HUMO看这个HU号码, 执行, 可以发现,这个HU是空的,里面什么都没有. 双击HU号码,进入HU显示界面, 系统状态竟然是PHE ...

  4. jQueryMobile 網頁使用 ASP.NET Web API 服務

    微軟的 ASP.NET Web API 框架,能以 RESTful 輕量級的架構風格,建立 HTTP 服務,讓多種不同的用戶端,如: 手機.平板.電腦(PC),透過 HTTP 的 GET.POST.P ...

  5. 工具资源系列之给mac装个虚拟机

    mac 系统安装虚拟机目前有两种主流软件,一种是 Parallels Desktop ,另一种是 vmware. 本教程选用的是 vmware ,因为我之前 windows 上安装的虚拟机软件就是vm ...

  6. 阿里云服务器部署Java Web项目全过程

    最近需要将一个Java Web项目部署到服务器上,方便多人共享访问.这也是我第一次接触服务器之类的东西,也花了一点时间,最终总算部署成功,写下一篇文章记录以便日后回顾. 购买服务器 第一步当然是需要购 ...

  7. 【原】Java学习笔记033 - IO

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 需求:继承关系中爷 ...

  8. Java注解原理

    1. @interface不是接口是注解类,使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节 2. @in ...

  9. [已解决]python FileNotFoundError: [WinError 3] for getsize(filepath)

    问题代码: def sourceStatic(path, exclude): # exclude list convert to lower exclude = list(map(lambda x:x ...

  10. 【转】分享JavaScript监听全部Ajax请求事件的方法

    若Ajax请求是由jQuery的$.ajax发起的,默认情况下可以使用 jQuery的Global Ajax Event Handlers监听到Ajax事件,然而我遇到的却是用原生JavaScript ...