我的印象是可以为弹性项目/子项添加边距,并且 Flexbox 应该自动考虑到这一点并计算项目之间的正确间距。
我似乎无法让这个工作如我所愿。
在这里摆弄:https://jsfiddle.net/dba5ehcw/1/
.flex-item{
border: 1px solid blue;
box-sizing: border-box;
height: 160px;
width: 50%;
}
因此,目前每个弹性项目都是容器宽度的一半,并且它们可以很好地彼此相邻。
我希望能够为弹性项目添加 1em 的边距,以便给它们一些呼吸空间,但这样做时,它们会变得大于 50%,并且不再彼此相邻堆叠同一条线,因为它们太宽了。
有没有办法在弹性项目上使用边距,并让弹性盒容器考虑到这一点并相应地调整(减少)它们的宽度?
有多种方法可以做到这一点:
使用
calc
:
.flex-item {
width: calc(50% - 2em);
margin: 1em;
}
.flex-container {
border: 1px solid red;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
width: 320px;
}
.flex-item {
border: 1px solid blue;
box-sizing: border-box;
height: calc(160px - 2em);
width: calc(50% - 2em);
margin: 1em;
}
<div class="flex-container">
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
</div>
使用嵌套框:
.flex-item {
width: 50%;
display: flex;
}
.flex-item > div {
border: 1px solid blue;
flex: 1;
margin: 1em;
}
.flex-container {
border: 1px solid red;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
width: 320px;
}
.flex-item {
height: 160px;
width: 50%;
display: flex;
}
.flex-item > div {
border: 1px solid blue;
flex: 1;
margin: 1em;
}
<div class="flex-container">
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
</div>
将每一行放入 nowrap 容器中,并使用正的弹性收缩因子
.row {
display: flex;
}
.flex-item {
width: 50%;
margin: 1em;
}
.flex-container {
border: 1px solid red;
width: 320px;
}
.row {
height: 160px;
display: flex;
}
.flex-item {
border: 1px solid blue;
width: 50%;
margin: 1em;
}
<div class="flex-container">
<div class="row">
<div class="flex-item"></div>
<div class="flex-item"></div>
</div>
<div class="row">
<div class="flex-item"></div>
<div class="flex-item"></div>
</div>
<div class="row">
<div class="flex-item"></div>
<div class="flex-item"></div>
</div>
</div>
请勿使用
width
。相反,在正确的位置强制换行,并使用 flex: 1
使元素增长以填充剩余空间。
.flex-item {
flex: 1;
}
.line-break {
width: 100%
}
.flex-container {
border: 1px solid red;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
width: 320px;
}
.flex-item {
border: 1px solid blue;
box-sizing: border-box;
height: calc(160px - 2em);
flex: 1;
margin: 1em;
}
.line-break {
width: 100%;
}
<div class="flex-container">
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="line-break"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="line-break"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
</div>
您需要使用填充来完成此操作 - 在
border-box
模式下,填充不会使容器大于指定的宽度 - 不是边距,以及嵌套的 flex
div。这就是所有基于 Flexbox 的网格系统的工作方式。代码如下:
.flex-container{
border: 1px solid red;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
width: 320px;
}
.flex-item{
padding:1em;
box-sizing: border-box;
height: 160px;
width: 50%;
display:flex;
}
.flex-item>div {
border: 1px solid blue;
flex: 1 1 auto;
}
<div class="flex-container">
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
<div class="flex-item"><div></div></div>
</div>
不要使用边距,而是尝试在弹性容器上添加间隙:
.flex-container {
display: flex;
gap: 1em;
}
flex-item {
width: 50%;
}
试试这个:-
.flex-container {
border: 1px solid red;
box-sizing: border-box;
display: flex;
flex-wrap: wrap;
width: 320px;
}
.flex-item {
justify-content: space-around;
margin: 1%;
background: red;
border: 1px solid blue;
box-sizing: border-box;
height: 160px;
width: 48%;
}
<div class="flex-container">
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
<div class="flex-item"></div>
</div>
根据我的理解,我相信我正在尝试实现同样的目标,此外,当视口变得足够小时(在手机/平板电脑上查看时),我希望两个盒子堆叠在一起。
出于某种原因,我认为这会更容易,因为我在观看的 Bootstrap 教程视频中看到了类似的内容,但我认为他使用的是
row
和 col
类,以及 g
gutter 类,而不是 Flex。
无论如何,HTML:
<div class="d-flex flex-wrap flex-half-screen-responsive">
<div class="col-lg-6">
Lorem Ipsum
</div>
<div class="col-lg-6">
Lorem Ipsum
</div>
</div>
CSS:
.flex-half-screen-responsive {
margin: -0.5em;
}
.flex-half-screen-responsive > * {
flex: 1 1 48%;
margin: 0.5em;
}
我不喜欢如何指定硬编码的 48% 值,但它似乎按照我想要的方式工作,所以无论如何;已经在这上面花了太多时间了,哈哈。无论如何,我希望这可以帮助那些寻找相同行为的人。