【问题标题】:Float unordered lists (UL) next to one another, and stack them at the bottom of each other, with no margins or spaces将无序列表(UL)并排浮动,并将它们堆叠在彼此的底部,没有边距或空格
【发布时间】:2012-02-12 08:32:48
【问题描述】:

我有多个无序列表 (UL) 元素。请查看下图:

我想要做的是让 UL 彼此相邻浮动。 UL 具有不同的内容长度 (LI),因此一些 UL 比其他的长。当我在有限宽度的 div 层中将 UL 彼此相邻浮动时,最后一个 UL 会浮动在底部/左侧。但是……如果有更长的 UL,就会有一些空间。我希望 UL 在每个 UL 元素的底部向左浮动并堆叠,没有空格。有没有办法通过 HTML/CSS 实现这一点?

浮动 UL 彼此离开很容易......但我不知道如何摆脱边距

----- 更新----

这是我用来生成 HTML 的代码...实际上我将它从 UL 更改为 TABLE,但这并没有改变我的问题。我有许多表,可能从 1 到 8 不等。这些表将出现的容器 DIV 的宽度最多可以容纳 4 列。 TABLE 将具有不同数量的 ROW,因此长度也会不同。

$groups = array();
foreach ($related->posts as $post) {
    $groups[$post->post_type][] = $post;
}
foreach ($groups as $name => $posts) {
    printf('<table class="related-group related-%s "><tbody>', htmlspecialchars($name));
    foreach ($posts as $post) {
        printf('<tr class="related-item"><td><a href="'.get_permalink($post->ID).'" rel="permalink">'.get_the_post_thumbnail($post->id, '32').'</a></td><td><a href="'.get_permalink($post->ID).'" rel="permalink">'.$post->post_title.'</a></td></tr>');
    }
echo '</tbody></table>';
}

【问题讨论】:

  • 好问题!我今天遇到了完全相同的问题,我很惊讶三年后它仍然没有一个纯 CSS 的解决方案。不过,我在答案中看到了一些很好的建议。

标签: html css positioning css-float html-lists


【解决方案1】:

虽然给出的意见和建议确实很有帮助,

我用 jQuery Masonry 解决了这个问题,一个 jQuery 插件

http://masonry.desandro.com/

我不确定是否有更好的方法来做到这一点,但这个方法很有效

Isotope,另一个看起来类似于 Masonry 的 jQuery 插件,可能可以做与 Masonry 相同的工作,但我还没有测试过:http://isotope.metafizzy.co/

感谢您的阅读和光临

【讨论】:

    【解决方案2】:

    好吧,这个解决方案可能无法具体回答您的问题,但它可能会帮助您解决问题:

    您将无法按照您建议的方式使用 float 来执行此操作。我能想到的唯一解决方案是将元素划分为向左浮动的分组DIVs(或您选择的块元素)。本质上,您将属于同一 Y 轴的每个 UL 放入某种列元素中:

    <div class="col">
        <ul><!-- LI elements here --></ul>
        <ul><!-- LI elements here --></ul>
    </div>
    
    <div class="col">
        <ul><!-- LI elements here --></ul>
        <ul><!-- LI elements here --></ul>
    </div>
    
    <div class="col">
        <ul><!-- LI elements here --></ul>
    </div>
    
    <div class="col">
        <ul><!-- LI elements here --></ul>
    </div>
    

    我知道这不是完全语义化的,因为您添加元素纯粹是为了展示目的,但是我没有看到任何其他方法可以实现这一点(除非您能够使用绝对/相对定位 - 如果您知道每个列表中的项目数)。

    或者,可能有一个 jQuery 插件或类似的东西可以让你动态定位元素,但我不知道我的头。

    【讨论】:

    • 不幸的是,这行不通;我不能这样做,因为 UL 是由 PHP 生成的,我不知道在什么列下,UL 的数量会根据数据库查询而有所不同;但是我知道最多可能有 4 列,但是其中的 UL 数量可能会有所不同(从 1 到 8...)
    • 我猜你可以按照 Matt K 的建议使用 PHP 将 UL 分配到不同的列中 - 但是你发现的那个插件很棒!我什至可以为以后添加书签!
    • 感谢 Zac,最后如您所见,我修复了插件,简单快捷,无需重新发明轮子(暂时):)
    • 可能值得写出来作为答案并接受它,以防其他人正在寻找类似的解决方案 - 我不确定未回答的问题是否会获得同样多的流量......
    【解决方案3】:

    如果您将它们垂直堆叠,那将是可能的。这个jsfiddle here 说明了您的问题,下一行项目将从前一行中最长 ul 到达的位置开始。您可以将 ul 插入原始列以垂直堆叠 ul,而不是为新行创建新列。看看this jsfiddle 看看有什么不同。

    抱歉,不知道您是否可以访问这些链接。 jsfiddle.net 现在似乎负载很重。

    【讨论】:

    • 感谢 jsfiddle,但不幸的是我无法预测我将拥有多少个 UL,并且由于此 HTML 是由 PHP 生成的,我无法将 UL 分发到 DIV,因为数量的 UL 会有所不同
    • 只要你逐列插入它们就没有关系(即1、2、3、4,[重新开始!] 1、2、3、4)。
    • 我已经添加了我用来生成 HTML 的 PHP 代码 - 实际上,因为我准备了上面的图像,但同时出于设计原因我从 UL 切换到 TABLE,它实际上并没有t改变问题
    • 表格不应用于设计布局,只能用于表格数据。一种更简单的方法是创建一个空的基于列的布局,如我所述,然后使用 PHP 循环浏览您的“帖子”并回显一些 javascript 以将它们一一插入到列中。
    • 你是对的,但这是暂时的,我在处理一些 CSS 时恢复到 UL... 我认为最好有一些直接的 javascript,我正在寻找一些 jQuery插件也许它确实存在可以使用的东西
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多