Flexbox:两个元素在 flex-direction: row 上彼此重叠

新手上路,请多包涵

我正在努力实现以下目标:


我的第一次尝试是使用辅助 div(绿色):

JSFiddle

我可以在这里做的是使用 JavaScript 将 puple 和 orange 元素移出移动屏幕上的助手。 但是必须有一个简单的CSS方式。


我的第二次尝试是删除助手并构建移动布局:

JSFiddle


有没有办法在 flex-direction: row 两个元素放在一起? ( 第二次尝试

原文由 Marc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.3k
2 个回答

您可以使用 Flexbox 来执行此操作,但您需要在弹性容器上使用固定的 height 。这是 小提琴

基本上你使用 flex-wrap: wrapflex-direction: column 并让第一个项目采用 100% 的高度并设置 width 的百分比。然后你用媒体查询和高度改变顺序。

 * {
  box-sizing: border-box;
}
main,
div {
  display: flex;
  padding: 1rem;
}
.desktop {
  flex-direction: column;
  flex-wrap: wrap;
  height: 400px;
  width: 100%;
}
div {
  flex: 1;
  width: 30%;
}
[orange] {
  background-color: #FFAD77;
  flex: 0 0 70%;
}
[yellow] {
  background-color: #FFE377;
  flex: 0 0 100%;
  width: 70%;
}
[purple] {
  background-color: #FF77C8;
}
@media(max-width: 480px) {
  .desktop div {
    flex: 1;
    width: 100%;
  }
  div[orange] {
    order: -1;
    flex: 2;
  }
  div[yellow] {
    flex: 5;
  }
  div[purple] {
    flex: 1;
  }
}
 <div class="desktop">
  <div yellow>lorem</div>
  <div orange>lorem</div>
  <div purple>lorem</div>
</div>

原文由 Nenad Vracar 发布,翻译遵循 CC BY-SA 3.0 许可协议

问题是,如果您使用辅助包装器,那么您将只能重新排序其中的项目,但不能将它们与它们的叔叔混合。

如果您不使用辅助包装器,则需要列布局。正如 Nenad Vracar 所建议的,唯一被广泛支持的打破列的方法是硬编码容器的高度。但有时你不能这样做。

我会建议两个更好的选择,但它们的支持很差(基本上是 Firefox):

  • 使用桌面辅助包装器并在移动设备中使用 display: contents 摆脱它
   document.querySelector('button').addEventListener('click', function() {
    document.querySelector('main').classList.toggle('mobile');
  });
   main {
    display: flex;
    width: 600px;
    height: 400px;
  }
  .wrapper {
    display: flex;
    flex-direction: column;
  }
  div {
    flex: 1;
  }
  [data-color=orange] {
    background-color: #FFAD77;
  }
  [data-color=yellow] {
    background-color: #FFE377;
  }
  [data-color=purple] {
    background-color: #FF77C8;
    order: 3;
  }
  main.mobile {
    flex-direction: column;
  }
  main.mobile .wrapper {
    display: contents;
  }
  main.mobile [data-color=orange] {
    order: -1;
  }
   <main>
    <div data-color="yellow"></div>
    <div class="wrapper">
      <div data-color="orange"></div>
      <div data-color="purple"></div>
    </div>
  </main>
  <button>toggleLayout</button>
  • 使用强制换行符
   document.querySelector('button').addEventListener('click', function() {
    document.querySelector('main').classList.toggle('mobile');
  });
   main {
    display: flex;
    flex-flow: column wrap;
    width: 600px;
    height: 400px;
  }
  div {
    flex: 1;
  }
  [data-color=orange] {
    background-color: #FFAD77;
    page-break-after: always;
    break-after: always;
  }
  [data-color=yellow] {
    background-color: #FFE377;
  }
  [data-color=purple] {
    background-color: #FF77C8;
    order: 3;
  }
  main.mobile {
    flex-wrap: nowrap;
  }
  main.mobile [data-color=orange] {
    order: -1;
  }
   <main>
    <div data-color="yellow"></div>
    <div data-color="orange"></div>
    <div data-color="purple"></div>
  </main>
  <button>toggleLayout</button>

原文由 Oriol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题