【问题标题】:Re-arranging flex items without absolute position重新排列没有绝对位置的弹性项目
【发布时间】:2016-11-13 01:54:26
【问题描述】:

我想知道是否有任何方法可以使用保持相同结构(顺序:box1、box2、box3 和 box4)的 flex box 来实现这种组合。

我知道了,但 box4 被推到其他框下方:http://codepen.io/anon/pen/xRVEwW

.container{
  width:600px;
  position:relative;
}
.box1, .box2, .box3, .box4{
  width: 200px;
}
.box2, .box4{
  margin:0 auto;
}
.box1{
  background:pink;
  position:absolute;
  left:0;  top:0;
}
.box2{
  background:lightgreen;
}
.box3{
  background:lightgrey;
  position:absolute;
  right:0;  top:0;
}
.box4{
  background:lightblue;
}
<div class='container'>
  <div class="box1">Box 1.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </div>
  <div class="box2">Box 2.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra.  Vivamus vehicula leo mauris.</div>
  <div class="box3">Box 3.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra. Vivamus vehicula leo mauris, eu facilisis ex placerat id. Sed at ornare augue, id hendrerit nibh. Suspendisse sit amet velit sapien. Nulla sit amet ligula ac leo ultrices egestas et eget augue. Integer non metus tellus. Nam sed lorem et magna gravida laoreet. Vivamus et varius ipsum, ac mattis mi.</div>
  <div class="box4">Box 4.</div>
</div>

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    我想知道是否有任何方法可以使用保持相同结构的弹性盒来实现这种组合。

    是的,有一种方法可以在不更改 HTML 的情况下实现布局。给你:

    .container {
      display: flex;
      flex-wrap: wrap;
      flex-direction: column;
      width: 600px;
      height: 500px;
    }
    
    .box1 { flex: 100%; order: 0; }
    .box2 { flex: 80%;  order: 1; }
    .box3 { flex: 100%; order: 3; }
    .box4 { flex: 20%;  order: 2; }
    
    .box1 { background: pink;      width: 200px; }
    .box2 { background:lightgreen; width: 200px; }
    .box3 { background:lightgrey;  width: 200px; }
    .box4 { background:lightblue;  width: 200px; }
    <div class='container'>
      <div class="box1">Box 1.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </div>
      <div class="box2">Box 2.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra.  Vivamus vehicula leo mauris.</div>
      <div class="box3">Box 3.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra. Vivamus vehicula leo mauris, eu facilisis ex placerat id. Sed at ornare augue, id hendrerit nibh. Suspendisse sit amet velit sapien. Nulla sit amet ligula ac leo ultrices egestas et eget augue. Integer non metus tellus. Nam sed lorem et magna gravida laoreet. Vivamus et varius ipsum, ac mattis mi.</div>
      <div class="box4">Box 4.</div>
    </div>

    revised codepen

    关键点:

    • 使用列方向、启用环绕的弹性容器。
    • 为容器定义一个高度(让弹性项目知道在哪里包装)。
    • 第一列和第三列得到全高(flex-basis: 100%,或简写为flex: 100%)。
    • 第二列和第四列合并,因此根据需要调整它们的高度并使用order 属性将第 4 列移到第 3 列之前。

    【讨论】:

    • 好方法!你觉得有什么办法可以不指定容器的高度值吗?
    • 这是一个常见的要求。没有容器上的高度,就没有任何东西可以强制 flex 项目包装。
    【解决方案2】:

    擦除 flex 属性并使用 float:

    float:left 位于框 1 和 2,float:right 位于框 3 和 4。无需更改 HTML:

    .container{
      width:600px;
    }
    .box1, .box2, .box3, .box4{
      width: 200px;
    }
    .box1{
      background:pink;
      float: left;
    }
    .box2{
      background:lightgreen;
      float: left;
    }
    .box3{
      background:lightgrey;
      float: right;
    }
    .box4{
      background:lightblue;
      margin:0 auto;
      float: right;
    }
    <div class='container'>
      <div class="box1">Box 1.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </div>
      <div class="box2">Box 2.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra.  Vivamus vehicula leo mauris.</div>
      <div class="box3">Box 3.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra. Vivamus vehicula leo mauris, eu facilisis ex placerat id. Sed at ornare augue, id hendrerit nibh. Suspendisse sit amet velit sapien. Nulla sit amet ligula ac leo ultrices egestas et eget augue. Integer non metus tellus. Nam sed lorem et magna gravida laoreet. Vivamus et varius ipsum, ac mattis mi.</div>
      <div class="box4">Box 4.</div>
    </div>

    http://codepen.io/anon/pen/eBZBYL

    【讨论】:

    • 如果你改变了盒子的内容,它就不起作用了。 :-( codepen.io/anon/pen/yVOgjY
    • 是的,但我参考了您的示例。如果 box3 比 box2 短,你还真的希望 box4 在 box2 的下方吗?
    【解决方案3】:
    • box2box4 包装在一个公共 div 中
    • align-items: flex-start;(或baseline)添加到.container

    .container{
      width:600px;
      display:flex;
      flex-wrap:wrap;
      align-items: flex-start;
    }
    .box1, .box2, .box3, .box4{
      width: 200px;
    }
    .box1{
      background:pink;
    }
    .box2{
      background:lightgreen;
    }
    .box3{
      background:lightgrey;
    }
    .box4{
      background:lightblue;
    }
    <div class='container'>
      <div class="box1">Box 1.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. </div>
      <div>
        <div class="box2">Box 2.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra. Vivamus vehicula leo mauris.</div>
        <div class="box4">Box 4.</div>
      </div>
      <div class="box3">Box 3.<br> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam et fermentum odio, eget mattis quam. Curabitur rutrum lorem a augue egestas, ut rhoncus mi viverra. Vivamus vehicula leo mauris, eu facilisis ex placerat id. Sed at ornare augue,
        id hendrerit nibh. Suspendisse sit amet velit sapien. Nulla sit amet ligula ac leo ultrices egestas et eget augue. Integer non metus tellus. Nam sed lorem et magna gravida laoreet. Vivamus et varius ipsum, ac mattis mi.</div>
    </div>

    http://codepen.io/borkdude/pen/VmaKRZ

    【讨论】:

    • 这是最简单的方法 :-) 但是......我可以在不改变结构的情况下达到同样的效果吗?
    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 2021-07-18
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2018-03-23
    相关资源
    最近更新 更多