【问题标题】:Responsive flexbox layout wrap issue响应式 flexbox 布局换行问题
【发布时间】:2017-06-07 10:33:57
【问题描述】:

下面的代码说明了这两种不同的布局。我的问题是我无法在不更改标记的情况下复制这些布局。我想知道是否有一些奇特的 flexbox 方式我可以在只使用一个 html 方案的情况下完成这一点。注意:容器需要具有动态高度。只要实现了所需的布局,解决方案就不必使用 flexbox。

main {
  width: 750px;
  max-width: 100%;
  margin: auto;
  border: solid 1px black;
  display: flex;
  flex-wrap: wrap;
}



.a {
  background: red;
  width: 40%;
}
.b {
  background: blue;
  width: 60%;
}
.c {
  background: green;
}


.a-mobile {
  background: red;
  width: 40%;
}
.b-mobile {
  background: blue;
  width: 60%;
}
.c-mobile {
  background: green;
  width: 100%;
}
<h2>Desktop</h2>
<main>
  <div class="a">a</div>
  <div class="b">b
   <div class="c">c</div>
  </div>
</main>

<h2>Mobile</h2>
<main>
  <div class="a-mobile">a-mobile</div>
  <div class="b-mobile">b-mobile</div>
  <div class="c-mobile">c-mobile</div>
</main>

【问题讨论】:

  • 答案是肯定的,如果你可以在容器上设置一个高度。这是一个选项吗?
  • 有了浮动和弹性盒,这在不需要高度的情况下是可能的。
  • @Michael_B 不幸的是,容器上需要一个动态高度。
  • 那么,如果不更改标记,目前无法实现纯 flex 解决方案。
  • @AndreiGheorghiu 这是个好消息,你能给我举个例子吗?

标签: css flexbox


【解决方案1】:

display:grid 对于这种布局很有用:

但是这个仍然是实验性的并且(2020)可以在few browsers进行测试,另见http://caniuse.com/#search=grid

教程等https://css-tricks.com/snippets/css/complete-guide-grid/

main {
  display: grid;
  grid-template-columns: 30% auto;
}
.a {
  background: red;
  grid-row-end: span 2
}
.b,
.c {
  background: green;
}
.c {
  background: lightblue
}
@media screen and (max-width: 700px) {/* value setted for the demo */
  .a {
    grid-row-end: span 1/* reset optionnal in this very case */
  }
  .c {
    grid-column-end: span 2
  }
}
<main>
  <div class="a"> break point set at 700px for demo</div>
  <div class="b"> i don't move much myself :)</div>
  <div class="c"> see in full page to see me aside the red box and below the green one</div>
</main>

codepen to play with

【讨论】:

  • CSS 网格很棒,但是在我当前的项目中,我无法触摸它,直到它得到更好的支持。一天……
  • @anthony-dandrea 不幸的是,使用 flex 或 else 方法,您需要为列布局设置一个高度 :( float example codepen.io/gc-nomade/pen/ZLKmLm 我相信其他人会想出 flex 方法 + height.. 请注意,javascript 可以帮助您整理出需要即时设置的高度。
【解决方案2】:

这是我在 cmets 中描述的float-flexbox 方法。不是特别喜欢它,但它完全符合您的要求。

它是 hacky 并且从我的 POV 来看,它与 Bootstrap 3 的 .clearfix::before|after hack - {display:table; content: " ";} 属于同一类别 - 这是一个实际的解决方案布局问题,直到一个更好、更干净的有更好的浏览器支持并使其过时为止。

main {
  width: 750px;
  max-width: 100%;
  margin: auto;
  border: solid 1px black;
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 1em;
  color: white;
}
.a {
  background: red;
  flex-basis: 40%;
}
.b {
  background: blue;
  flex-basis: 60%;
}
.c {
  background: green;
  flex-basis: 100%;
}

@media (min-width: 800px) {
  main {
    display: block;
    overflow: hidden;
  }
  .a {
    float: left;
    min-width: 40%;
  }
  .b,.c {
    padding-left: 40%;
  }
  .a,.c {
    padding-bottom: 32768px;
    margin-bottom: -32768px;
    }
}
<main>
<div class="a">a<br />a<br />a<br/>a</div>
  <div class="b">b</div>
  <div class="c">c</div>
</main>
<main>
<div class="a">a</div>
  <div class="b">b<br />b<br />b<br/>b</div>
  <div class="c">c</div>
</main>
<main>
<div class="a">a</div>
  <div class="b">b</div>
  <div class="c">c<br />c<br />c<br/>c</div>
</main>

【讨论】:

  • 这太棒了!有点 hacky 是的,但没有我预期的那么糟糕。感谢您的来信。
【解决方案3】:

另一种解决方案,它独立于弹性盒子,不需要固定高度。 Flexbox 在适应二维布局方面做得不好!

html {
  height: 100%;
}

body {
  height: 100%;
}

main {
  width: 750px;
  max-width: 100%;
  margin: auto;
  border: solid 1px black;
  height: 100%;
}

.a {
  background: red;
  width: 40%;
  height: 100%;
  float: left;
}

.b {
  background: blue;
  width: 60%;
  height: 50%;
  float: left;
}

.c {
  background: green;
  width: 60%;
  height: 50%;
  float: left;
}

@media (max-width: 800px) {
   .a {
    width: 40%;
     height: 50%;
  }

  .c {
    width: 100%;
  } 
}
<h2>Desktop and Mobile</h2>
<main>
  <div class="a">a</div>
  <div class="b">b</div>
   <div class="c">c</div>
</main>

【讨论】:

  • 看来这确实依赖于设定的高度。此示例调整为 100% 的身体高度。没有它,它就会崩溃。
  • 啊...你是对的...我没有那样想。我会尝试一下,看看我是否能想出更好的解决方案!
猜你喜欢
  • 2018-03-19
  • 2021-06-12
  • 2019-10-13
  • 2022-08-04
  • 2017-11-05
  • 2022-01-12
  • 2019-08-24
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多