一般人看不惯教程,教程大多是互相抄的,教程有错漏。
所以这里给出实用的例子,不停完善中(比较简单,感觉不必要了)。
Hello World
<!-- hello world -->
<div style="display: flex;">
<img src="https://www.zhihu.com/favicon.ico">
<input type="" name="">
<button>submit</button>
</div>
会发现高度对齐了,帮了忙。如何我们换成更大的图片,会发现还是对齐。
按比例分配 / 平均分配
<!-- 平均分配 -->
<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>
就是通过百分比。
代替 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>
这里 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>
意外的高度对齐了,如果需要居中怎么办?
垂直居中(如果不用 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>
至于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>
然后我们想图片水平居中:
<!-- 垂直居中 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>
顶部对齐 / 底部对齐
<!-- 顶部对齐 底部对齐 -->
<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>
<!-- 顶部对齐 底部对齐 -->
<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>
垂直对齐总结起来就是 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>
默认是不换行的
<!-- 元素换行 -->
<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>
主要是 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>
<!-- 靠右 -->
<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>
剩余空间
假如以下代码
<!-- 剩余空间 -->
<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>
中间 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>
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>
我们看到,第二行不好看。
网上有一种解决方法如下:
<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>
发现第二行和第一行间隔不同了,这个解决方法不好。
另外一种方法是,最后添加看不见的元素,测试如下:
<!-- 平均间隔分布与末行 -->
<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>
现在看起来舒服了 ^^