1. ホーム
  2. ハイパーリンク

[解決済み】 順番なしリストを2列で表示するには?

2022-04-17 09:58:41

質問

次のHTMLで、リストを2列で表示する最も簡単な方法は何でしょうか?

<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

希望する表示

A B
C D
E

このソリューションは、Internet Explorerで動作する必要があります。

解決方法は?

モダンブラウザ

は、css3 columns モジュールを活用して、あなたが探しているものをサポートします。

http://www.w3schools.com/cssref/css3_pr_columns.asp

CSSです。

ul {
  columns: 2;
  -webkit-columns: 2;
  -moz-columns: 2;
}

http://jsfiddle.net/HP85j/8/

レガシーブラウザ

残念ながらIEをサポートするためには、JavaScriptとdomの操作を含むコードソリューションが必要です。つまり、リストの内容が変更されるたびに、リストを列に並べ替えて再印刷するための操作を行う必要があります。以下の解決策は、簡潔にするためにjQueryを使用しています。

http://jsfiddle.net/HP85j/19/

HTMLです。

<div>
    <ul class="columns" data-columns="2">
        <li>A</li>
        <li>B</li>
        <li>C</li>
        <li>D</li>
        <li>E</li>
        <li>F</li>
        <li>G</li>
    </ul>
</div>

JavaScriptです。

(function($){
    var initialContainer = $('.columns'),
        columnItems = $('.columns li'),
        columns = null,
        column = 1; // account for initial column
    function updateColumns(){
        column = 0;
        columnItems.each(function(idx, el){
            if (idx !== 0 && idx > (columnItems.length / columns.length) + (column * idx)){
                column += 1;
            }
            $(columns.get(column)).append(el);
        });
    }
    function setupColumns(){
        columnItems.detach();
        while (column++ < initialContainer.data('columns')){
            initialContainer.clone().insertBefore(initialContainer);
            column++;
        }
        columns = $('.columns');
    }

    $(function(){
        setupColumns();
        updateColumns();
    });
})(jQuery);

CSSです。

.columns{
    float: left;
    position: relative;
    margin-right: 20px;
}

EDITです。

下記で指摘されているように、これは以下のように列を並べることになります。

A  E
B  F
C  G
D

のようなバリアントが求められているのに対し

A  B
C  D
E  F
G

バリアントを実現するには、コードを以下のように変更するだけです。

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column > columns.length){
            column = 0;
        }
        $(columns.get(column)).append(el);
        column += 1;
    });
}