2 列中 floating/inline-block 个元素的间隙问题

Gap issue with floating/inline-block elements in 2 columns

我正在处理的页面在 2 列中生成了许多元素,这些元素具有水平时间顺序:

1 2
3 4
5 6
7

由于列具有垂直时间顺序,我实际上并没有使用列,而是使用了各种浮动元素或内联块。

但是,由于生成的元素具有用户指定的内容,因此高度不可预测,这会导致许多问题:

场景 1

如果左边的元素是一个浮点数,如果右边的元素较短,它会漂浮到其他左边元素的右边,因为剩下的space。 See illustration

场景 2

如果左边的元素是一个内联块,它会表现得像一个带有明确属性的浮点数,左右元素之间的大小差异将保持不变"cleared",而不是被右边的浮动元素占据。 这将导致右列中出现笨拙的 space,因为那里的元素似乎想要跟随行内块中新行的开头。 See illustration

期望的最终结果类似于场景 2,但没有任何差距。有什么办法可以让2列这样互相不干扰吗?

解决方案

查看选择的答案,了解如何在 2 中拆分数组。 然后简单地将 2 个数组中的每一个包装在一个带有 float:left/right 属性的列元素中,就可以了。

由于您的数据似乎不是很大,您有两条非常简单的路线可供选择。

其中之一是将数据集分成两个数组,每个数组包含各自的项目,例如:

$arrO = [];
$arrE = [];
$odd = true;
while($row = $result->fetch_assoc()){
  if($odd) $arrO[] = $row;
  else $arrE[] = $row;
  $odd = !$odd;
}

另一种选择是在数据集上循环两次并只选择您感兴趣的行:

$results = $result->fetch_all();
$odd = true;
foreach($results as $row){
  if($odd) //print something, or whatever :)
  $odd = !$odd;
}
$odd = true;
foreach($results as $row){
  if(!$odd) //print something, or whatever :)
  $odd = !$odd;
}