【问题标题】:One UL list split into multi columns with fixed height一个 UL 列表拆分为固定高度的多列
【发布时间】:2026-01-04 04:35:01
【问题描述】:

我想创建一个包含可变数量的 LI 元素的 UL 列表。我希望容器的高度最大为 500 像素。这意味着如果我有更多超过 500px 高度的 li 元素,我希望它变成 2 列。如果有更多,那么可以容纳 2 列,我希望它变成 3 列。我有足够的空间来修复最多 5 列,并且数据永远不会超过这个数量。

知道我该怎么做吗?任何jquery,css技巧?还是我需要处理每个场景服务器端才能做到这一点。

Example 1

    list entry    list entry 
    list entry    list entry
    list entry    list entry
    list entry    list entry
    list entry    


 Example 2
    list entry    list entry     list entry
    list entry    list entry     list entry
    list entry    list entry     list entry
    list entry    list entry
    list entry    list entry


 Example 3
    list entry    list entry     list entry     list entry
    list entry    list entry     list entry     list entry
    list entry    list entry     list entry     list entry
    list entry    list entry     list entry
    list entry    list entry     list entry

如果没有一个 UL 就无法实现,那么我愿意接受。

谢谢!

【问题讨论】:

  • 如果您愿意为每 5 个 lis 创建一个新的 ul,这是相关的 *.com/questions/11308375/…(我知道这是一种不同的语言,但原则适用)
  • LI 的高度是否相同或可变?可以做任何一种方式,但如果固定更容易
  • li 将是可变的,我需要它是动态的,如果所有 LI 都在一行中,那么我可以容纳 5,但如果一个 li 覆盖 2 行,那么我只能容纳 4。我知道我可以做到就像你上面说的,但我需要它非常有活力。
  • OK..两者之间的差异很大,但不是问题
  • 我看到这些是
      ,但是顺序重要吗?如果不是,您可以将它们粘贴在具有适当填充/边距和“浮动:左”的
      中。如果项目的顺序不重要,我可以提供一个例子。假设顺序很重要,我仍在尝试考虑如何仅使用 CSS 来做到这一点。

标签: jquery html css html-lists multiple-columns


【解决方案1】:

http://jsfiddle.net/eaewX/1/

如果您将每个列表封装在<div> 中,在<div> 上设置columnscolumn-widthcolumn-count,它会将列表适当地分成列。

编辑:它在 jsfiddle 中,但我应该澄清一下,您目前需要为这些属性使用浏览器扩展,即-webkit--moz--o-

供参考:

https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_multi-column_layouts

http://dev.w3.org/csswg/css3-multicol/#columns

【讨论】:

  • 我不知道它是 2 列还是 3 列或 4 列。那么我将如何处理呢?
  • 您可以将列数(或列中的第一个参数)设置为高于您需要的数字。只有当它的父元素空间不足时,它才应该换行到一个新列。所以,在你的情况下,你可以说 column-count: 5 你应该没问题。
  • @charlietfl 部分正确。如果你无论如何都想要这个精确的布局,是的,你是 100% 正确的。但是,不支持列的浏览器只会正常(垂直)呈现它。
  • @Llepwryd 让 OP 知道 CSS3 不是 100% 跨浏览器很重要
  • 我需要一个适用于 ie7、ie8、ff、chrome、safari 的解决方案。所以 css3 不会是 100% 的解决方案
【解决方案2】:

这是一个可行的解决方案

/* set max height of containers */
var maxHt=500;/* may need to adjust based on css*/

var $list=$('#startList')
var $container=$list.parent();

var $li=$list.find('li');

var totHt=0;    
var totItems=$li.length;
$li.each(function( idx){

    var ht=$(this).height();
    if( totHt + ht >= maxHt || idx==totItems-1){
        $('<ul>').append( $(this).prevAll().andSelf() ).appendTo( $container );
        totHt=0;
    }else{
        totHt += ht;
    }  

});

$list.remove()

演示:http://jsfiddle.net/rzw64/3/

请注意,在 UL 上设置的高度需要比用于计算的最大高度多一点。额外的 CSS 将有助于或可以添加代码以获取父容器的动态高度以设置 maxHt 允许

【讨论】:

  • 看起来方向正确。但是,如果我有一个包含 2 行的 li 列表,它会覆盖现有的 li。见这里jsfiddle.net/rzw64/4
  • 只有在 LI 上设置了高度时才会发生这种情况。我的演示设置了固定的随机高度,因此我可以创建一些变化。高度是内联设置的,所以我不必手动创建一堆 html
最近更新 更多