flex布局align-items和align-content的区别,flex-direction容器属性

本文详细解析了CSS flex布局中align-items和align-content属性的区别,强调align-items作用于单个子元素,而align-content则作用于多行子元素。内容包括两者在不同场景下的应用效果,以及flex-direction属性如何定义主轴方向。通过多个实例演示,展示了在不同设定下,如容器高度固定、子元素多行等条件下的对齐方式,帮助读者深入理解这两者的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

flex布局align-items和align-content的区别

flex-direction容器属性


 

flex布局align-items和align-content的区别

 

1、align-items是针对每一个子项起作用,它的基本单位是每一个子项,在所有情况下都有效果

2、align-content属性是将flex子项作为一个整体起作用,它的基本单位是子项构成的行

只在两种情况下有效果:

①子项多行且flex容器高度固定

②子项单行,flex容器高度固定且设置了flex-wrap:wrap


80e83d37f5dfcdb173ad9bb50e3ce647.png

 

主轴为 flex-deriction定义的方向,默认为row

交叉轴跟主轴垂直即为column,反之它们互调

justfiy-content:应用于flex容器,设置flex子项(flex items)在主轴上的对齐方式。

不同取值的效果如下所示:

 

0478def124b4a2e362a80af03db984a5.png

 

align-items应用于flex容器,设置flex子项在每个flex行的交叉轴上的默认对齐方式。

不同取值的效果如下所示:

 

380061bdb5fdf6becbab30aa13cb6500.png

 

align-content只适用多行的flex容器(子项不止一行时该属性才有效果),它的作用是当flex容器在交叉轴上有多余的空间时,将子项作为一个整体(属性值为:flex-start、flex-end、center时)进行对齐。不同取值的效果如下所示:

ee32edf7b9128efe0c0596842173b308.png

 

 

第2部分:实例演示

例1效果

 

53a05368eec32af103a014c0aef8805a.png

 

Html+css代码

<style type="text/css">

.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid #9a9a9a; display: flex; }

.flex div { width: 100px; margin: 5px; }

.flex div.eg1 { background-color: #ffb685; height: 130px; }

.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

</div>

 

 

 

结论1

在flex布局中,有默认属性:align-items: normal;和 align-content: normal;

效果为顶部对齐。

例2效果

设置 align-items : center

 

9ae2b81512308f50cc357240e4ca3759.png

 

Html+css代码

<style type="text/css">

.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: flex;align-items: center; }

.flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-align:center; }

.flex div.eg1 { background-color: #ffb685; height: 130px; }

.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

</div>

结论2

 

 

容器的高度为最高子项的高度,同一行的所有子项全都在交叉轴上居中对齐,即子项的高度中线与flex交叉轴中线重合。

例3效果

设置 align-content: center

 

ce5acfaca98d7e9205155810123865eb.png

Html+css代码

<style type="text/css">

.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: 
   flex;align-content: center; }
.flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-align:center; }
.flex div.eg1 { background-color: #ffb685; height: 130px; }
.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }
.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>
<div class="flex">
<div class="eg1">1</div>
<div class="eg2">2</div>
<div class="eg3">3</div>
<div class="eg4">4</div>

</div>

结论3

 

 

flex容器不设置高度并且子项只有一行时,align-content属性是不起作用的。

与初始状态并没有区别

例4效果图:

flex容器设置高度

 

06a89e4989ecbbf570068427dcd41f68.png

 

Html+css代码

<style type="text/css">
.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: 
  flex;height: 300px; }
.flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-align:center; }

.flex div.eg1 { background-color: #ffb685; height: 130px; }

.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

</div>

结论4

外层容器的高度增加,但是子项和flex容器不设置高度一样。

例5效果

设置 align-items : center

 

8dfdf05cd9689f7cedbd319e47f2e904.png

 

Html+css代码

<style type="text/css">
    .flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display:                 
        flex;height: 300px; align-items : center}
    .flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-    
       align:center; }
    .flex div.eg1 { background-color: #ffb685; height: 130px; }

    .flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

    .flex div.eg3 { background-color: #b1ffc8; height: 100px; }

    .flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>
<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

</div>

结论5

同一行的子项全部在交叉轴上居中对齐,与flex容器高度不设置时的效果一样(只不过此时高度最大的子项也居中对齐了)。

例6效果

设置 align-content: center

7a1c247ad11cebe675db78e16c4754be.png

 

Html+css代码


<style type="text/css">

    .flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: 
        flex;height: 300px; align-content: center}
    .flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text- 
        align:center; }

    .flex div.eg1 { background-color: #ffb685; height: 130px; }

    .flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

    .flex div.eg3 { background-color: #b1ffc8; height: 100px; }

    .flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

</div>



结论6

 

 

align-content: center;并没有起作用,效果与初始状态一样。

 

 

例7效果

 

f466b6e04bedf9ff91688d4193c16e18.png

子项为多行的情况

 

 

 

Html+css代码

<style type="text/css">
      .flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red;         
           display: flex;flex-wrap: wrap; }

     .flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text- 
         align:center; }

    .flex div.eg1 { background-color: #ffb685; height: 130px; }

    .flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

    .flex div.eg3 { background-color: #b1ffc8; height: 100px; }

    .flex div.eg4 { background-color: #b1ccff; height: 60px; }

    .flex div.eg5 { background-color: #c8b1ff; height: 40px; }

    .flex div.eg6 { background-color: #ffb1e5; height: 80px; }

</style>

    <div class="flex">

    <div class="eg1">1</div>

    <div class="eg2">2</div>

    <div class="eg3">3</div>

    <div class="eg4">4</div>

    <div class="eg5">5</div>

    <div class="eg6">6</div>


</div>

结论7

 

 

多行或单行,浏览器默认:align-items: normal; 和 align-content: normal;效果为顶部对齐。

 

 

每一行的高度为该行子项中高度最大的那个值。

 

 

例8效果

 

设置 align-items : center

 

9ee5ca3fe0472bf5127aaa92a3869014.png

 

Html+css代码

<style type="text/css">


    .flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red;     
         display: flex;flex-wrap: wrap;align-items: center; }
    .flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text- 
         align:center; }

    .flex div.eg1 { background-color: #ffb685; height: 130px; }

    .flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

    .flex div.eg3 { background-color: #b1ffc8; height: 100px; }

    .flex div.eg4 { background-color: #b1ccff; height: 60px; }

    .flex div.eg5 { background-color: #c8b1ff; height: 40px; }

    .flex div.eg6 { background-color: #ffb1e5; height: 80px; }


</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

<div class="eg5">5</div>


<div class="eg6">6</div>

</div>

结论8

 

 

各行子项都在各自行上居中对齐(各行的高度由最高的子项决定,flex容器的高度为所有行的高度最高的子项高度之和)。

 

 

例9效果

 

 

设置 align-content: center

 

442105f1977b8a1e1b26df267d4925f8.png

 

Html+css代码

<style type="text/css">

.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: flex;flex-wrap: wrap;align-content: center; }

.flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-align:center; }

.flex div.eg1 { background-color: #ffb685; height: 130px; }

.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

.flex div.eg5 { background-color: #c8b1ff; height: 40px; }

.flex div.eg6 { background-color: #ffb1e5; height: 80px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

<div class="eg5">5</div>

<div class="eg6">6</div>

</div>

结论9

 

 

与初始状态一样,align-content: center并没有起作用,因为此时是以所有子项作为一个整体,而flex容器并没有指定高度(flex容器的高度即为子项整体的最大高度),所以flex容器在交叉轴上没有多余的空间,那么子项整体自然而然也就没有在交叉轴上对齐的说法了。

 

 

例10效果

 

 

flex容器设置高度

 

ce38e31bdf2af993a1855a0afd227e30.png

 

Html+css代码

<style type="text/css">

    .flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red;     
         display: flex;flex-wrap: wrap;height: 300px; }

    .flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-            
         align:center; }

    .flex div.eg1 { background-color: #ffb685; height: 130px; }

    .flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

    .flex div.eg3 { background-color: #b1ffc8; height: 100px; }

    .flex div.eg4 { background-color: #b1ccff; height: 60px; }

    .flex div.eg5 { background-color: #c8b1ff; height: 40px; }

    .flex div.eg6 { background-color: #ffb1e5; height: 80px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

<div class="eg5">5</div>

<div class="eg6">6</div>

</div>

结论10

由浏览器的默认值确定。

例11效果

设置 align-items : center

 

f8ff6affaf53dd2b1ef81258c2a8b52c.png

 

Html+css代码

.<style type="text/css">

    .flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; 
         display: flex;flex-wrap: wrap;height: 300px; align-content: center}

    .flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-            
        align:center; }

    .flex div.eg1 { background-color: #ffb685; height: 130px; }

    .flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

    .flex div.eg3 { background-color: #b1ffc8; height: 100px; }

    .flex div.eg4 { background-color: #b1ccff; height: 60px; }

    .flex div.eg5 { background-color: #c8b1ff; height: 40px; }

    .flex div.eg6 { background-color: #ffb1e5; height: 80px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

<div class="eg5">5</div>

<div class="eg6">6</div>

</div>

结论11

 

 

flex容器将交叉轴上的多余空间按行数平均分给每行,然后每行各自按自己所在的行居中对齐

 

 

例12效果

设置 align-content: center

cdb6cdbf97dcfa9f35133e95bc10a6cb.png

 

 

Html+css代码

.<style type="text/css">

.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: flex;flex-wrap: wrap;height: 300px; align-content: center}

.flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-align:center; }

.flex div.eg1 { background-color: #ffb685; height: 130px; }

.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

.flex div.eg5 { background-color: #c8b1ff; height: 40px; }

.flex div.eg6 { background-color: #ffb1e5; height: 80px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

<div class="eg5">5</div>

<div class="eg6">6</div>

</div>

结论12

 

 

flex容器指定高度且子项为多行时,align-content: center将子项作为一个整体,然后这个整体在flex容器的交叉轴上居中对齐的。

 

 

例13效果

58eba3013b5ee429077e1f0dac738e1e.png

 

当子项为单行,flex容器有固定的高度且设置了flex-wrap: wrap;时,align-content: center;

对单行的子项也有作用。

<style type="text/css">

.flex { width: 500px; margin: 10px; text-align: center; border: 2px solid red; display: flex;flex-wrap: wrap;height: 300px; align-content: center}

.flex div { width: 100px; margin: 5px; font-weight:700;font-size:20px;text-align:center; }

.flex div.eg1 { background-color: #ffb685; height: 130px; }

.flex div.eg2 { background-color: #fff7b1; height: 50px; width: 120px; }

.flex div.eg3 { background-color: #b1ffc8; height: 100px; }

.flex div.eg4 { background-color: #b1ccff; height: 60px; }

</style>

<div class="flex">

<div class="eg1">1</div>

<div class="eg2">2</div>

<div class="eg3">3</div>

<div class="eg4">4</div>

</div>

结论13

 

 

当子项为单行且flex容器有固定的高度且设置了flex-wrap: wrap;align-content: center;

 

 

对单行的子项也有作用。将单行的子项作为一个整体在交叉轴居中了。

 

flex-direction容器属性


 

 flex-direction属性决定主轴的方向(即项目的排列方向)。

.container {
  flex-direction: row | row-reverse | column | column-reverse;
}

385be22137fc7b3d1d1a5e7ee6430324.jpeg
这将建立主轴,从而定义Flex项目放置在Flex容器中的方向。Flexbox(除了可选包装)是单向布局概念。将flex项目视为主要布置在水平行或垂直列中。

 

它可能有4个值。

  1. row(默认值):主轴为水平方向,起点在左端。
  2. row-reverse:主轴为水平方向,起点在右端。
  3. column:主轴为垂直方向,起点在上沿。
  4. column-reverse:主轴为垂直方向,起点在下沿。

案例
row:(默认值)主轴为水平方向,起点在左端 

 

 <div class="flex-direction">
        <div class="row">
            <p>我是第一个flex-direction:row</p>
        </div>
        <div class="row">
            <p>我是第二个flex-direction:row</p>
        </div>
        <div class="row">
            <p>我是第三个flex-direction:row</p>
        </div>
    </div>
    .flex-direction{
           display: flex;
           display: -webkit-flex;
           flex-direction: row;
           width: 500px;
           height: 200px;
           margin: auto;
       }
       .row{
           width: 150px;
           height: 160px;
           border: 1px  black solid;
           background-color: aqua;
       }



效果图

0768e077643b1f08cc813509a44a3a01.jpeg

 

row-reverse:主轴为水平方向,起点在右端。

 <div class="flex-direction">
        <div class="row_reverse">
            <p>我是第一个flex-direction:row-reverse</p>
        </div>
        <div class="row_reverse">
            <p>我是第二个flex-direction:row-reverse</p>
        </div>
        <div class="row_reverse">
            <p>我是第三个flex-direction:row-reverse</p>
        </div>
    </div>
 .flex-direction{
            display: flex;
            display: -webkit-flex;
            flex-direction: row-reverse;
            width: 500px;
            height: 200px;
            margin: auto;
        }
       .row_reverse{
           width: 150px;
           height: 180px;
           border: 1px #000000 solid;
           background-color: palegoldenrod;
       }


 

column:主轴为垂直方向,起点在上沿。

 <div class="flex-direction">
        <div class="column">
            <p>我是第一个flex-direction:column</p>
        </div>
        <div class="column">
            <p>我是第二个flex-direction:column</p>
        </div>
        <div class="column">
            <p>我是第三个flex-direction:column</p>
        </div>
    </div>
    .flex-direction{
            display: flex;
            display: -webkit-flex;
            flex-direction: column;
            width:500px;
            height: 300px;
            margin: auto;
        }
        .column{
            width: 130px;
            height: 280px;
            border: 1px black solid;
            background-color: gold;
        }

 bd88a7d9e279ce70588eefbece086786.jpeg

 

column-reverse:主轴为垂直方向,起点在下沿。

<div class="flex-direction">
        <div class="column-reverse">
            <p>我是第一个flex-direction:column-reverse</p>
        </div>
        <div class="column-reverse">
            <p>我是第二个flex-direction:column-reverse</p>
        </div>
        <div class="column-reverse">
            <p>我是第三个flex-direction:column-reverse</p>
        </div>
    </div>
   .flex-direction{
            display:flex;
            display: -webkit-flex;
            flex-direction: column-reverse;
            width: 500px;
            height: 300px;
            margin: auto;
        }
        .column-reverse{
            width: 150px;
            height: 200px;
            border: 1px black solid;
            background-color: lawngreen;
        }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值