## 一、弹性盒模型 弹性盒模型是css3的一种新的布局方式,是一种当前页面需要适应不同的屏幕大小及设备类型时确保拥有恰当的行为的布局方式。 **要点:** - 主要是针对容器类元素中对子元素的布局上的控制 - 弹性盒模型是由弹性容器与弹性子元素构成 - 对于父级元素之外,子元素以内是正常渲染的,与弹性盒模型无关 ## 二、CSS3 弹性盒子内容 ### 1、基本概念 - 弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。 - 弹性容器通过设置 display 属性的值为 flex 或 inline-flex将其定义为弹性容器。 - 弹性容器内包含了一个或多个弹性子元素。 - 弹性子元素通常在弹性盒子内一行显示。默认情况每个容器只有一行。 ### 2、display:flex 和 display:inline-flex 区别 - flex: 将对象作为弹性伸缩盒显示 - inline-flex:将对象作为内联块级弹性伸缩盒显示 #### (1)flex ``` .main { background-color: #0f0; display: flex; } .main>div { width: 50px; height: 50px; border: 1px solid #000; } <div class="main"> <div></div> <div></div> <div></div> <div></div> </div> ``` 此时没有为父元素main设置宽度,默认为100%; #### (2)inline-flex ``` .main { background-color: #0f0; display: inline-flex; } .main>div { width: 50px; height: 50px; border: 1px solid #000; } .main div:nth-child(2) { height: 60px; } <div class="main"> <div></div> <div></div> <div></div> <div></div> </div> ``` 此处虽然没有给父元素设置宽度,但是父元素默认会根据子元素的宽高去自适应。 ## 三、CSS3 弹性盒子常用属性 属性 | 描述 ---|--- flex-direction | 指定弹性容器中子元素排列方式。 flex-wrap | 设置弹性盒子的子元素超出父容器时是否换行。 flex-flow | flex-direction 和 flex-wrap 的简写。 align-items | 设置弹性盒子元素在侧轴(纵轴)方向上的对齐方式。 align-content | 修改 flex-wrap 属性的行为,类似 align-items, 但不是设置子元素对齐,而是设置行对齐。 justify-content | 设置弹性盒子元素在主轴(横轴)方向上的对齐方式。 ### 1、flex-direction 属性 决定项目的方向。 **注意**:如果元素不是弹性盒对象的元素,则 flex-direction 属性不起作用。 ``` .flex-container { flex-direction: row | row-reverse | column | column-reverse; } ``` ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635152948636/01.png) **属性值** 值 | 描述 ---|--- row | 默认值。元素将水平显示,正如一个行一样。 row-reverse | 与 row 相同,但是以相反的顺序。 column | 元素将垂直显示,正如一个列一样。 column-reverse| 与 column 相同,但是以相反的顺序。 ### 2、flex-wrap 属性 flex-wrap 属性规定flex容器是单行或者多行,同时横轴的方向决定了新行堆叠的方向。 值 | 描述 ---|--- nowrap | 默认值。规定元素不拆行或不拆列。 wrap | 规定元素在必要的时候拆行或拆列。 wrap-reverse | 规定元素在必要的时候拆行或拆列,但是以相反的顺序。 ``` .flex-container { flex-wrap: nowrap | wrap | wrap-reverse; } ``` 可以取三个值: **(1)nowrap (默认):不换行** ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635152986650/02.png) **(2)wrap:换行,第一行在上方** ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153001561/03.png) **(3)wrap-reverse:换行,第一行在下方** ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153014841/04.png) ### 3. flex-flow 属性 flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。 ``` .flex-container { flex-flow: <flex-direction> <flex-wrap> } ``` ### 4、align-items属性 align-items 属性定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式。 ``` .flex-container { align-items: flex-start | flex-end | center | baseline | stretch; } ``` 值 | 描述 ---|--- stretch | 默认值。项目被拉伸以适应容器。 center | 项目位于容器的中心。 flex-start | 项目位于容器的开头。 flex-end | 项目位于容器的结尾。 baseline | 项目位于容器的基线上。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153034311/05.png) ### 5、align-content属性 align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。 ``` .flex-container { align-content: flex-start | flex-end | center | space-between | space-around | stretch; } ``` 值 | 描述 ---|--- flex-start | 与交叉轴的起点对齐。 flex-end | 与交叉轴的终点对齐。 center | 与交叉轴的中点对齐 space-between | 与交叉轴两端对齐,轴线之间的间隔平均分布。 space-around | 每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。 stretch | (默认值)。轴线占满整个交叉轴。 。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153053848/06.png) ### 6、justify-content属性 justify-content 用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式。 ``` .flex-container { justify-content: flex-start | flex-end | center | space-between | space-around; } ``` 值 | 描述 ---|--- flex-start | 默认值。项目位于容器的开头。 flex-end | 项目位于容器的结尾。 center | 项目位于容器的中心。 space-between| 项目位于各行之间留有空白的容器内。 space-around | 项目位于各行之前、之间、之后都留有空白的容器内。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153072354/07.png) ## 四、弹性子元素属性 属性 | 描述 ---|--- order | 设置弹性盒子的子元素排列顺序。 flex-grow | 设置或检索弹性盒子元素的扩展比率。 flex-shrink | 指定了 flex 元素的收缩规则。flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。 flex-basis | 用于设置或检索弹性盒伸缩基准值。 flex | 设置弹性盒子的子元素如何分配空间。 align-self | 在弹性子元素上使用。覆盖容器的 align-items 属性。 ### 1、order属性 ``` .flex-container .flex-item { order: <integer>; } ``` \<integer>:用整数值来定义排列顺序,数值小的排在前面。可以为负值,默认为0。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153093402/08.png) ### 2、flex-grow属性 ``` .flex-container .flex-item { flex-grow: <integer>; } ``` \<integer>:一个数字,规定项目将相对于其他灵活的项目进行扩展的量。默认值是 0。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153105715/09.png) ### 3、flex-shrink属性 ``` .flex-container .flex-item { flex-shrink: <integer>; } ``` \<integer>:一个数字,规定项目将相对于其他灵活的项目进行收缩的量。默认值是 1。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153120398/10.png) ### 4、flex-basis属性 ``` .flex-container .flex-item { flex-basis: <integer> | auto; } ``` \<integer>:一个长度单位或者一个百分比,规定元素的初始长度。 auto:默认值。长度等于元素的长度。如果该项目未指定长度,则长度将根据内容决定。 ### 5、flex属性 flex 属性用于设置或检索弹性盒模型对象的子元素如何分配空间。 flex 属性是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性。 ``` .flex-container .flex-item { flex: flex-grow flex-shrink flex-basis | auto | initial | inherit; } ``` 值 | 描述 ---|--- flex-grow | 一个数字,规定项目将相对于其他元素进行扩展的量。 flex-shrink | 一个数字,规定项目将相对于其他元素进行收缩的量。 flex-basis | 项目的长度。合法值:"auto"、"inherit" 或一个后跟 "%"、"px"、"em" 或任何其他长度单位的数字。 auto | 与 1 1 auto 相同。 none | 与 0 0 auto 相同。 initial | 设置该属性为它的默认值,即为 0 1 auto。 inherit | 从父元素继承该属性。 ### 6、align-self属性 ``` .flex-container .flex-item { align-self: auto | stretch | center | flex-start | flex-end | baseline | initial | inherit; } ``` 值 | 描述 ---|--- auto | 默认值。元素继承了它的父容器的 align-items 属性。如果没有父容器则为 "stretch"。 stretch | 元素被拉伸以适应容器。 center | 元素位于容器的中心。 flex-start | 元素位于容器的开头。 flex-end | 元素位于容器的结尾。 baseline | 元素位于容器的基线上。 initial | 设置该属性为它的默认值。 inherit | 从父元素继承该属性。 ![](http://nhfcloms-deveopler.oss-cn-beijing.aliyuncs.com/dwwb/portal/project/1635153135416/11.png) 取值同 align-items。