flex垂直居中_flex 布局例子

398703b37e3f1bb82b859cf2b857502b.png

一般人看不惯教程,教程大多是互相抄的,教程有错漏。

所以这里给出实用的例子,不停完善中(比较简单,感觉不必要了)。


Hello World

<!-- hello world -->
<div style="display: flex;">
	<img src="https://www.zhihu.com/favicon.ico">
	<input type="" name="">
	<button>submit</button>
</div>

576437721c7a00110d0e3177aa54a990.png

会发现高度对齐了,帮了忙。如何我们换成更大的图片,会发现还是对齐。

按比例分配 / 平均分配

<!-- 平均分配 -->
<div style="display: flex;">
	<img src="https://www.zhihu.com/favicon.ico" style="width: 33.333333%;">
	<input type="" name="" style="width: 33.333333%;">
	<button style="width: 33.333333%;">submit</button>
</div>

adc5c400232866df506ff44f53d80279.png

就是通过百分比。

代替 float

<!-- 代替 float -->
<div style="display: flex;">
	<div style="margin-right: 1em;">
		<img src="https://www.zhihu.com/favicon.ico">
	</div>
	<div>
		<div>line 1 ...</div>
		<div>line 2 ...</div>
		<div>line 3 ...</div>
	</div>
</div>

a7ef3e29ffc8b3b0b1865289df7f83ff.png

这里 img 包了一层 div,如果去掉:

<div style="display: flex;">
	<img src="https://www.zhihu.com/favicon.ico" style="margin-right: 1em;">
	<div>
		<div>line 1 ...</div>
		<div>line 2 ...</div>
		<div>line 3 ...</div>
	</div>
</div>

12fc131bfec66e3bc4734fba610dba35.png

意外的高度对齐了,如果需要居中怎么办?

垂直居中(如果不用 flex 实现,相信很多人要到处找例子)

<!-- 垂直居中 -->
<div style="display: flex; align-items: center;">
	<img src="https://www.zhihu.com/favicon.ico" style="margin-right: 1em;">
	<div>
		<div>line 1 ...</div>
		<div>line 2 ...</div>
		<div>line 3 ...</div>
	</div>
</div>

a49dccc234e9f0d206ab3d8ba8ea1048.png

至于div中图片居中这种问题:

<!-- 垂直居中 2 -->
<div style="display: flex; align-items: center; border: 1px solid; width: 200px; height: 200px;">
	<img src="https://www.zhihu.com/favicon.ico">
</div>

3838df8538cc14494cafa3def7fc01fa.png

然后我们想图片水平居中:

<!-- 垂直居中 2 -->
<div style="display: flex; align-items: center; justify-content: center; border: 1px solid; width: 200px; height: 200px;">
	<img src="https://www.zhihu.com/favicon.ico">
</div>

381c763f6cca32a571347b62fdc931e4.png

顶部对齐 / 底部对齐

<!-- 顶部对齐 底部对齐 -->
<div style="display: flex; align-items: flex-start;">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
</div>

042274973798ceb6f26657cd1ca5125b.png
<!-- 顶部对齐 底部对齐 -->
<div style="display: flex; align-items: flex-end;">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
</div>

f30c83fc93eb804b59243d08612f1e12.png

垂直对齐总结起来就是 align-items 的设置

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

以上已经可以应付一般的需求,以下是更复杂的用法。

换行

<!-- 元素换行 -->
<div style="display: flex; align-items: flex-end;">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
</div>

15a12ae919eb0613b289640a3af7ae93.png

默认是不换行的

<!-- 元素换行 -->
<div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
</div>

a06ecf82a71e7a76c29012f1180ad37a.png

主要是 flex-wrap 属性

靠左 靠右 水平平均间隔排列

<!-- 水平平均分布 -->
<div style="display: flex; justify-content: space-around;">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
</div>

7718bbb3b4ee453a345cbef2b59b43d5.png
<!-- 靠右 -->
<div style="display: flex; justify-content: flex-end;">
	<img src="https://www.zhihu.com/favicon.ico">
	<img src="https://www.baidu.com/favicon.ico">
	<img src="https://www.sina.com/favicon.ico">
</div>

457ca162556b864951f307e36b8c6359.png

剩余空间

假如以下代码

<!-- 剩余空间 -->
<div style="display: flex;">
	<img src="https://www.zhihu.com/favicon.ico" style="width: 20%;">
	<div style="border: 1px solid;">
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
	</div>
	<img src="https://www.zhihu.com/favicon.ico" style="width: 20%;">
</div>

d687b2de866d4ec13b7934039e34af93.png

中间 div 会占据剩余空间,还有个 flex-grow 不展开。

同时看到中间 div 空间不足,被缩小了:

空间不足

<!-- 空间不足 -->
<div style="display: flex;">
	<img src="https://www.zhihu.com/favicon.ico" style="width: 20%;">
	<div style="flex-shrink: 0; border: 1px solid;">
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
	</div>
	<img src="https://www.zhihu.com/favicon.ico" style="width: 20%;">
</div>

a1f968f16cc54bb82fe70dc5e819bdcc.png

flex-shrink 设置空间不足的时候怎么处理。默认为1,即如果空间不足,该项目将缩小。


写完文章后发现,没那么复杂,相对于一般的编程知识,这算简单的。

实际需求 - 平均间隔分布与末行

<!-- 平均间隔分布与末行 -->
<div style="display: flex; flex-wrap: wrap; justify-content: space-between;">
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
</div>

c4dcd2af7801614350f3d98a199de6b7.png

我们看到,第二行不好看。

网上有一种解决方法如下:

<style type="text/css">
	.box::after {
		content: "";
		flex: auto;
	}
</style>
<!-- 平均间隔分布与末行 -->
<div class="box" style="display: flex; flex-wrap: wrap; justify-content: space-between;">
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
</div>

7f398e8be41a2875a03045a3695146e3.png

发现第二行和第一行间隔不同了,这个解决方法不好。

另外一种方法是,最后添加看不见的元素,测试如下:

<!-- 平均间隔分布与末行 -->
<div style="display: flex; flex-wrap: wrap; justify-content: space-between;">
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<button>button</button>
		<!-- 足够多的(占据一行 -1个 的) -->
		<button style="visibility: hidden;">button</button>
		<button style="visibility: hidden;">button</button>
		<button style="visibility: hidden;">button</button>
		<button style="visibility: hidden;">button</button>
		<button style="visibility: hidden;">button</button>
		<button style="visibility: hidden;">button</button>
		<button style="visibility: hidden;">button</button>
</div>

7acc5ea5a23e414a6f5e32937a7a76ef.png

现在看起来舒服了 ^^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值