我正在设计一个可变屏幕宽度的嵌套flexbox。应该有三个方框,按以下方式排列:
<div class="wrapper1">
<div class="object obj1"></div>
<div class="wrapper2">
<div class="object obj2"></div>
<div class="object obj3"></div>
</div>
</div>
Wrapper1 100%宽,中心内容。
现在我想要以下场景。
我的问题是我找不到flex配置来执行此操作。到目前为止我尝试过的:
flex: 1 0 auto;
。就行中断而言,这是有效的,但是wrapper2不会缩小到其内容的宽度,因此框会失去中心并向左冲洗。flex: 0 1 <2 * object-width>;
。这使得wrapper2的行保持在一起太强烈,而是打破了wrapper1的行。 (针对第3种情况。)flex: 0 1 auto
或设置max-width: min-content;
,但这绝不会让wrapper2的行水平伸展。 (针对1号方案。)所以,如果有可能为我的设计实现解决方案的话,我会问你大师们。
这是我的JsFiddle。
答案 0 :(得分:1)
在flex-direction: column
的断点(最大宽度:600px)中使用.wrapper2
。我也在你的CSS中做了一些改变。
Stack Snippet
* {
box-sizing: border-box;
}
body {
margin: 0;
}
.wrapper1 {
display: flex;
flex-flow: row wrap;
justify-content: center;
border: 2px solid blue;
}
.wrapper2 {
display: flex;
flex-flow: row wrap;
}
.object {
width: 200px;
height: 100px;
}
.obj1 {
background-color: #aaccaa;
}
.obj2 {
background-color: #ccaaaa;
}
.obj3 {
background-color: #aaaacc;
}
@media (max-width:600px) {
.wrapper2 {
flex-direction: column;
}
}
@media (max-width:400px) {}
<div class="wrapper1">
<div class="object obj1"></div>
<div class="wrapper2">
<div class="object obj2"></div>
<div class="object obj3"></div>
</div>
</div>
<强> Updated Fiddle 强>
答案 1 :(得分:1)
你需要一个媒体查询(或脚本)来正确地完成它,原因是当孩子们不适合他们父母的宽度时,它是外部的兄弟姐妹,它会在内在的之前包裹,这是正常的包装顺序,无论是否使用Flexbox。
因为我们知道每个项目的宽度,所以加上它们加上边界,我们得到一个608px +体边距的断点,我在这里重置为0,因为它们可能在浏览器之间有所不同。
然后,在断点处,您只需例如将flex: 1 0 auto
更改为flex: 0 0 auto
,它将正确包装和居中。
Stack snippet
body {
margin: 0;
}
.wrapper1 {
display: flex;
flex-flow: row wrap;
justify-content: center;
border: 2px solid blue;
}
.wrapper2 {
display: flex;
flex-flow: row wrap;
flex: 1 0 auto;
min-width: 200px;
max-width: 400px;
border: 2px solid red;
}
.object {
flex: 0 0 200px;
height: 100px;
}
.obj1 {
background-color: #aaccaa;
}
.obj2 {
background-color: #ccaaaa;
}
.obj3 {
background-color: #aaaacc;
}
@media (max-width: 608px) {
.wrapper2 {
flex: 0 0 auto;
}
}
<div class="wrapper1">
<div class="object obj1"></div>
<div class="wrapper2">
<div class="object obj2"></div>
<div class="object obj3"></div>
</div>
</div>
答案 2 :(得分:0)
刚刚遇到同样的问题。我有3个内部div,我希望中间的第一个包裹。
使用float:right
和float:left
然后使用float:left
或float:right
作为中间div来解决此问题。
下行是你不能使用flex-grow等,但我的问题并不需要。