Flexbox(伸缩布局),诞生于2009,是 CSS3 中一个新的布局模式,是简单、强大的分配空间与对齐内容的工具,是 Web 应用与复杂的页面所需要的。下面将介绍 Flexbox 语法的技术细节。
// 2009 spec display: -webkit-box; display: -moz-box; display: -o-box; // 2012 display: -webkit-flexbox; display: -moz-flexbox; display: -ms-flexbox; display: -o-flexbox; // new spec display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex;
Flexbox 由 伸缩容器 和 伸缩项目 组成,一个设有「display:flex」或「display:inline-flex」的元素是一个伸缩容器,伸缩容器的子元素被称为伸缩项目,创建一个伸缩容器:
.flex-container { display: -webkit-flex; display: flex; }
默认情况下,伸缩行和文本方向一致:从左至右,从上往下,但是会受到 writing modes 的影响。详情请点击:#writing modes spec#
伸缩项目的初始值:flex: 0 1 auto;
flex-direction 允许你更改伸缩容器的主轴方向。flex-direction 的默认值是 row。该值表示伸缩项目根据书写模式的方向布局。
当 writing-mode 和 flex-direction 混合存在时
一个伸缩项目是一个伸缩容器的子元素。伸缩容器中的文本也被视为一个伸缩项目。
伸缩项目中内容与普通流一样。
伸缩项目都有一个 主轴长度(Main Size) 和一个 侧轴长度(Cross Size)。主轴长度是伸缩项目在主轴上的尺寸。侧轴长度是伸缩项目在侧轴上的尺寸。或者说,一个伸缩项目的宽或高取决于伸缩容器的轴,可能就是它的主轴长度或侧轴长度。
<div class="flex-container"> <!-- 伸缩项目:块级子元素 --> <div class="item1">块级</div> <!-- 伸缩项目:浮动元素 ― 用户代理会忽略浮动 --> <div class="item2" style="float: left;">浮动</div> <!-- 伸缩项目:包着行内内容的匿名块盒 --> 匿名 <!-- 伸缩项目:行内子元素 --> <span class="item4">行内</span> </div>
下面 看 伸缩项目的 伸缩性 flex
伸缩布局决定性的特性是让伸缩项目「可伸缩」,也就是让伸缩项目的宽度或高度自动填充剩余的空间。这可以以「flex」属性完成。一个伸缩容器会等比地按照各伸缩项目的扩展比率分配剩余空间,也会按照收缩比率缩小各项目以避免溢出。
取值: none | flex-grow flex-shrink flex-basis 依次代表 扩展比率、收缩比率、伸缩基准值
其中 flex:none; 等同于 flex: 0 0 auto;
如果所有项目均为「flex: auto」、「flex: initial」或「flex: none」,则在项目尺寸决定后,剩余的正空间会被平分给是「flex: auto」的项目
说明见下一页
该值使元素可伸缩,并将伸缩基准值设置为零,导致该项目会根据设置的比率占用伸缩容器的剩余空间。如果一个伸缩容器里的所有项目都使用此模式,则它们的尺寸会正比于指定的伸缩比率。 默认状态下,伸缩项目不会收缩至比其最小内容尺寸(最长的英文词或是固定尺寸元素的长度)更小。网页作者可以靠设置「min-width」或「min-height」属性来改变这个默认状态
nowrap (默认) wrap wrap-reverse
flex-flow 是 flex-direction flex-wrap 的缩写
justify-content: flex-start | flex-end | center | space-between | space-around
align-items align-self
flex-start | flex-end | center | baseline | stretch 其中 align-self 多一个 auto
align-content: flex-start | flex-end | center | space-between | space-around | stretch
一个 "auto" 的 margin 会合并剩余的空间。它可以用来把伸缩项目挤到其他位置。
这里我们在第一个伸缩项目上声明了 margin-right: auto;,导致了所有的剩余空间被合并到那个元素的右边去了
.main { display: table; height: 100%; *position: relative; *zoom: 1; .hack { display: table-cell; vertical-align: middle; *position: absolute; *top: 50%; *width: 100%; .inner { *position: relative; *top: -50%; } } }