文章目录

  • 1. stack overflow上的回答(翻译)
  • 2. 自己动手实践
    • 2.1 子项为单行的情况
      • 2.1.1 flex容器不设置高度
      • 2.1.2 flex容器设置高度
    • 2.2 子项为多行的情况
      • 2.2.1 flex容器不设置高度
      • 2.2.2 flex容器设置高度
    • 2.3 补充
  • 3. 总结

在用 flex布局时,发现有两个属性功能好像有点类似: align-itemsalign-content,乍看之下,它们都是用于定义flex容器中元素在交叉轴(主轴为 flex-deriction定义的方向,默认为row,那么交叉轴跟主轴垂直即为column,反之它们互调,flex基本的概念如下图所示)上的对齐方式,那么它们之间有什么区别呢?
本文通过实例代码来对此展开研究(flex-direction默认为水平方向,环境为google浏览器:版本 72),主要分为三部分:
① 翻译stack overflow的好的回答。
② 自己代码实例展示差别。
③ 总结。
注:本文只限属性取值为center的情况,其他属性值请自己尝试。

1. stack overflow上的回答(翻译)

详见问题:https://stackoverflow.com/questions/31250174/css-flexbox-difference-between-align-items-and-align-content

  • justfiy-content属性可应用于所有的flex容器,它的作用是设置flex子项(flex items)在主轴上的对齐方式。不同取值的效果如下所示:
  • align-items属性可以应用于所有的flex容器,它的作用是设置flex子项在每个flex行的交叉轴上的默认对齐方式。不同取值的效果如下所示:
  • align-content 只适用多行的flex容器(也就是flex容器中的子项不止一行时该属性才有效果),它的作用是当flex容器在交叉轴上有多余的空间时,将子项作为一个整体(属性值为:flex-start、flex-end、center时)进行对齐。不同取值的效果如下所示:

    实际上,该说法并不是很准确(见第2.3的例子),以下我们通过实例代码来验证一下。

2. 自己动手实践

2.1 子项为单行的情况

初始代码(后面例子的代码中省略了与flex无关且不变的部分,这里使用React,所以是className)如下:

<div className='flex'><div className='i1'>1</div><div className='i2'>2</div><div className='i3'>3</div><div className='i4'>4</div>
</div>

对应的CSS:

.flex {width: 500px;margin: 10px;text-align: center;border: 2px solid #9a9a9a;display: flex; /* 默认的flex-direction为row,则交叉轴方向为column,即垂直方向*/
}
.flex div {width: 100px;margin: 5px;
}
.i1 {background-color: #ffb685;height: 130px;
}
.i2 {background-color: #fff7b1;height: 50px;width: 120px;
}
.i3 {background-color: #b1ffc8;height: 100px;
}
.i4 {background-color: #b1ccff;height: 60px;
}

效果如下所示:

结论:在所有的flex布局中,这里其实有浏览器默认的属性:align-items: normal;align-content: normal;,效果为顶部对齐。

2.1.1 flex容器不设置高度

初始状态:

.flex {display: flex;
}

效果如下所示:

结论:有默认的属性align-items: normal;,效果为顶部对齐。

  1. 设置 align-items : center
.flex {display: flex;align-items: center;
}

效果如下所示:

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

  1. 设置 align-content: center
.flex {display: flex; align-content: center;
}

效果如下所示:

结论:可以看到与初始状态并没有区别,即在flex容器不设置高度并且子项只有一行时,align-content属性是不起作用的。

2.1.2 flex容器设置高度

初始状态:

.flex {height: 500px; /* 给flex容器添加一个高度 */display: flex;
}

效果如下所示:

结论: 与flex容器不设置高度差不多,只是外层容器的高度增加而已。

  1. 设置 align-items : center
.flex {height: 500px;display: flex;align-items: center;
}

效果如下所示:

结论:可以看到在一行的所有子项全都在交叉轴上居中对齐,与flex容器高度不设置时的效果一样(只不过此时高度最大的子项也居中对齐了)。

  1. 设置 align-content: center
.flex {display: flex;align-content: center;
}

效果如下所示:

结论:可以看到,此时align-content: center;并没有起作用,效果与初始状态一样。

2.2 子项为多行的情况

初始状态:

<div className='flex'><div className='i1'>1</div><div className='i2'>2</div><div className='i3'>3</div><div className='i4'>4</div><div className='i5'>5</div><div className='i6'>6</div>
</div>

对应的CSS:

.flex {width: 500px;margin: 10px;border: 2px solid #9a9a9a;text-align: center;display: flex;flex-wrap: wrap; /* 使flex容器一行放不下子项换行*/
}
.i5 {background-color: #c8b1ff;height: 40px;
}
.i6 {background-color: #ffb1e5;height: 80px;
}

效果如下所示:

结论:同单行一样,这里也有浏览器默认的属性:align-items: normal;align-content: normal;,效果为顶部对齐。

2.2.1 flex容器不设置高度

初始状态:

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

效果如下所示:

结论:默认顶部对齐,每一行的高度为该行子项中高度最大的那个值。

  1. 设置 align-items : center
.flex {display: flex;flex-wrap: wrap; align-items: center;
}

效果如下所示:

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

  1. 设置 align-content: center
.flex {display: flex;flex-wrap: wrap; align-content: center;
}

效果如下所示:

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

2.2.2 flex容器设置高度

初始状态:

.flex {height: 500px;display: flex;flex-wrap: wrap;
}

效果如下所示:

结论:由浏览器的默认值确定。

  1. 设置 align-items : center
.flex {height: 500px;display: flex;flex-wrap: wrap; align-items: center;
}

效果如下所示:

结论:这里我们可以看出,子项分为2行,flex容器将交叉轴上的多余空间按行数平均分给每行,然后每行各自按自己所在的行居中对齐(此时的单行效果跟2.1.2中的例子1效果一样)

  1. 设置 align-content: center
.flex {height: 500px;display: flex;flex-wrap: wrap; align-content: center;
}

效果如下所示:

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

2.3 补充

以上为什么要区分flex容器是否有固定高度是因为有一种特殊的情况,即:当子项为单行,flex容器具有固定的高度并且设置了flex-wrap: wrap;时,align-content: center;对单行的子项也有作用。

<div className='flex'><div className='i1'>1</div><div className='i2'>2</div><div className='i3'>3</div><div className='i4'>4</div>
</div>
.flex {height: 500px;display: flex;flex-wrap: wrap; align-content: center;
}

效果如下所示:

结论:可以看到此时,align-content: center;将单行的子项作为一个整体在交叉轴居中了。

3. 总结

如下表:

条件 属性(是否有效果)
子项 flex容器 align-items align-content
单行 不指定高度
固定高度 否(但是有设置flex-wrap:wrap;时,有效果)
多行 不指定高度
固定高度

结论:从上表可知,对于align-itemsalign-content的区别,我们只需要记住以下两点,

  1. align-items属性是针对单独的每一个flex子项起作用,它的基本单位是每一个子项,在所有情况下都有效果(当然要看具体的属性值)。
  2. align-content属性是将flex子项作为一个整体起作用,它的基本单位是子项构成的行,只在两种情况下有效果:①子项多行且flex容器高度固定 ②子项单行,flex容器高度固定且设置了flex-wrap:wrap;

这里有个flex布局的小教程,感兴趣的同学可以玩玩:http://flexboxfroggy.com/

注:这里的高度固定的意思实际上是让flex容器在交叉轴上有多余的空间。

若对你有帮助,可以支持一下作者创作更多好文章哦~

align-items和align-content的区别相关推荐

  1. python requests text content_python request text 和 content的区别

    1 test和content简介resp.text返回的是Unicode型的数据. resp.content返回的是bytes型也就是二进制的数据. 如果你想取文本,可以通过r.text. 如果想取图 ...

  2. cube-ui组件Form自定义

    效果图: HTML部分代码: <cube-form-group style="background: #FFFFFF;"><cube-form-item :fie ...

  3. text-align 和 align的区别

    text-align 和 align的区别 时间  2016-01-14 标签 text-align align text-align和align的区别 栏目 HTML 原文   http://blo ...

  4. RoI Pooling 与 RoI Align 有什么区别?

    ↑ 点击蓝字 关注视学算法 作者丨AlexChung@知乎 来源丨https://zhuanlan.zhihu.com/p/161540817 编辑丨极市平台 基本概念 RoI RoI(Region ...

  5. android studio table居中代码_html table表格标签内容如何居中显示?表格的align属性的用法介绍...

    本篇文章主要的介绍了关于HTML 表格table标签的居中使用,还有关于align属性在table表格标签中的使用方法,可以帮助表格对齐和表格中的文本对齐.接下来让我们来看看这篇文章吧. 首先我们先来 ...

  6. python requests中content与text方法的区别

    python requests中content与text方法的区别 目录 python requests中content与text方法的区别 目录 requests的作用 response的常用方法: ...

  7. HTML基础-05-图片(引用图片src=“图片地址“、图片位置 align=“位置“、浮动图片 style=“float:位置“、图片链接 href=“目标url“、图形映射)

    文章目录 1. 引用图片(src="图片地址") 语法示例 完整示例 2. 图片的位置(align="位置") 语法示例 完整示例 3. 浮动图片(style= ...

  8. 【玩转控件系列】控件布局之随心掌控布局 Align And Anchors

    很多人对Delphi 的布局运用不好,特制作该教程,用好控件最基本的属性. 1.一个Panel随窗体自动大小 属性配置: Align=alClient 2.上中下布局自动调整大小: 属性配置: Pan ...

  9. Flutter中Stack层叠组件以及与Align、Positioned组件实现定位布局

    1. Stack 组件 Stack 表示堆的意思,用此组件修饰的子组件会"堆"在一起. 常见属性: 1. alignment  对齐方式: 2. children 子组件: 代码示 ...

  10. 标签 align 属性

    align=align - 对齐位置 首页 > HTML标签 > align= align ■ 属性 <标签名 align=align> - 对齐位置 ■ 块元素.单元格元素的 ...

最新文章

  1. 解决运行eclipse内存不足的问题
  2. Camstasia studio渲染(生成)视频
  3. InitializeComponent()有什么作用?
  4. element el-input 自动获取焦点和IE下光标位置解决方法
  5. 全景图拍摄_全景效果图制作软件如何选择?全景图拍摄有哪些步骤?
  6. Java CAS 原理分析
  7. 面向对象的重试模式方法
  8. ssm框架图片上传与显示_SSM在线考试系统
  9. 五种食物可以吃掉黑眼圈
  10. 【时间序列】时序分析之移动平均-python实战
  11. 宝塔面板解除强制绑定手机账号限制教程
  12. EXE高清图标(ico)制作教程
  13. php怎么让浏览器崩溃,让IE6浏览器崩溃
  14. bug:ValueError: multi_class must be in (‘ovo‘, ‘ovr‘)
  15. 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】
  16. SSL 证书购买以及Nginx配置相关问题
  17. 【通信仿真】基于matlab噪声调频干扰仿真【含Matlab源码 1951期】
  18. java判断折扣价格
  19. jmeter 使用BeanShell编写java代码提取请求参数
  20. 1928年 阿姆斯特丹 第九届奥运会

热门文章

  1. 验证中的FPGA原型验证
  2. POJ 超详细分类
  3. DRIVE视网膜血管分割——基于像素点分割(BP网络和CNN网络)
  4. 华为鸿蒙支持手柄,华为智慧屏S系列正式发布 率先搭载最新版鸿蒙OS
  5. linux远程管理器 - xshell和xftp使用教程(zhuan)
  6. sysbench mysql oltp_sysbench OLTP基准测试
  7. 计算机的应用发展趋势,计算机软件的应用及发展趋势
  8. Java byte数组与十六进制字符串互转
  9. HTML中Table表格的使用与漂亮的表格模板
  10. mysql1440秒未活动_修改phpMyAdmin中的默认1440超时时间