CSS去除浮动元素上方的白色间隙

3

我正在尝试构建这个布局:

期望的双列布局

我为左侧的框使用了float: left,右侧的框使用了float: right

问题在于,每个向右浮动的框都将其顶部与上一个向左浮动的元素对齐。

因此,我只得到这样的结果:

实际的双列布局

HTML:
我需要保持这个顺序(box1、box2、... box7)

<div class="container">
  <div class="box box1 left green">
    BOX 1 (big) Lorem ipsum (...)
  </div>
  <div class="box box2 right orange">
    BOX 2 (small) 
  </div>
  <div class="box box3 right blue">
    BOX 3 (small) 
  </div>
  <div class="box box4 left pink">
    BOX 4 (big) Lorem ipsum (...)
  </div>
  <div class="box box5 right yellow">
    BOX 5 (small)
  </div>
  <div class="box box6 left teal">
    BOX 6 (big) Lorem ipsum (...)
  </div>
  <div class="box box7 right purple">
    BOX 7 (small)
  </div>
</div>

演示: https://codepen.io/constagorgan/pen/vjLJzG

其他注意事项:

  • 在较小的设备上,方框应合并为单列,与使用Bootstrap中的col-*-12相同,但保持相同的顺序(box1,box2,... box7)
  • 我可以使用Bootstrap、Masonry、Bulma或其他帮助构建网格/布局的库,只要它被IE11、Chrome和Firefox支持
  • 仅使用CSS的解决方案将是绝对棒的。
  • 我不想使用display:table。这里给出了原因here.

我到目前为止尝试过的:

  • 使用Bootstrap → 我无法使其响应小屏幕而不在DOM内部移动东西。
  • 使用Masonry → 我找不到一种方法来排序盒子。它们只是在最近可用的位置上定位自己。
  • 使用flex → 我陷入了类似的境地。
  • 使用CSS网格布局 → 它在IE11上的支持不完全。
  • 使用CSS列 → 我需要70% | 30%的比例。这是设计为50% | 50%。

如何从布局中删除那些白色间隙?我可以使用浮动元素实现这一点吗?如果不能,正确的方法是什么?

编辑: 我需要使其响应。在较小的屏幕上,我需要坚持这种单列布局(如我在“其他注意事项”部分中提到的)。

Mobile 1-column layout


1
使用浮点数无法实现。您必须更改HTML。但是display:table与“使用表格进行布局”不同。简短回答:如果表格布局是解决方案,则使用表格布局。不使用HTML表格布局的想法是,您的HTML应该描述您的信息,如果您的信息不是表格,则为什么要使用表格来描述它?另一方面,CSS display:table与您的标记无关,仅涉及呈现,可以根据需求随便使用。 - Sergiu Paraschiv
HTML可以修改吗? - Gerardo BLANCO
我同意@SergiuParaschiv的观点。display:table并不等同于<table>。人们对此感到如此激动,以至于他们忘记即使是<table>在有表格布局的情况下也完全没问题。 - Scott Marcus
如果您创建两列,一列用于大文本,另一列用于小文本,会怎样呢? - Ravi Sevta
1
如果您在媒体查询中使用CSS display:table来处理大视口,那么您可以在另一个媒体查询中为小视口设置不同的(单列)布局。非常简单。 - Scott Marcus
显示剩余5条评论
2个回答

3

如果你将Flexbox和float结合起来,就可以像这样做,在较窄的屏幕上利用Flexbox属性order

首先添加较小的元素,然后可以简单地将它们floatclear,它们将对齐右侧,在自己的列中。

当媒体查询启动时,删除float,添加display: flex并将它们1-7排序。

更新的 CodePen

Stack Snippet

.left {
  width: 75%;
}
.right {
  float: right;
  width: 25%;
  clear: right
}

.green { background-color: #90EE90; }
.blue { background-color: #20B2AA; }
.orange { background-color: #FFA07A; }
.pink { background-color: #FFB6C1; }
.yellow { background-color: #FFD700; }
.teal { background-color: #00CED1; }
.purple { background-color: #9370DB; }

@media (max-width: 500px) {
  .left, .right {
    float: none;
    width: 100%;
  }
  .container {
    display: flex;
    flex-direction: column;
  }

  .container .box1 { order: 1 }
  .container .box2 { order: 2 }
  .container .box3 { order: 3 }
  .container .box4 { order: 4 }
  .container .box5 { order: 5 }
  .container .box6 { order: 6 }
  .container .box7 { order: 7 }
}
<div class="container">
  
  <div class="box box2 right orange">
  BOX 2 (small) 
  </div>
  
  <div class="box box3 right blue">
  BOX 3 (small) 
  </div>

  <div class="box box5 right yellow">
  BOX 5 (small)
  </div>

  <div class="box box7 right purple">
  BOX 7 (small)
  </div>

  <div class="box box1 left green">
  BOX 1 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci in, efficitur pulvinar ipsum. Praesent pretium nisl quis ante accumsan sagittis. Nullam ac tortor quis turpis dictum fringilla ut non arcu. Praesent eget tellus vitae leo malesuada condimentum. Integer luctus dolor quis condimentum mollis.
  </div>

  <div class="box box4 left pink">
  BOX 4 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci in, efficitur pulvinar ipsum. Praesent pretium nisl quis ante accumsan sagittis. Nullam ac tortor quis turpis dictum fringilla ut non arcu. Praesent eget tellus vitae leo malesuada condimentum. 
  </div>

  <div class="box box6 left teal">
  BOX 6 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci in, efficitur pulvinar ipsum.
  </div>

</div>


如果您无法更改标记,那么您需要使用脚本,在脚本中挂钩resize事件,或者像这里一样使用window.matchMedia事件。

堆栈段落

document.addEventListener("DOMContentLoaded", function(event) {

  var container = document.querySelector('.container');
  var items = document.querySelectorAll('.container .box');

  var reorderitems = function(matched) {
    if (matched) {
      container.appendChild(items[0]);
      container.appendChild(items[3]);
      container.appendChild(items[5]);
    } else {
      container.insertBefore(items[2], items[3]);
      container.insertBefore(items[1], items[2]);
      container.insertBefore(items[4], items[5]);
      container.appendChild(items[6]);
    }
  }
  reorderitems(window.outerWidth > 500);

  window.matchMedia("(min-width: 501px)").addListener(function(e) {
    if (e.matches) {
      reorderitems(true);
    } else {
      reorderitems(false);
    }
  });
});
.left {
  width: 75%;
}

.right {
  float: right;
  width: 25%;
  clear: right
}

.green {
  background-color: #90EE90;
}

.blue {
  background-color: #20B2AA;
}

.orange {
  background-color: #FFA07A;
}

.pink {
  background-color: #FFB6C1;
}

.yellow {
  background-color: #FFD700;
}

.teal {
  background-color: #00CED1;
}

.purple {
  background-color: #9370DB;
}

@media (max-width: 500px) {
  .left,
  .right {
    float: none;
    width: 100%;
  }
}
<div class="container">

  <div class="box box1 left green">
    BOX 1 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci
    in, efficitur pulvinar ipsum. Praesent pretium nisl quis ante accumsan sagittis. Nullam ac tortor quis turpis dictum fringilla ut non arcu. Praesent eget tellus vitae leo malesuada condimentum. Integer luctus dolor quis condimentum mollis.
  </div>

  <div class="box box2 right orange">
    BOX 2 (small)
  </div>

  <div class="box box3 right blue">
    BOX 3 (small)
  </div>

  <div class="box box4 left pink">
    BOX 4 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci
    in, efficitur pulvinar ipsum. Praesent pretium nisl quis ante accumsan sagittis. Nullam ac tortor quis turpis dictum fringilla ut non arcu. Praesent eget tellus vitae leo malesuada condimentum.
  </div>

  <div class="box box5 right yellow">
    BOX 5 (small)
  </div>

  <div class="box box6 left teal">
    BOX 6 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci
    in, efficitur pulvinar ipsum.
  </div>

  <div class="box box7 right purple">
    BOX 7 (small)
  </div>

</div>


1
太棒了!我选择了你的答案。清晰、简洁,支持旧版浏览器,并提供了2个代码示例。还有什么比这更好的呢? - Consta Gorgan

0
你需要创建两个新的Div来分组每一侧的盒子:
<div class="container">

  <div class="group box left">

  <div class="box box1 green">
  BOX 1 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci in, efficitur pulvinar ipsum. Praesent pretium nisl quis ante accumsan sagittis. Nullam ac tortor quis turpis dictum fringilla ut non arcu. Praesent eget tellus vitae leo malesuada condimentum. Integer luctus dolor quis condimentum mollis.
  </div>

  <div class="box box4 pink">
  BOX 4 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci in, efficitur pulvinar ipsum. Praesent pretium nisl quis ante accumsan sagittis. Nullam ac tortor quis turpis dictum fringilla ut non arcu. Praesent eget tellus vitae leo malesuada condimentum. 
  </div>    

  <div class="box box6 teal">
  BOX 6 (big) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut vel eros non odio varius efficitur. Aliquam vel dui iaculis, imperdiet odio ut, posuere nulla. Maecenas rutrum nibh sit amet sem congue ornare. Donec tellus ipsum, pulvinar sed orci in, efficitur pulvinar ipsum.
  </div>    

  </div>

  <div class="group box right">

    <div class="box box2 orange">
  BOX 2 (small) 
  </div>

  <div class="box box3 blue">
  BOX 3 (small) 
  </div>

  <div class="box box5 yellow">
  BOX 5 (small)
  </div>

  <div class="box box7 purple">
  BOX 7 (small)
  </div>    

  </div>

</div>

1
我认为他不想对HTML进行这种激进的改变。 - Sergiu Paraschiv
我已经编辑了我的答案以更好地解释它。对于较小屏幕上的单列布局,保持HTML结构处于有效状态非常重要。而且我必须按时间顺序保留盒子(box1,box2,... box7)。 - Consta Gorgan
@Amc,你的回答对于双列布局很有帮助,但是对于单列布局则不适用。它没有保持时间顺序。期望结果:_box1,box2,... box7_。实际结果:_box1,box4,box6,box2,box3,box5,box7_。但还是谢谢!我感谢你抽出时间写答案。 - Consta Gorgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接