【问题标题】:Gap issue with floating/inline-block elements in 2 columns2列中浮动/内联块元素的间隙问题
【发布时间】:2018-01-29 20:13:20
【问题描述】:

我正在处理的页面在 2 列中生成了许多元素,它们的水平年表如下:

1 2
3 4
5 6
7

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

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

场景 1

如果左边的元素是一个浮点数,如果右边的元素较短,它将浮动到其他左边元素的右边,因为剩下的空间更多。 See illustration

场景 2

如果左元素是一个内联块,它会像一个具有clear属性的浮点数一样,左右元素之间的大小差异将保持“清除”,而不是被右浮动元素。 这将导致右列中出现尴尬的空间,因为那里的元素似乎想要跟随内联块上新行的开头。 See illustration

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

解决方案

请参阅所选答案以了解如何将数组拆分为 2。 然后只需将 2 个数组中的每一个都包装在一个带有 float:left/right 属性的列元素中,就可以开始了。

【问题讨论】:

  • 那真是太糟糕了。不过感谢您的提示。
  • 其实等等,我可能有点误解你了。您是否必须按特定顺序渲染这些项目? (如果您不介意,您可以将这些项目呈现在两个单独的列中,其中一列包含项目 1、3、5、7,另一列包含项目 2、4、6):)
  • 不,它们不必按该顺序呈现。我什至自己考虑过这个确切的解决方案,但我不完全确定如何将查询结果对象分成 2 个这样的批次。目前我只是用 PHP 中的 fetch_assoc() 函数循环遍历它。我已经通过简单地在循环内的 2 个状态之间切换变量来跟踪左侧和右侧。你能想出一种方法来有效地存储最终处于两种状态之一的所有结果,同时呈现另一种状态吗?
  • 您希望其中有多大的数据集?比如一次渲染多少个元素以及它们可能包含多少数据?
  • 相当小。可能不超过 20 个框,每个框使用 2 个数据点(一个整数和一个“文本”类型),实际上这些数组目前确实包含更多数据,但我可以在查询中切断其余部分而不会产生任何后果。虽然无法准确说出最终会有多少“套”,但很可能永远不会超过 50 套。

标签: css two-columns


【解决方案1】:

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

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

$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;
}

【讨论】:

  • 谢谢,你的语法超级干净!
  • 附带说明,在使用“fetch_all”时,我最终得到的是常规数组,而不是关联数组。是否有一种简单的方法可以使用关联数组执行选项 2?现在我只是减少了查询,以避免在更改数据库表时意外弄乱索引,但我很想知道这是否是这种方法的固有限制。
  • 查看fetch_all()php.net/manual/en/mysqli-result.fetch-all.php的可选参数
  • 谢谢,会做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多