推荐看一下阮一峰老师的flex布局博客【Flex 布局教程:语法篇】(https://www.ruanyifeng.com/blog/2015/07/flex-grammar.html#),讲的非常清晰。
一、多行布局大小相同的子盒子技巧
使用弹性布局实现多行均匀布局时,如若子盒子数量不能被每行规定的子盒子数量整除时,该如何实现最后一行的子盒子和其他行的子盒子垂直对齐呢?
如下代码:
<template>
<div class="container">
<div class="item" v-for="item, index in 5" :key="index"></div>
</div>
</template>
<style lang="scss" scoped>
.container {
width: 1000px;
height: 400px;
background-color: pink;
margin: 100px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.item {
width: 30%;
height: 100px;
background-color: gray;
}
}
</style>
可以看到最后的一行只有两个子盒子,它们根据jusctify-content: space-between
的规则贴在父盒子的两边,而业务需求是:最后一行的子元素必须按顺序和其他的子元素垂直对齐,那么如何在不影响其他行布局的前提下实现最后一行的子盒子按顺序和其他行的子盒子垂直对齐呢?我们可以使用伪元素+元素不可见来实现。
我们给父盒子增加一个宽度和子盒子一样宽的伪元素:
.container::after {
content: '';
width: 30%;
visibility: hidden;
}
visibility:hidden实现了将元素隐藏,但是元素在网页中该占的位置还是占着的。
这样就成功完成了需求:
二、flex-flow
flex-flow
属性时flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
。
这里我们在上一小节的基础上,使用flex-flow
代替flex-warp
来测试一下flex-flow
属性。
.container {
width: 1000px;
height: 400px;
background-color: pink;
margin: 100px;
display: flex;
justify-content: space-between;
flex-flow: row wrap; // 得到的效果是一样的
.item {
width: 30%;
height: 100px;
background-color: gray;
}
}
得到了相同的结果。
三、flex-start | flex-end
center | space-between | space-around
justify-content
的这三个属性值的使用早已游刃有余了,这里我记录一下较为陌生的两个属性:
flex-start(默认值) | flex-end
flex-start
是弹性布局的默认水平对齐方式,也就是左对齐,显然,flex-end
就是右对齐了。
四、align-items属性进阶
和水平对齐方式一样的道理,垂直对齐方式align-item
也有flex-start
和flex-end
,不过它们分别代表上对齐和下对齐,下对齐常用于解决flex单行布局由于子盒子高度不同而导致子盒子下边界不在同一水平线的问题。如下
<template>
<div class="container">
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>
</div>
</template>
<style lang="scss" scoped>
.container {
width: 1000px;
height: 400px;
background-color: pink;
margin: 100px;
display: flex;
justify-content: space-between;
// align-items: flex-end;
div {
width: 30%;
background-color: gray;
}
.item1 {
height: 100px;
}
.item2 {
height: 200px;
}
.item3 {
height: 300px;
}
}
</style>
给父盒子添加align-items: flex-end
后,实现了子盒子下边界在同一水平线上。如下:
align-items: flex-start | flex-end | center | baseline | stretch(默认);
值得注意的是弹性布局的垂直对齐方式默认并是上对齐,而是stretch
,那么stretch
是什么效果呢?stretch
有延伸、张开、弹性的的意思,在弹性布局中就表示如果父盒子没有给高度并且使用了flex布局,那么父盒子的高度将由子盒子决定,根据子盒子的高度来自动撑开父盒子。
这里再了解一下属性基线对齐:
baseline
: 子盒子与第一行文字的基线对齐。
css中的基线(baseline0)并不是汉字文字的下端沿,而是英文字母x的下端沿,如下图:
五、子盒子属性flex: none | [<‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’>]
阮一峰老师的博客讲解的非常详细:Flex 布局教程:语法篇