flexbox layout
是W3C为了更好的在网页中排版和布局而设计出来的一个模块。它用来能够处理更加复杂的布局。它本质是盒模型的延伸,它能够进一步去规范容器中子元素盒模型之间的相对关系。css
flexbox
盒子按照宽和高分出了main axis
(主轴)和cross axis
(和主轴交叉的轴),盒子的上边称为cross start
,下边称为cross end
,左边称为main start
,右边称为main end
。前端
flexbox
能够解决什么问题在前端中实现置中是一件很头疼的事情,尤为是实现垂直置中,以前在一个老外的博客上看到一篇实现置中的七种方法,其中提到一种最简单的方法就是使用transform
,须要5行代码能够实现彻底置中。git
下面看一下flexbox
实现置中:github
css.flex-container{ display:flex; justify-content: center; align-items: center; }
flexbox
只要3行代码就能够实现置中。web
在没有用flexbox
以前不少卡片设计的网站都有这样一个问题,因为卡片里面的内容多少不一样,而产生的不等高问题。浏览器
flexbox
简单的实现等高列:sass
css.flex-container{ display:flex; align-items: stretch; }
flexbox
能用在哪里
能够看出flexbox
从提出到如今也已经有了8个草案。flexbox
更新了三种写法。ide
caniuse
上各个浏览器支持的状况布局
稍微整理一下(这里借用gitcafe
的JaychSu的图用一下)
从这里能够看出现代浏览器都支持最新的那个版本,只有IE10
支持中间那个版本。flex
使用css预处理器定义的@mixin
解决flexbox版本兼容在github
上有大神把flexbox
三个版本搞成一个sass
的@mixin
,这样能够在须要的地方直接@include
进来就能够轻松解决三个版本的兼容问题。
sass关于flexbox的mixin的github项目地址
flexbox
实现的原理逻辑flex
文档流)dislpay:flex
使父容器表现为块盒子display:inline-flex
使容器表现为行盒子flex
是flex-grow
,flex-shrink
,flex-basis
的缩写形式。默认值是0 1 auto
。
flex-basis:flex-basis能够理解为咱们给子元素设置的宽度。默认值是auto,宽度设置为auto时,盒子的宽度取决大家元素的宽度。
grow
和shrink
是一对双胞胎,grow
表示伸张因子,shrink
表示是收缩因子。
grow在flex容器下的子元素的宽度和比容器和小的时候起做用。 grow定义了子元素的宽度增加因子,容器中除去子元素之和剩下的宽度会按照各个子元素的gorw值进行平分加大各个子元素上。
计算容器还剩空间
available_space(容器还剩的空间)=container_size(容器宽度)-flex_item_total(子元素宽度之和)
计算增加单位
grow_unit(增加单位)=available_space/flex_grow_total(子元素增加因子之和)
获得子元素的宽度
flex-item-width(子元素计算获得的宽度)=flex-basis+grow-unit*flex-grow
container-size=480px; flex-item-total=100*3=300px;flex-grow-total=3+2+1=6 available_space=480-300=180px; grow_unit=180/6=30px;
子元素1的宽度为:
flex_item_width1=100+3*30=190px;
子元素2的宽度为:
flex_item_width1=100+2*30=160px;
子元素3的宽度为:
flex_item_width1=100+30=130px;
Codepen实例shrink
则是在宽度和比容器宽度大时候,才有用。按照shrink的值减去相应大小获得子元素的值。
overflow_space(溢出的宽度)
计算溢出的宽度
overflow-space=flex-item-total(子元素basis宽度之和)-container_width(容器宽度)
获得计算的子元素的宽度
item-basis:子元素设置的flex-basis;item-shrink:子元素的flex-shrink;item-shrink-sum:全部子元素flex_shrink的和。 flex_item_width(计算的子元素的宽度)=item-basis --(overflow-space*(item-shrink/item-shrink-sum))
container-width=480px; item-shrink分别为3,2,1.item-basis=200px; overflow-space=120px;
则:
flex_item1_width=200-(120*(3/6))=140px; flex_item2_width=200-(120*(2/6))=160px; flex_item3_width=200-(120*(1/6))=180px;
对单行和单列不起做用,多行时才有效,需设置
flex-direction:row;flex-wrap:wrap;
或者flex-flow:row-wrap
,对flex container
中的行进行布局排版。
用于当前行中的子元素进行对齐布局。
应用在子元素上,能够覆盖
align-item
来得到特殊的元素对齐。
一个利用align-self
来改变默认align-items
排版的例子
水平方向上布局排版
用来改变子元素之间的排列循序,默认值是0,值越小,越往前排。
flexbox
解决的一些问题。codepen实例查看
* 最简洁的实现媒体对象效果。(不须要浮动和建立BFC哦!)
flexbox
的一些文章原文:http://luxiaojian.me/2015/03/22/flexboxgeng-jia-you-ya-de-webbu-ju/