CSS FlexBox |在移动设备中重新排序元素

时间:2019-04-14 19:31:20

标签: html css flexbox css-grid

我正在尝试学习CSS Flexbox并发现了障碍。

我的内容在桌面屏幕尺寸的左右显示,对于移动设备,我有flex-direction: column

查看视觉风箱:

桌面: enter image description here

移动电话: enter image description here

这是完成此操作的代码:

 <div class="container">
    <div class="box box1">
      <div class="a">a</div>
      <div class="b">b</div>
    </div>
    <div class="box box2">
       <div class="c">c</div>
      <div class="d">d</div>
    </div>
  </div>

这些是flexbox样式:

.box {
  color: white;
  font-size: 100px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
  padding: 10px;
  width: 100vw;
}

.container {
  display: flex;
  height: 100vh;
}

.a, .b, .c, .d {
  height: 50%;
}

@media all and (max-width: 500px) {
  .container {
    flex-direction: column;
  }

  .box {
     height: 50vh;
  }
}

问题:在移动设备上: -如何按以下顺序将以下div显示在列中(按原样)但是

a

c

d

b

不幸的是,我似乎找不到解决办法。

我有一个codepen here,重要的css行是从162行开始的。

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以在display:contents元素上考虑.boxhttps://caniuse.com/#feat=css-display-contents),然后就可以在内部元素上使用顺序:

.box {
  color: white;
  font-size: 80px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
  padding: 10px;
  width: 100vw;
}
body {
 margin:0;
}
.container {
  display: flex;
  height: 100vh;
  background:blue;
}

.a,.b,.c,.d {
  height: 50%;
  border:2px solid;
}

@media all and (max-width: 500px) {
  .container {
    flex-direction: column;
  }
  .box {
    display:contents;
  }
  .b {
    order:2;
  }
}
<div class="container">
  <div class="box box1">
    <div class="a">a</div>
    <div class="b">b</div>
  </div>
  <div class="box box2">
    <div class="c">c</div>
    <div class="d">d</div>
  </div>
</div>

  

display: contents使元素的子元素显示为,就好像它们是元素父元素的直接子元素一样,而忽略了元素本身。 在使用CSS网格或类似布局技术时应忽略包装元素的情况


如果您愿意更改html,可以按照以下步骤操作:

.container > * {
  color: white;
  font-size: 80px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
  padding: 10px;
  border:2px solid;
  box-sizing:border-box;
}
body {
 margin:0;
}
.container {
  display: flex;
  flex-direction:column;
  flex-wrap:wrap;
  height: 100vh;
  background:blue;
  padding:10px;
  box-sizing:border-box;
}

.a,.b,.c,.d {
  height: 50%;
  width:50%;
}

@media all and (max-width: 500px) {
  .a,.b,.c,.d {
    width:100%;
    height:25%;
  }
  .b {
    order:2;
  }
}
<div class="container">
    <div class="a">a</div>
    <div class="b">b</div>
    <div class="c">c</div>
    <div class="d">d</div>
</div>

使用CSS网格:

.container > * {
  color: white;
  font-size: 80px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
  padding: 10px;
  box-sizing:border-box;
  border:2px solid;
}
body {
 margin:0;
}
.container {
  display: grid;
  grid-template-areas:  
    'a b'
    'c d';
  grid-template-columns:1fr 1fr;
  grid-template-rows:1fr 1fr;
  grid-gap:10px;
  min-height: 100vh;
  background:blue;
  padding:10px;
  box-sizing:border-box;
}

.a {
  grid-area:a;
}
.b {
  grid-area:b;
}
.c {
  grid-area:c;
}
.d {
  grid-area:d;
}

@media all and (max-width: 500px) {
  .container {
   grid-template-areas:  
    'a'
    'c' 
    'd'
    'b';
  grid-template-columns:1fr;
  grid-template-rows:1fr 1fr 1fr 1fr;
   }
}
<div class="container">
    <div class="a">a</div>
    <div class="b">b</div>
    <div class="c">c</div>
    <div class="d">d</div>
</div>

答案 1 :(得分:1)

Nuri Katsuki的评论是正确的。如果“ abcd” div处于同一级别,则可以使用CSS order属性来实现所需的移动顺序。

此外,flex-wrap: wrap使子级流入桌面查询中的列

我已经编辑了您的示例以进行说明:

.container {
  color: white;
  font-size: 100px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);

  width: 100vw;
  
  display: flex;
  height: 100vh;
  flex-direction: column;
  flex-wrap: wrap;  
}

.a { background:#e67e22;}
.b { background:#e74c3c;}
.c { background:#9b59b6;}
.d { background:#34495e;}


.a, .b, .c, .d {
  height: 50%;
  width: 50%;
}

@media all and (max-width: 500px) {
  .container {
    height: auto;
  }
  .a, .b, .c, .d { width: 100%; }
  .b {
    order: 3;
  }
}
<div class="container">
  <div class="a">a</div>
  <div class="b">b</div>
  <div class="c">c</div>
  <div class="d">d</div>
</div>

/* Some default styles to make each box visible */
html,body {
  padding: 0;
  margin: 0;
}

.container {
  color: white;
  font-size: 100px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);

  width: 100vw;
  
  display: flex;
  height: 100vh;
  align-items: stretch;
  flex-direction: column;
  flex-wrap: wrap;
}

.a { background:#e67e22;}
.b { background:#e74c3c;}
.c { background:#9b59b6;}
.d { background:#34495e;}

.a, .b, .c, .d {
  height: 50%;
  width: 50%;
}

@media all and (max-width: 500px) {
  .container {
    height: auto;
  }
  .a, .b, .c, .d { width: 100%; }
  .b {
    order: 3;
  }
}
<div class="container">
  <div class="a">a</div>
  <div class="b">b</div>
  <div class="c">c</div>
  <div class="d">d</div>
</div>

答案 2 :(得分:1)

如果您在.box 2的.a.c.box1中将div排序为.c.d,则可以使用{{ 1}}(针对台式机),并在.container中以移动+顺序在.box列中:

.box2
.box {
  color: white;
  font-size: 100px;
  text-align: center;
  text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
  padding: 10px;
  width: 100vw;
  display: flex; /* <-- */
}

.container {
  display: flex;
  height: 100vh;
  flex-direction: column; /* <-- */
}

.a, .b, .c, .d {
  height: 50%;
}

@media all and (max-width: 500px) {
  .box {
    height: 50vh;
    flex-direction: column; /* <-- */
  }

  .box2 .d {
    order: 0; /* <-- */
  }
}