代码之家  ›  专栏  ›  技术社区  ›  Adam Kiss

将jquery对象列表重新排序到列

  •  1
  • Adam Kiss  · 技术社区  · 15 年前

    我正在研究函数,这需要 select 从HTML替换为多列 ul -这是一张单子,但是 float:left; li 子级,因此列数基于计算(如果 UL 宽度为600且 宽度是200,显然我有3列)。

    这就是理论——最简单的部分。

    例子 :5项,2列

    现在,当我从Select获取数据时,我得到了以下列表:

     1
     2
     3
     4
     5
    

    如果我把阵列推进 UL ,屏幕上将显示如下:

    1   2
    3   4
    5
    

    但是对于用户/读者来说,当你不阅读的时候,它会变得越来越容易和更好。 Left->Bottom 但更确切地说 Bottom->Left ,这意味着您要一直读到列的底部,然后移到下一列,而不是先读行,再读下一行。

    所以我需要将列表转换为列:

    1   4
    2   5
    3
    

    所以,在现实中 UL 将是这个命令:

    1   4   2   5   3
    

    这需要使用可变的列号,因为如果我们决定向列表中添加10个项目,那么使用更多的列可能会更好。

    对所需的运算符/循环和涉及的数学有帮助吗?

    谢谢你

    3 回复  |  直到 15 年前
        1
  •  2
  •   Alex Sexton    15 年前

    我觉得这是个有趣的问题,所以我给你写了一个插件。我做了一点测试,看起来很管用。如果这是你想要的,请告诉我!

    http://jsbin.com/ocama/3/edit

    http://jsbin.com/ocama/3

    算法非常简单,它基本上就是找到有多少行,然后根据这个数字对列进行分组。

        2
  •  0
  •   Pointy    15 年前

    如果您知道有多少列,那么您将 <li> 通过跳过列表的元素 n 一次。所以对于三列,您可以选择项目0、3、6……然后回来选择1,4,7,然后2,5,8。

        3
  •  0
  •   Adam Kiss    15 年前

    我做到了:

    我做了所有的计算。我也喜欢 亚历克斯 解决方案,所以我会给他一个很好的答案,我在这里添加了我的解决方案,只适用于寻找此类问题的任何人:)

    var rows= 2; //editable number of rows
    
    $('body').append('<ul id="fromselect"></ul>');
    var o = $('select#tolist option');
    var ul = $('ul#fromselect');
    
    var total = o.size();
    var onecol = Math.ceil(total / rows);
    var index = 0; //index in o list
    
    for (var j=1; j<=onecol;j++){
        for (var i=1;i<=rows;i++){
            if (!(i*j>total)){ //in last row, there might be less columns used
                index = (i-1)*onecol+j-1;
                ul.append('<li><a href="#">'+index +': '+
                          o.eq(index ).text()
                         +'</a></li>');
                //index is used more for debug, you can put
                //the index calculation in o.eq( * ) part
            }
        }
    }