使用Flexbox CSS的左列和右列堆叠
在大屏幕上,我想在左侧有一个列,另一列在右侧有2个堆叠框。
在小屏幕上,这些列应堆放到单列中。但是,盒子的顺序应为2,1,3。
这是一个插图:
我已经将Flex容器设置为flex-direction:column
and flex-wrap:wrap
,和方框1至flex-Basis:100%
,但这并不能使第二个项目包裹到下一列。
如何在Flexbox中实现此布局?
这是我到目前为止的演示:
.container {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
.cell {
background: #ccc;
border: solid 3px black;
width: 50%;
}
.cell-1 {
flex-basis: 100%;
}
@media (max-width: 500px) {
.cell {
width: 100%;
}
.cell-1 {
order: 2;
}
.cell-2 {
order: 1;
}
.cell-3 {
order: 3;
}
}
<h1>Vertical Boxes</h1>
<p>Goal: Have one box on the left, and two boxes on the right that are stacked. All without nesting, so that the order of the boxes can be changed on smaller screen sizes.</p>
<div class="container">
<div class="cell cell-1">
<h2>One</h2>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure. Lorem ipsum dolor sit
amet, consectetur adipisicing elit. Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure. Lorem ipsum dolor sit amet, consectetur
adipisicing elit. Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure. Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure.
</div>
<div class="cell cell-2">
<h2>Two</h2>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste mollitia temporibus id sint illum doloremque pariatur nulla vel soluta, nostrum vitae, suscipit ea natus sed eaque in velit deserunt deleniti!
</div>
<div class="cell cell-3">
<h2>Three</h2>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit, architecto perferendis voluptatum accusantium est ipsam fugit, laudantium fugiat nostrum consectetur earum. Asperiores, similique deleniti nobis nemo error, iste iure architecto.
</div>
</div>
On large screens, I'd like to have a column on the left, and another column on the right that has 2 stacked boxes.
On small screens, these columns should stack into a single column. However, the order of the boxes should be 2,1,3.
Here is an illustration:
I've set the flex container with flex-direction: column
and flex-wrap: wrap
, and box 1 to flex-basis: 100%
, but that doesn't make the second two items wrap to the next column.
How can this layout be achieved in flexbox?
Here is a demo of where I'm at so far:
.container {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
.cell {
background: #ccc;
border: solid 3px black;
width: 50%;
}
.cell-1 {
flex-basis: 100%;
}
@media (max-width: 500px) {
.cell {
width: 100%;
}
.cell-1 {
order: 2;
}
.cell-2 {
order: 1;
}
.cell-3 {
order: 3;
}
}
<h1>Vertical Boxes</h1>
<p>Goal: Have one box on the left, and two boxes on the right that are stacked. All without nesting, so that the order of the boxes can be changed on smaller screen sizes.</p>
<div class="container">
<div class="cell cell-1">
<h2>One</h2>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure. Lorem ipsum dolor sit
amet, consectetur adipisicing elit. Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure. Lorem ipsum dolor sit amet, consectetur
adipisicing elit. Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure. Lorem ipsum dolor sit amet, consectetur adipisicing elit.
Iusto pariatur rerum, illum accusantium cupiditate ipsam, eaque quae fugit cum assumenda ad. Modi, excepturi. Assumenda, nobis, consequatur? Aliquid repellendus quis, iure.
</div>
<div class="cell cell-2">
<h2>Two</h2>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste mollitia temporibus id sint illum doloremque pariatur nulla vel soluta, nostrum vitae, suscipit ea natus sed eaque in velit deserunt deleniti!
</div>
<div class="cell cell-3">
<h2>Three</h2>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit, architecto perferendis voluptatum accusantium est ipsam fugit, laudantium fugiat nostrum consectetur earum. Asperiores, similique deleniti nobis nemo error, iste iure architecto.
</div>
</div>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看起来您快到了。另外只有两个步骤:
没有定义的高度,一些浏览器可能不知道在哪里包装。尝试以下操作:
修订的codepen
It looks like you were almost there. Just two more steps:
Without a defined height some browsers may not know where to wrap. Try this:
revised codepen
首先,我们创建一个容器
.box
并设置宽度和高度。老实说,这仅是针对演示,我设置了80VW和80VH。并且该容器应为具有列方向的Flex元素flex-flow:column wrap;
。我们设置了最大块的最大宽度(.boxItem- large {max Width:80%;高度:100%;}
)100%的父母身高。它是为了在新行/列上包装其他元素。因此,来自另一列的元素应填充所有空间,因此我们设置.boxItem--small {max Width:20%;身高:自动; }
- 是的,80% + 20%== 100%,该数学。让我们在低宽度屏幕上更改行为。@media屏幕和(最大宽度:600px){.box {flex-flow:column nowrap; }}
我们不需要包装元素,所以只需更改即可。之后,我们希望每个boxItem
元素继承父母的宽度。.boxItem {width:100%;最大宽度:100%; }
最大宽度:100%;
级联,我们不想关心某些旧规则,例如.boxItem-large-large {max-width:80%; }
和.boxItem--small {max Width:20%; }
。并设置一些订单更改。First we create a container
.Box
and set width and height. Honestly, it is just for demo i set 80vw and 80vh. And that container should be a flex element with column orientationflex-flow: column wrap;
. And we set the max-width of the largest blocks (.BoxItem--large { max-width: 80%; height: 100%; }
) 100% of parents height. It is for wrapping the other elements on the new line/column. So elements from another column should fill all space, so we set.BoxItem--small { max-width: 20%; height: auto; }
- yes, 80% + 20% == 100%, that the math. lets change behaviour on the low-width screens.@media screen and (max-width: 600px) { .Box { flex-flow: column nowrap; } }
we dont need to wrap elements, so just change that. After that we want everyBoxItem
element to inherit parents width..BoxItem { width: 100%; max-width: 100%; }
max-width: 100%;
for cascading, we dont want care about some old rules like.BoxItem--large { max-width: 80%; }
and.BoxItem--small { max-width: 20%; }
. And set some order changes.