CSS3 レイアウト モードの Flexbox は、フレキシブル ボックス モデルとも呼ばれ、ボックス モデルに最大限の柔軟性を提供するために使用されます。まず例を示します。以前は、このように水平方向と垂直方向の中央に配置される div ボックスを実装しました。オブジェクトの高さと幅がわかっている場合、中央の要素が絶対パーセントで配置され、マージン オフセットによって実装されます。
<style> .container{ width: 600px; height: 400px; border: 1px solid #000; position: relative; } .box{ width: 200px; height: 100px; border: 1px solid #000; position: absolute; left: 50%; top: 50%; margin-left: -100px; margin-top:-50px; }</style><div class="container"> <div class="box"></div></div>
<style> .container{ width: 600px; height: 400px; border: 1px solid #000; display: flex; justify-content:center; align-items:center; } .box{ width: 200px; //宽度可以为任意 height: 100px; //高度可以为任意 border: 1px solid #000; }</style><div class="container"> <div class="box"></div></div>
まず、この図を分析してみましょう。最初の子ノードから、Flexbox はコンテナと Flex プロジェクトで構成されていることがわかります。コンテナは親要素で、プロジェクトは子要素です。それらの間の関係の一部は次のように表現できます:
この図は、後続の属性分析で使用できます。
フレックス コンテナ
この値が使用されると、スケーラブル コンテナはコンテンツの新しいスケーラブル フォーマット コンテキスト (FFC) を作成します。そのコンテキスト表示効果は、BFC ルート要素と同じです (BFC 機能: フロートは中断されません)。スケーラブル コンテナ、およびフレックス コンテナの境界はそのコンテンツの境界と重なりません)。
フレックス コンテナはブロック コンテナではないため、ブロック レイアウトを制御するために設計された一部のプロパティ、特に複数列 (列)、float、clear、vertical-align などの属性は flex レイアウトには適用できません。
flex-direction
主軸 の方向を制御するために使用され、また、スケーラブルなアイテムの方向。
flex-warp
flex-flow
justify-content
[justify-content] は、行上のすべてのフレックス項目がスケーラブルではない、またはスケーラブルであるがその値に達している場合に、主軸上のフレックス項目の配置を定義するために使用されます。この属性は、最大長に達した場合にのみ余分なスペースを割り当てます。このプロパティは、項目が行からオーバーフローした場合の項目の配置をある程度制御することもできます。
还是看demo理解起来快一点:
[align-items]用来定义伸缩项目在侧轴的对齐方式,这类似于[justify-content]属性,但是是另一个方向。(flex-directon和flex-wrap是一对,justify-content和align-items是一对,前者分别定义主轴和侧轴的方向,后者分别定义主轴和侧轴中项目的对齐方式)。
下面demo只展示center和stretch的栗子,其他几个可以参考flex-start和flex-end那样。
[align-content]属性可以用来调准伸缩行在伸缩容器里的对齐方式,这与调准伸缩项目在主轴上对齐方式的[justify-content]属性类似。只不过这里元素是以一行为单位。请注意本属性在只有一行的伸缩容器上没有效果。当使用flex-wrap:wrap时候多行效果就出来了。
align-content: flex-start || flex-end || center || space-between || space-around || stretch;
具体图片来至w3.org官方文档;
太麻烦。写不下去了,摔。
终于写到关于伸缩项目的相关属性了,主要是3个,order,flex(flex-grow,flex-shrink,flex-basis的组合),align-self;用来比较多的是前两个。
有一种用法比较多,想设置一组中有两个元素一个排第一,另外一个排最后,主需要将第一个的order:-1;另一个为order:0;这样就好了。
譬如我们想控制一个container中有4个box,想box4为一个显示,box1为最后一个显示。只需要 这样
<style>.container{ display: flex; } .box1{ order:1; } .box4{ order:-1; }</style><div class="container"> <div class="box1">1</div> <div class="box2">2</div> <div class="box3">3</div> <div class="box4">4</div></div>
显示效果就这样了:
[flex]属性可以用来指定可伸缩长度的部件,是flex-grow(扩展比例),flow-shrink(收缩比例),flex-basis(伸缩基准值)这个三个属性的缩写写法,建议大家采用缩写的方式而不是单独来使用这3个属性。
flex:none | [ <'flex-grow'> ?<'flew-shrink'> || <'flow-basis'>]// flex-grow是必须得flex-shrink和flow-basis是可选的
flex-basis用图来表示就是这样:
[align-self]用来在单独的伸缩项目上覆写默认的对齐方式,这个属性是用来覆盖伸缩容器属性align-items对每一行的对齐方式。也就是说在默认的情况下这两个值是相等的。
align-self: auto | flex-start | flex-end | center | baseline | stretch
讲了这么多他们的使用,我们来看一看flexbox布局的兼容性。
具体大家可以见这个网站:caniuse
在PC端其实很乐观了,基本上主流的浏览器都已经兼容了flex的使用,但是到了移动端就不是那么好了,特别是国内浏览器,考虑到uc浏览器占了大头,但是uc从图中看到只兼容flex最老的一个版本,也就是2009年的版本,即display:box;很多现在flex的优秀特性到了它上面都不兼容了,所以建议大家在使用的时候,假如2009版本可以满足开发要求的话,还是去使用2009版本,这样风险更小。
但是假如想兼容多个浏览器,可以采用优雅降级的方式来使用,这里推荐一个scss的sass-flex-mixin,这样就可以使用最新的写法,并且兼容大部分浏览器了。
相信flexbox布局在以后的移动端会用得越来越多的。