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/