flex布局和传统布局
布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
在2009年,就提出了弹性盒模型的概念,并且具有简便,完整,响应式的特点。由于响应式的特点突出,它经常被用手机端的页面的布局。遗憾的是,在手机端它的兼容性,国内大部分主流浏览器都是挂掉的,所以我们需要做一个兼容,如图:(鸡肋的兼容性啊~)
flex容器
在父级中只要要加了displays:flex /display:inline-flex 就让这个父级变成一个弹性盒模型的容器,那么它的布局模式就和我们传统的文档流布局完全不一样,它主要是以一个主轴和侧轴的概念进行布局。元素先根据主轴排列,侧轴为辅助排列。
在弹性盒模型的容器下面的子级会按照弹性布局排列,但是孙级元素则不会受到父级弹性模型布局的影响。
flex容器属性
| flex容器属性 | 内容 |
|---|---|
| flex-direction | 弹性盒模型主轴设置 |
| flex-wrap | 子元素超出父级范围后,是否换行 |
| flex-flow | 复合属性:flex-flow: flex-direction,flex-wrap |
| justify-content | 定义元素在主轴上的对齐方法 |
| align-items | 属性定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式 |
| align-content | 行对齐方式 |
-
flex-direction
-
flex-wrap
-
flex-flow
flex-direction,flex-wrap的复合属性,通过这个属性可以同时设置flex-direction,flex-wrap。例如:
flex-flow:flex-direction,flex-wrap; -
justify-content
主轴元素的排列方式。这里需要引入一个富余空间的概念。当父级元素减去子级自己的所占的空间(
width/height+margin+padding+border)之后,剩下的空间就是剩余空间。剩余空间再分配给子元素,得出不同的排列方式 -
align-items
属性定义flex子项在flex容器的当前行的**侧轴(纵轴)**方向上的对齐方式
- stretch(默认值): 拉伸
- flex-start:交叉轴上起点对齐
- flex-end:交叉轴上终点对齐
- center:交叉轴居中对齐
- baseline:基线对齐,根据交叉轴文字基线进行对齐
-
align-content
用于定义多根主轴线之间的排列方式,如果只有一条主轴线那么就不起作用啦~
属性 解析 stretch 默认值。元素被拉伸以适应容器。 center 元素位于容器的中心。各行向弹性盒容器的中间位置堆叠。 flex-start 元素位于容器的开头。各行向弹性盒容器的起始位置堆叠。每一行都紧靠住前面一行。 flex-end 元素位于容器的结尾。各行向弹性盒容器的结束位置堆叠。每一行都紧靠住前面一行。 space-between 元素位于各行之间留有空白的容器内。 space-around 元素位于各行之前、之间、之后都留有空白的容器内。 space-evenly 元素之间空白平均
flex子级容器属性
| 属性 | 描述 |
|---|---|
| order | 定义项目排列顺序,数值越小,排列越靠前,默认为0,接受负值。负值排再最前面 |
| flex-grow | 属性定义项目的放大比例,默认为0 |
| flex-shrink | 属性定义了项目的缩小比例,默认为1 |
| flex-basis | 初始值 |
| flex | 伸缩性设置 |
| align-self | 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto |
-
order
每个子项的排列顺序,数字越小,就排在主轴的前列,越来大就排的越后,设置负值也是可以的
-
flex-grow
每个子项目放大的比例。在有剩余空间的情况下,如果flex-grow的数字越大就表示该子元素占有的剩余空间越大。例如其他子元素为1的情况下,有个是2的。那么占2分的空间的子元素的范围就大一倍。如果是默认值0的话,就是默认即使有剩余空间也不占用。
-
flex-shrink
定义每个子项目的缩小比例,数值越大,压缩的范围就越大。
如果所有子项目的都有相同的值,例如默认1,那么当剩余空间不足的时候,将会等比例缩小,如有其中一个是0 其他是1,那么为0的那个子项目的空间将不会变小。
-
flex-basis
用于设置子项目的初始值。如果父级的空间放不下,会影响初始值,会对元素进行压缩。如果设置了初始值,那么初始值的优先级会大于这个元素的width。会优先显示初始值的大小。
-
flex
flex属性是flex-grow,flex-shrink和flex-basis的复合属性,默认值属性的初始默认值即0 1 auto。后两个属性可选 -
align-self
属性允许单个项目有与其他项目不一样的对齐方式。例如在一行中,你想第3个从主轴下面开始排列,那么你就可以使用这个样式。
属性 描述 auto 自动,默认 stretch 伸缩 center 中心 flex-start 主轴开始 flex-end 主轴结束 baseline 文本基线
-
特别的margin
子元素还能设置margin 值。
子级的上下margin auto 会等分父级上下的富裕空间
子级的左右margin auto 会等分父级左右的富裕空间
所以如果一个子元素设置了margin: auto 那么这个元素就可以垂直左右居中啦~
老版本兼容flex
就如我们开头所说的,国内很多手机浏览器对flex都不够友好。那么我们就需要做一点兼容。一般使用到display:box的来设置。它和flex其实非常相似。
-
容器设置
- display: -webkit-box; --Safari, Google Chrome,傲游3,猎豹浏览器,百度浏览器 opera浏览器 基于 Webkit 开发。
- display: -moz-box; --代表firefox浏览器私有属性。
- display: -ms-box;--代表IE浏览器私有属性。
- display: -o-box;--代表Opera私有属性
-
属性设置
- box-orient:horizontal || vertical 水平还是垂直排列,类似flex-direction
- box-direction:normal || reverse 是否颠倒顺序,类似flex-direction:row-severse
- box-pack:start || end || center || justify 主轴方向对齐,类似justify-content
- box-align:start || center || end 交叉轴方向对齐,类似align-items
-
子项目属性设置
- box-flex:number 类似 flex-grow
- box-ordinal-group:number 类似于 order
以上的属性设置都需要加前缀 -webkit- 、-moz- 、-ms-、-o-做浏览器的兼容。
注意
这些属性要设置在display:flex 前面。假设,一个不兼容flex浏览器读取css 先执行display:box的代码,他会正常显示,执行到display:flex 不识别,那么也不影响它后面的显示,如果是兼容flex读到display:flex 那么flex的设置会覆盖box的设置。
老鸡汤
冲呀打工人!~