具有两列的 Flexbox 行,为窄屏幕重新排序
Flexbox row with two columns, reordered for narrow screens
我正在尝试使用 flexbox 创建一个响应式布局,其中一对项目(两个和四个)需要堆叠,在大屏幕上紧挨着第三部分,但在窄屏幕上,顺序需要改变,使它们堆叠,一,二,三,四。
我有一个解决方案,但它不是 DRY,正如您在我复制了第四部分的片段中看到的那样。
是否可以在不重复的情况下使用 flexbox 实现此目的?
.container {
display: flex;
flex-wrap: wrap;
width: 100%;
border: 1px solid red;
}
.section {
border: 1px solid green;
flex-grow: 1;
}
.one, .two, .four {
width: 100%;
}
.sub-container {
display: inline-flex;
flex-direction: column;
width: 50%;
}
.mobile-only {
display: none;
}
@media (max-width: 600px) {
.container {
flex-direction: column;
}
.sub-container {
width: 100%;
}
.section {
width: 100%;
}
.desktop-only {
display: none;
}
.mobile-only {
display: block;
}
}
<div class="container">
<div class="section one">One</div>
<div class="sub-container">
<div class="section two">Two</div>
<div class="section four desktop-only">Four</div>
</div>
<div class="section three">Three</div>
<div class="section four mobile-only">Four</div>
</div>
Flexbox 不是为构建二维网格(列和行可以相交)而设计的。因此,为了让您的布局能够使用 flex 属性工作,您将不得不在那里进行破解。
这里有一个更完整的问题解释:
- Is it possible for flex items to align tightly to the items above them?
但是,使用 CSS 网格,您的布局简单易行。
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 50px;
grid-gap: 5px;
grid-template-areas: " one one "
" two three "
" four three ";
}
.one { grid-area: one; }
.two { grid-area: two; }
.three { grid-area: three; }
.four { grid-area: four; }
@media ( max-width: 600px ) {
.container {
grid-template-columns: 1fr;
grid-template-areas: " one "
" two "
" three"
" four ";
}
}
/* non-essential; just for demo */
.section {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
<div class="container">
<div class="section one">One</div>
<div class="section two">Two</div>
<div class="section three">Three</div>
<div class="section four">Four</div>
</div>
https://jsfiddle.net/9fyprm3u/
网格规范提供了多种设计网格的方法。在这种情况下,我使用了 grid-template-areas
属性,它允许您使用 ASCII 艺术来布置网格项目。
我正在尝试使用 flexbox 创建一个响应式布局,其中一对项目(两个和四个)需要堆叠,在大屏幕上紧挨着第三部分,但在窄屏幕上,顺序需要改变,使它们堆叠,一,二,三,四。
我有一个解决方案,但它不是 DRY,正如您在我复制了第四部分的片段中看到的那样。
是否可以在不重复的情况下使用 flexbox 实现此目的?
.container {
display: flex;
flex-wrap: wrap;
width: 100%;
border: 1px solid red;
}
.section {
border: 1px solid green;
flex-grow: 1;
}
.one, .two, .four {
width: 100%;
}
.sub-container {
display: inline-flex;
flex-direction: column;
width: 50%;
}
.mobile-only {
display: none;
}
@media (max-width: 600px) {
.container {
flex-direction: column;
}
.sub-container {
width: 100%;
}
.section {
width: 100%;
}
.desktop-only {
display: none;
}
.mobile-only {
display: block;
}
}
<div class="container">
<div class="section one">One</div>
<div class="sub-container">
<div class="section two">Two</div>
<div class="section four desktop-only">Four</div>
</div>
<div class="section three">Three</div>
<div class="section four mobile-only">Four</div>
</div>
Flexbox 不是为构建二维网格(列和行可以相交)而设计的。因此,为了让您的布局能够使用 flex 属性工作,您将不得不在那里进行破解。
这里有一个更完整的问题解释:
- Is it possible for flex items to align tightly to the items above them?
但是,使用 CSS 网格,您的布局简单易行。
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 50px;
grid-gap: 5px;
grid-template-areas: " one one "
" two three "
" four three ";
}
.one { grid-area: one; }
.two { grid-area: two; }
.three { grid-area: three; }
.four { grid-area: four; }
@media ( max-width: 600px ) {
.container {
grid-template-columns: 1fr;
grid-template-areas: " one "
" two "
" three"
" four ";
}
}
/* non-essential; just for demo */
.section {
border: 1px solid gray;
background-color: lightgreen;
display: flex;
align-items: center;
justify-content: center;
}
<div class="container">
<div class="section one">One</div>
<div class="section two">Two</div>
<div class="section three">Three</div>
<div class="section four">Four</div>
</div>
https://jsfiddle.net/9fyprm3u/
网格规范提供了多种设计网格的方法。在这种情况下,我使用了 grid-template-areas
属性,它允许您使用 ASCII 艺术来布置网格项目。