一、弹性盒子使用场景
浮动floats 和 定位positioning能满足大部分的布局,但也有局限性:
1.垂直居中父内容的里一块内容。
2.使容器的所有子项占用等量的可用宽度/高度,而不管有多少宽度/高度可用。
3.使多列布局中的所有列采用相同的高度,即使它们包含的内容量不同。
二、例子
1 | <body> |
1 | html { |
1.指定元素布局为flexible
需要选择将哪些元素将设置为柔性的盒子。给这些 flexible 元素的父元素 display 设置一个特定值。
1 | /* Add your flexbox CSS below here */ |
2.flex模型说明
当元素表现为flex框时,它们沿着两个轴来布局:
主轴(main axis)是沿着 flex 元素放置的方向延伸的轴(比如页面上的横向的行、纵向的列)。该轴的开始和结束被称为 main start 和 main end。
交叉轴(cross axis)是垂直于 flex 元素放置方向的轴。该轴的开始和结束被称为 cross start 和 cross end。
设置了 display: flex 的父元素(在本例中是 <section>)被称之为 flex 容器(flex container)。
在 flex 容器中表现为柔性的盒子的元素被称之为 flex 项(flex item)(本例中是 <article> 元素
3.弹性盒子属性:flex-direction 指定主轴的方向(弹性盒子子类放置的地方)默认row,使得它们按照浏览器的默认语言方向排成一排。
1 | flex-direction: column; |
1 | /* Add your flexbox CSS below here */ |
6.flex项的动态尺寸
1 | //无单位的比例值,表示每个flex项沿主轴的可用空间大小 |
1 | article { |
1 | article { |
7.flex:缩写与全写
flex 是一个可以指定最多三个不同值的缩写属性:
第一个就是上面所讨论过的无单位比例。可以单独指定全写 flex-grow 属性的值。
第二个无单位比例 — flex-shrink — 一般用于溢出容器的 flex 项。这指定了从每个 flex 项中取出多少溢出量,以阻止它们溢出它们的容器。 这是一个相当高级的弹性盒子功能,我们不会在本文中进一步说明。
第三个是上面讨论的最小值。可以单独指定全写 flex-basis 属性的值
tips:建议不要使用全写属性,除非你真的需要(比如要去覆盖之前写的)。使用全写会多些很多的代码,它们也可能有点让人困惑.
三、水平和垂直对齐
1 | <div> |
1 | html { |
1.添加css
1 | div{ |
2.flex项排序
弹性盒子也有可以改变 flex 项的布局位置的功能,而不会影响到源顺序(即 dom 树里元素的顺序)。这也是传统布局方式很难做到的一点。
1 | button:first-child{ |
3.flex嵌套
1 | <body> |
1 | html { |
结构如下:
1 | section - article |
四、跨浏览器兼容性
在真实网站中使用弹性盒子,则需要进行测试,并确保在尽可能多的浏览器中用户体验仍然可以接受。
如果浏览器缺少 CSS 阴影,则该网站可能仍然可用。 但是假如不支持 弹性盒子功能就会完全打破布局,使其不可用。
参考资料:
1.弹性盒子