【问题标题】:Order cols in two different rows with Flexbox使用 Flexbox 对两个不同行中的列进行排序
【发布时间】:2015-10-20 23:42:28
【问题描述】:

我需要使用 Flexbox CSS 订购放置在两行不同行中的 cols,但我只能为一行订购。我需要在两行之间有一个混合顺序。

现在我必须订购并显示 row1 中的 cols 以及 order 并显示 row2 中的 cols,但我想将它们混合并订购它们。 (桌面视图中的顺序没问题,但移动视图需要这个。这就是为什么我需要从两行完全重新排序)。

HTML:

<div class="container">
    <div class="row mobile-order">
        <div class="col-md-4 box6">1</div>
        <div class="col-md-4 box5">2</div>
        <div class="col-md-4 box4">3</div>
    </div>
    <div class="row mobile-order">
        <div class="col-md-4 box1">4</div>
        <div class="col-md-4 box2">5</div>
        <div class="col-md-4 box3">6</div>
    </div>
</div>

CSS:

/* CSS used here will be applied after bootstrap.css */
.mobile-order {
    display: flex;
    flex-direction: column;  
}
.test1 {
    order: 1;
}
.test2 {
    order: 2;
    background: #ccc;
}
.box1 {
    order: 1;
}
.box2 {
    order: 3;
}
.box3 {
    order: 5;
}
.box4 {
    order: 6;
}
.box5 {
    order: 4;
}
.box6 {
    order: 2;
}

Bootply test page

这就是我在桌面和移动设备上需要它的方式:

桌面:

Row1<br><div class="col-md-4 box6">1</div>  |   <div class="col-md-4 box5">2</div>   |   <div class="col-md-4 box4">3</div><br><br>

Row2<br>
<div class="col-md-4 box1">4</div>    |   <div class="col-md-4 box2">5</div>   |   <div class="col-md-4 box3">6</div>

手机:

<div class="col-md-4 box1">4</div><br>
<div class="col-md-4 box6">1</div><br>
<div class="col-md-4 box2">5</div><br>
<div class="col-md-4 box5">2</div><br>
<div class="col-md-4 box3">6</div><br>
<div class="col-md-4 box4">3</div>

【问题讨论】:

  • 请务必在您的问题中发布您的代码。
  • 您不能混合不共享父元素的元素的顺序......所以我不清楚您要做什么。
  • 听起来你应该为此使用媒体查询。
  • 这就是我想做的@Paulie_D。我知道我不能,但我认为无论如何有人会想出一些棘手的解决方案。
  • 我对这两种布局应该是什么样子感到困惑......桌面和移动视图。你能提供吗?

标签: css flexbox


【解决方案1】:

CSS 显示模块 Level 3 引入display: contents

元素本身不会生成任何框,但它的子元素和 伪元素仍然照常生成盒子。出于以下目的 框生成和布局,必须将元素视为具有 在文档中被其子元素和伪元素替换 树。

您可以使用它来“忽略”行并显示内部弹性项目,就好像它们属于同一个弹性容器一样。然后你就可以随意混合它们了。

.mobile-order {
  display: flex;
  flex-direction: column;
}
.row {
  display: contents;
}
.test2 > div {
  background: #ccc;
}
.box1 { order: 1; }
.box2 { order: 2; }
.box3 { order: 3; }
.box4 { order: 4; }
.box5 { order: 5; }
.box6 { order: 6; }
<div class="container mobile-order">
  <div class="row test2 mobile-order">
    <div class="col-md-4 box1">1 (row 1)</div>
    <div class="col-md-4 box5">5 (row 1)</div>
    <div class="col-md-4 box2">2 (row 1)</div>
  </div>
  <div class="row test1 mobile-order">
    <div class="col-md-4 box3">3 (row 2)</div>
    <div class="col-md-4 box6">6 (row 2)</div>
    <div class="col-md-4 box4">4 (row 2)</div>
  </div>
</div>

不过,它尚未得到广泛支持。

【讨论】:

  • 谢谢,但是我在哪里可以找到支持的浏览器呢? @Oriol
  • @user2986959 根据MDN,目前只支持Firefox 37+
  • 好的,如果我不想添加 Jquery,这是唯一的选择吗?
  • 好吧,我想您也可以将元素放置在绝对定位的所需位置。但是布局一点都不灵活。
  • 赞成向我介绍新的 CSS 功能。我喜欢这些年来我仍在学习新事物:)
【解决方案2】:

如果使用单个 是一个选项,带有包装的基本 flexbox 将通过媒体查询来处理这个问题。

[class*="box"] {
  border: 1px solid grey;
}
.mobile-order {
  display: flex;
  flex-wrap: wrap;
}
@media screen and (max-width: 992px) {
  .mobile-order {
    display: flex;
    flex-direction: column;
  }
  .test1 {
    order: 1;
  }
  .test2 {
    order: 2;
    background: #ccc;
  }
  .box1 {
    order: 1;
  }
  .box2 {
    order: 3;
  }
  .box3 {
    order: 5;
  }
  .box4 {
    order: 6;
  }
  .box5 {
    order: 4;
  }
  .box6 {
    order: 2;
  }
}
<div class="container">
  <div class="row mobile-order">
    <div class="col-md-4 box6">1</div>
    <div class="col-md-4 box5">2</div>
    <div class="col-md-4 box4">3</div>
    <div class="col-md-4 box1">4</div>
    <div class="col-md-4 box2">5</div>
    <div class="col-md-4 box3">6</div>
  </div>
</div>

Codepen.io Demo

【讨论】:

  • 是的,谢谢@Paulie_D。那是我最初的计划,但在我的 Episerver 解决方案中,我需要使用两行。这就是为什么我有这个问题。
猜你喜欢
  • 2020-06-18
  • 2020-11-06
  • 2012-10-20
  • 2019-04-28
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多