【问题标题】:Flexbox: Two elements on top of each other in flex-direction: row [duplicate]Flexbox:两个元素在 flex-direction 上彼此重叠:行 [重复]
【发布时间】:2016-12-08 07:56:01
【问题描述】:

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


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

JSFiddle

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


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

JSFiddle


有没有办法在flex-direction: row 中将两个元素放在一起? (second attempt)

【问题讨论】:

  • 不,不是,这就是我们有列布局的原因。 CSS 可以通过使用display:contents 的帮助器使用 来做到这一点,但它仅受FF 支持。
  • 你有什么理由必须使用 flexbox 吗?可以通过传统定位来完成。
  • 我认为响应式 css 和传统定位非常适合您需要做的事情。
  • @Paulie_D:好的,之前不知道display: contents。绝对值得一看。 @4castle:我实际上不必使用 flexbox。我最近经常使用它,并且直觉地尝试用它来做到这一点。 @Taylor:谢谢,我可能有点太专注于那些闪亮的 flexbox 东西了 :)

标签: css flexbox


【解决方案1】:

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

基本上,您将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>

【讨论】:

  • 这不能回答问题.. “有没有办法让两个元素在 flex-direction 上相互叠放:row
  • 是的,如果它们的宽度之和大于父级和父级的宽度之和具有 flex-wrap: wrap
  • 我想这是你可以用行jsfiddle.net/89z21rq3/10
  • 有时我可能不得不接受不作为答案。由于有很好的选择,我愿意在这种情况下这样做:) 感谢您的努力。
【解决方案2】:

不,但替代方案并不致命。如果您使用绝对定位,您将可以更好地控制不同屏幕尺寸下的布局。

function toggleLayout() {
  document.querySelector('main').classList.toggle('mobile');
}
main {
  position: relative;
  width: 600px;
  height: 400px;
}

main div {
  position: absolute;
  top: 0; bottom: 0;
  left: 0; right: 0;
}

main.mobile div {
  position: static;
  width: 100%;
  height: 33.3%;
}

[orange] {
  background-color: #FFAD77;
  bottom: 40%;
  left: 66.6%;
}

[yellow] {
  background-color: #FFE377;
  right: 33.3%;
}

[purple] {
  background-color: #FF77C8;
  top: 60%;
  left: 66.6%;
}
<main>
  <div orange></div>
  <div yellow></div>
  <div purple></div>
</main>
<button onclick="toggleLayout()">toggleLayout</button>

【讨论】:

    【解决方案3】:

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

    如果您不使用辅助包装器,则需要列布局。正如 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>

    【讨论】:

    • 这很好,但正如你所说的那样,这可能是未来可能的解决方案:) 谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 2018-09-07
    • 2017-08-03
    • 1970-01-01
    • 2023-04-03
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多