align-items和align-content的区别

29 篇文章 1 订阅
订阅专栏
12 篇文章 25 订阅
订阅专栏


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

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

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

  • justfiy-content属性可应用于所有的flex容器,它的作用是设置flex子项(flex items)在主轴上的对齐方式。不同取值的效果如下所示:
    justify-content
  • align-items属性可以应用于所有的flex容器,它的作用是设置flex子项在每个flex行的交叉轴上的默认对齐方式。不同取值的效果如下所示:
    allign-items
  • align-content 只适用多行的flex容器(也就是flex容器中的子项不止一行时该属性才有效果),它的作用是当flex容器在交叉轴上有多余的空间时,将子项作为一个整体(属性值为:flex-start、flex-end、center时)进行对齐。不同取值的效果如下所示:
    align-content
    实际上,该说法并不是很准确(见第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;
}

效果如下所示:
单行不设置高度:align-items: center;
结论:可以看到容器的高度为最高子项的高度,在一行的所有子项全都在交叉轴上居中对齐,即子项的高度中线与flex交叉轴中线重合。

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

效果如下所示:
单行不设置高度: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;
}

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

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

效果如下所示:
单行设置高度: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;
}

效果如下所示:
多行不设置高度:align-items : center;
结论:可以看到各行的子项都在各自行上居中对齐(各行的高度由高度最高的子项决定,flex容器的高度为所有行的高度最高的子项高度之和)。

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

效果如下所示:
多行不设置高度: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;
}

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

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

效果如下所示:
多行设置高度: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;
}

效果如下所示:
单行设置高度,flex-wrap: wrap; align-content: center;
结论:可以看到此时,align-content: center;将单行的子项作为一个整体在交叉轴居中了。

3. 总结

如下表:

条件属性(是否有效果)
子项flex容器align-itemsalign-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-itemsalign-content区别
qq_41629522的博客
04-14 487
说明:justfiy-content属性可应用于所有的flex容器,它的作用是设置flex子项(flex items)在主轴上的对齐方式。不同取值的效果如下所示 https://img-blog.csdnimg.cn/20190304195015924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,tex...
align-contentjustify-contentalign-items三个属性的作用和效果
qq_44329870的博客
11-20 2万+
一.align-content属性 作用:设置同一列子元素在Y轴的对齐方式 属性值 描述 flex-start 排列在当前列的最上方 flex-end 排列在当前列的最下方 center 排列在当前列的中间位置 space-between 间距相等排列,上下不留白 space-around 间距相等排列,上下留白等于间距的一半 二.justify-content属性 作用:设置同一行子元素在X轴的对齐方式 属性值 描述 flex-start 排列在当前行的
align-item 与 align-content区别
ASIYAas的博客
02-18 9924
align-item 与 align-content区别
Flex 布局:语法篇
最新发布
ll_renlong的博客
08-03 697
采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。FlexFlexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。属性都为1,当空间不足时,都将等比例缩小。属性为0,其他项目都为1,则空间不足时,前者不缩小。
align-contentalign-items区别
weixin_44738158的博客
07-20 1830
align-contentalign-items区别 1.align-items适用于单行情况下,只有flex-start(默认值,从上到下)、flex-end(从下到上)、center(居中)、stretch(拉伸,不要给子项高度) 2.align-content设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。比align-items多了space-around 和space-between两个属性 ...
flex布局align-itemsalign-content区别flex-direction容器属性
qq_22905801的博客
08-17 34
与初始状态一样,align-content: center并没有起作用,因为此时是以所有子项作为一个整体,而flex容器并没有指定高度(flex容器的高度即为子项整体的最大高度),所以flex容器在交叉轴上没有多余的空间,那么子项整体自然而然也就没有在交叉轴上对齐的说法了。只适用多行的flex容器(子项不止一行时该属性才有效果),它的作用是当flex容器在交叉轴上有多余的空间时,将子项作为一个整体(属性值为:flex-start、flex-end、center时)进行对齐。对单行的子项也有作用。......
flex布局中的 align-itemsalign-content
polar_night_down的博客
02-13 1万+
定义 align-items : 属性定义flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式。 center:元素位于容器的中心。 弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。 align-items:center align-content:会设置自由盒内部所有行作为一个整体在垂直方向排列方式。针对多行作为一个整体在纵轴上的排列方式,该属性对单行无效。 center:元素位于容器的中心。 各行向弹性盒容器的中间位置
无涯教程-Flexbox - align-items属性
无涯教程
02-12 718
align-items 属性justify content 相同。但是在这里,项目是跨交叉访问(垂直)对齐的。用法-alignitemsflexstartflexendcenterbaselinestretch;此属性接受以下值-flex-start - 在集合顶部垂直对齐。flex-end - 在集合底部垂直对齐。flex-center - 在集合的中心垂直对齐。stretch - 在垂直方向上对齐,以使它们充满集合的整个垂直空间。
flex布局中align-itemsalign-content区别
热门推荐
Hey firefly
05-29 8万+
参考资料:http://stackoverflow.com/questions/31250174/css-flexbox-difference-between-align-items-and-align-content看了很多翻译的技术文档,这一块都讲得模糊不清,看到stackoverflow上有人提问后的回答觉得十分清晰,特来分享,有不当之处欢迎指正。 align-items The ali
小程序笔记—一文弄懂align-itemsalign-content区别(实操)
WeiHan_Seven的博客
01-19 3534
flex布局是小程序的主流布局之一,在写布局的时候总是无法避免align-itemsalign-content这两个属性,除了知道它们是控制交叉轴的对齐方式,但究竟什么时候用哪个,只能这个不行,就换那个,今天就来搞明白他们的异同。
align-itemsalign-content区别
qq_42524153的博客
02-17 264
align-itemsalign-content区别       虽然两者都表示设置子元素在侧轴上的排列方式,但:       align-items 应用于子元素没有换行(父元素代码中没有flex-wrap:wrap;)的情况下    &n...
align-item 和 align-content
m0_56699208的博客
01-18 2190
当你的 flex 容器有足够的空间导致内容分布在多行时,align-content 决定了这些行如何相互间隔和对齐。它的值包括 flex-start, flex-end, center, space-between, space-around, 和 stretch。当你有一个 flex 容器,并且里面的项目不足以多行排列时,align-items 将决定这些项目如何在交叉轴上对齐。它有几个值,如 flex-start, flex-end, center, baseline, 和 stretch。
align-contentalign-items区别
qq_40341342的博客
03-13 364
共同点 align-contentalign-items都是作用于flex容器中子项在垂直轴的位置。 不同点 align-items : 是作用于容器内的每1行在当前交叉轴的对齐位置(如果容器内只有1行则以唯一的交叉轴为标准,如果容器内有好几行则每行以每行的交叉轴为标准) align-contentflex容器内所有子选项为一个整体进行排列对齐,没有多行的概念 此处是同时应用了align...
align-conent和align-items区别
MDR_0820的博客
10-08 207
align-conent和align-items区别 align-items: 适用于单行情况下 只有 上对齐 下对齐 居中和拉伸 属性align-content :适用于换行(多行)的情况下(单行无效) 可以设置上对齐 下对齐 居中 拉伸和平均分配剩余空间等属性值 总结:单行找align-items 多行找align-content ...
align-itemsalign-content
09-07
align-itemsalign-content 是 CSS 中 Flexbox 布局的两个属性align-items 用于设置 Flexbox 中子元素的对齐方式,可以设置为 "flex-start"、"flex-end"、"center"、"baseline"、"stretch"。 align-content 用于设置 Flexbox 中多根轴线的对齐方式,在只有一根轴线的情况下,align-content 属性不会生效。可以设置为 "flex-start"、"flex-end"、"center"、"space-between"、"space-around"、"stretch"。
写文章

热门文章

  • Uncaught SyntaxError: Cannot use import statement outside a module的解决方法 253785
  • 看懂 Serverless,这一篇就够了 187069
  • 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解) 186611
  • npm install 安装出错时尝试过的方法 71074
  • Chrome 代理服务器错误,连接不了网的解决方法 53822

分类专栏

  • 优化 2篇
  • 笔记
  • 深入剖析前端中的难理解与易混淆知识 12篇
  • 问题解决 48篇
  • React 17篇
  • 前端之JS 53篇
  • 前端之CSS 29篇
  • 前端之HTML 13篇
  • node 9篇
  • npm 7篇
  • 微信小程序 1篇
  • antd 3篇
  • 重新巩固JS系列 5篇
  • 数据库 8篇
  • 工具 11篇
  • 算法 1篇
  • HIVE 7篇
  • ubuntu 2篇
  • 推荐系统 1篇
  • 其他 26篇

最新评论

  • JavaScript深拷贝看这篇就行了!(实现完美的ES6+版本)

    weixin_43860253: 为什么我用着不行呢 ?

  • 2024 年的 Node.js 生态系统

    码踏云端: 博主此篇博文内容详实,让我从中获益良多,也能看出博主拥有多年技术累积,有一定的技术深度才能层层深入。愿博主闲暇时分也能到小弟寒舍为小弟轻描淡写两句~

  • 2024 React 和 Vue 的生态工具

    字节探索者: 总结的很详细,文章有深度,内容丰富,干货满满,感谢博主的分享,期待博主持续更新

  • Vue 3 + Vite 4 移动端低版本白屏处理

    qq_29106409: 开发环境怎么解决呢?

  • Error: Cannot find module ‘webpack-cli/bin/config-yargs‘的解决方法

    xyz@.: 这样会报错webpack-dev-server3.x与webpack5.x不兼容呢

最新文章

  • 前端可视化工具生态
  • 2024 年的 Node.js 生态系统
  • git push代码报错:Failure when receiving data from the peer
2024年9篇
2023年3篇
2022年10篇
2021年21篇
2020年22篇
2019年36篇
2018年23篇
2017年8篇
2016年30篇

目录

目录

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码飞_CC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家广东酒店玻璃钢园林艺术雕塑内蒙古方形玻璃钢花盆栖霞商场春节美陈遵义玻璃钢牌匾雕塑宁波学校玻璃钢雕塑哪家便宜河南通道商场美陈销售企业北京室内商场美陈上海常用商场美陈供应商吉林玻璃钢雕塑凳子平凉仿真人物玻璃钢雕塑厂家玻璃钢国旗雕塑抚州创意玻璃钢雕塑成都艺术商场美陈商场简单美陈图片大全普陀区玻璃钢雕塑厂家供应重庆商场节庆美陈雕塑工厂荔枝玻璃钢卡通雕塑定制可爱的玻璃钢雕塑彩绘玻璃钢动物雕塑佛山古代玻璃钢雕塑网红道具玻璃钢雕塑长沙玻璃钢卡通雕塑报价玻璃钢人物胸像雕塑柘城玻璃钢花盆花器南部玻璃钢花盆花器市政玻璃钢雕塑高性价比的选择天津商场圣诞布置美陈玻璃钢柠檬卡通雕塑玻璃钢花盆专卖店淮北frp玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化