11.7 flex容器设置(续)

本节继续讲解flex容器设置。


11.7.1 自动换行flex-wrap

flex布局通过“自动换行”,从而形成多列多行结构。flex布局与float布局靠自动换行实现多行多列,而table布局与grid布局是直接指定行。

当容器宽度小于各列宽度之和,共有3种处理方式。

(1)自动换行。容器宽度与列宽度均不变。

(2)溢出显示。容器宽度与列宽度均不变。

(3)列收缩。容器宽度不变,列宽度缩小。

三种处理方式示意图如下。

img

第3种方式收缩处理前面已经介绍,这里介绍前两种处理。


处理方式1:自动换行处理

flex-wrap用于flex容器,表示flex子元素是否自动换行。默认值nowrap表示不会自动换行,值wrap表示会自动换行。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        *{
            box-sizing: border-box;
        }
        .parent{
            display: flex;
            flex-wrap: wrap; /* add */
            border: 2px solid #666;
            width: 500px;
        }



        [class^="col"]{
            width: 200px;
        }

        .col1{
            background-color: #0aaa76;
        }

        .col2{
            background-color: #4aa6fc;
        }

        .col3{
            background-color: #ed7d31;
            height: 80px;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="col1">
            <div>第1列</div>
            <div>小步教程</div>
            <div>xiaobuteach.com</div>
        </div>
        <div class="col2">
            <div>第2列</div>            
        </div>
        <div class="col3">
            <div>第3列</div>
            <div>每列可继续加入复杂布局</div>
        </div>
    </div>
</body>
</html>

运行效果

img

开发者工具关于是否换行的示意图如下。flexbox编辑器图标设计非常形象。

img


处理方式2:溢出

设置既不换行又不收缩从而让它溢出。

步骤1:使用flex-wrap默认nowrap设置不换行。

步骤2:同时通过flex: 0 0 auto设置子元素不伸缩。

        .parent{
            display: flex;
            border: 2px solid #000;
            width: 500px; /* add */
        }

        [class^="col"]{
            width: 200px;
            flex: 0 0 auto; /* add */
        }

运行效果

img


11.7.2 复合属性flex-flow

flex-flow是flex-direction与flex-wrap的复合属性,flex-flow的默认值:row nowrap。

示例代码

        .parent{
            display: flex;
            flex-wrap: wrap;
        }

等价

        .parent{
            display: flex;
            flex-flow: row wrap;
        }

11.7.3 flex line box

1、flex行盒模型示意图

img

flex容器内部会新建一个flex格式化上下文(FFC),针对每一行会新建逻辑对象flex行盒,flex line box,原理类似IFC的行盒。当flex容器设置flex-wrap: wrap允许自动换行时,第一个行盒的宽度不足以容纳flex item4,自动换行也就是新建一个行盒flex line box2。

示例代码

 <!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        *{
            box-sizing: border-box;
        }
        .parent{
            display: flex;
            flex-wrap: wrap; 
            justify-content: space-between;
            align-items: flex-start;
            align-content: stretch;
            border: 2px solid #666;
            width: 450px;
            height: 200px;
        }

        [class^="col"]{
            width: 120px;            
        }

        .col1{
            background-color: #0aaa76;
            align-self: center;
            flex-grow: 1;
        }

        .col2{
            background-color: #4aa6fc;
        }

        .col3{
            background-color: #ed7d31;
            height: 60px;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="col1">
            <div>第1列</div>
            <div>小步教程 xiaobuteach.com</div>
        </div>
        <div class="col2">第2列</div>
        <div class="col3">第3列</div>
        <div class="col2" style="width: 100px;">第4列</div>
        <div class="col3">第5列</div>
        <div class="col1">第6列</div>
    </div>
</body>
</html>

运行效果

img


2、各种对齐属性

(1)水平对齐方式justify-content表示子元素在flex行盒内部的对齐。

(2)垂直对齐方式align-items表示子元素在flex行盒内部的对齐,align-items设置所有子元素的默认垂直对齐,子元素通过align-self单独设置自己的垂直对齐。

(3)多行对齐方式align-content表示多个flex行盒在flex容器内的对齐。

属性flex-grow的伸长与属性flex-shrink的收缩发生在flex行盒内部。


11.7.4 行内水平对齐与排列justify-content

属性justify-content表示各元素在一个flex行盒内的水平对齐与排列,包括三种对齐与三种排列。justify-content示意图如下。

img

Chrome开发者工具的示意图

img

属性值具体说明。

三种对齐:默认值normal,相当于值flex-start左对齐;flex-end右对齐;center居中对齐。

三种排列:space-around,space-between、space-evenly,列间距不同。

space-between:左右无间距,其余列间距平分剩余宽度。数学表达式为 0:1:1:0。

space-around:最左最右是其余列间距的一半。数学表达式为 0.5:1:1:0.5。

space-evenly:最左最右与其它列间距相等。数学表达式为 1:1:1:1。


示例1:space-between。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        *{
            box-sizing: border-box;
        }
        .parent{
            display: flex;            
            justify-content: space-between;
            border: 1px solid #666;
        }

        [class^="col"]{
            width: 150px;
        }

        .col1{
            background-color: #0aaa76;
        }

        .col2{
            background-color: #4aa6fc;
        }

        .col3{
            background-color: #ed7d31;
            height: 150px;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="col1">
            <div>第1列</div>
            <div>小步教程</div>
        </div>
        <div class="col2">
            <div>第2列</div>
            <div>xiaobuteach.com</div>
        </div>
        <div class="col3">
            <div>第3列</div>
            <div>每列可继续加入复杂布局</div>
        </div>
    </div>
</body>
</html>

运行效果

img

试一试。space-evenly、space-around运行效果。


11.7.5 行内垂直对齐

1、flex容器align-items统一设置

flex容器属性align-items表示各元素在一个flex行盒内垂直对齐。

img

开发者工具的示意图

img


flex布局共支持5种单行内的垂直对齐:顶部对齐flex-start、垂直居中center、底部对齐flex-end、拉伸至顶部与底部stretch、基线对齐baseline。

align-items默认值normal,等同于stretch,表示子元素高度自动伸展至容器高度。其余4种对齐方式不会拉伸。


示例1:stretch拉伸对齐。

前面基本所有代码都使用了stretch值。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        * {
            box-sizing: border-box;
        }

        .parent {
            display: flex;
            align-items: stretch;
            /* align-items: flex-end; */
            border: 1px solid #666;
        }



        [class^="col"] {
            width: 150px;
        }

        .col1 {
            background-color: #0aaa76;
        }

        .col2 {
            background-color: #4aa6fc;
        }

        .col3 {
            background-color: #ed7d31;
            height: 150px;
        }
    </style>
</head>

<body>
    <div class="parent">
        <div class="col1">
            <div>第1列</div>
            <div>小步教程</div>
        </div>
        <div class="col2">
            <div>第2列</div>
            <div>xiaobuteach.com</div>
        </div>
        <div class="col3">
            <div>第3列</div>
            <div>每列可继续加入复杂布局</div>
        </div>
    </div>
</body>

</html>

设置了3个flex子元素的高度height,运行效果3列都占满整个高度,相当于height设置无效。运行效果

img


示例2:flex-end底部对齐。代码略,运行效果如下,前两列不再被拉伸高度。

img

试一试。其它flex行盒内垂直对齐方式。


2、flex子元素align-self独立设置

flex容器元素通过align-item属性统一设置所有子元素在每一行的垂直对齐方式,flex子元素能够通过align-self单独设置自身的垂直对齐方式。

示例代码:为col2添加align-self: center。

        .col2{           
            align-self: center;
        }

运行效果

img


11.7.6 多行的垂直对齐与排列align-content

justify-content与align-items指元素在行盒内的对齐排列,align-content是多个行盒在flex容器的对齐排列。包括3种对齐与3种排列。

3种对齐示意图。虚线框表示flex行盒。

img

3种排列示意图

img

属性值具体说明。

3种对齐:顶部对齐flex-start、垂直居中center、底部对齐flex-end。

3种排列:space-between两端留0,space-around两端留0.5倍列间距,stretch拉伸所有行盒填满剩余空间。

Chrome开发者工具示意图

img

示例代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        * {
            box-sizing: border-box;
        }

        .parent {
            display: flex;
            align-content: space-between;
            border: 1px solid #666;
            width: 470px;
            height: 150px;
            flex-wrap: wrap;
        }


        [class^="col"] {
            width: 150px;
            height: 40px;
        }

        .col1 {
            background-color: #0aaa76;
        }

        .col2 {
            background-color: #4aa6fc;
        }

        .col3 {
            background-color: #ed7d31;
        }
    </style>
</head>

<body>
    <div class="parent">
        <div class="col1">第1列 小步教程</div>
        <div class="col2">第2列 xiaobuteach.com</div>
        <div class="col3">第3列</div>
        <div class="col1">第4列</div>
        <div class="col2">第5列</div>
        <div class="col3">第6列</div>
        <div class="col1">第7列</div>
        <div class="col2">第8列</div>
        <div class="col3">第9列</div>
        
    </div>
</body>

</html>

运行效果

img


11.7.7 间距gap

gap复合属性包括row-gap行间距与column-gap列间距。

gap示意图

img

gap只用于控制各子元素之间的间距,不会用于子元素与行盒或容器的间距。每个行盒的第1个子元素左边与最后1个子元素右边,不存在gap;第1行的上方与最后一方的下方,不存在gap。当子元素继续添加margin或padding值,则继续叠加间距。

示例代码

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>

    <style>
        * {
            box-sizing: border-box;
        }

        .parent {
            display: flex;
            align-content: space-between;
            border: 1px solid #666;
            width: 500px;
            flex-wrap: wrap;
            row-gap: 10px;
            column-gap: 30px;
            /* gap: 10px 30px; */
            /* gap: 20px; */
        }

        [class^="col"] {
            width: 140px;
            height: 50px;
        }

        .col1 {
            background-color: #0aaa76;
        }

        .col2 {
            background-color: #4aa6fc;
        }

        .col3 {
            background-color: #ed7d31;
        }
    </style>
</head>

<body>
    <div class="parent">
        <div class="col1">第1列 小步教程</div>
        <div class="col2">第2列 xiaobuteach.com</div>
        <div class="col3">第3列</div>
        <div class="col2">第4列</div>
        <div class="col3">第5列</div>
        <div class="col1">第6列</div>
        <div class="col1">第7列</div>
        <div class="col2">第8列</div>
        <div class="col3">第9列</div>        
    </div>
</body>

</html>

运行结果

img

属性gap复合属性,对应row-gap与column-gap。原子属性写法

row-gap: 10px;
column-gap: 30px; 

等价复合属性写法

gap: 10px 30px;

gap单值写法:表示row-gap与column-gap都是同一个值。

gap: 20px ;

等价完整写法

gap: 20px 20px ;