順序付けられていないリストを2列で表示する方法は?


215

次の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で機能する必要があります。


1
jqueryで簡単に実行する方法の実例は次のとおりです:jsfiddle.net/EebVF/5このjqueryプラグインの使用:github.com/fzondlo/jquery-columns-CSSソリューションではすべてが揃っていないので、CSSよりもこれが好きです上に垂直に。
newUserNameHere 2014年

回答:


371

最新のブラウザ

css3列モジュールを活用して、探しているものをサポートします。

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

編集:

以下で指摘するように、これは列を次のように順序付けします。

A  E
B  F
C  G
D

一方、OPは以下に一致するバリアントを要求しました:

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

2
アイテムを正しい順序で表示していません:jsfiddle.net/HP85j/258たとえば、最初の行の望ましい表示はA B(2番目の要素は右側に追加する必要があります)ですが、例ではA Eです。
パオロモレッティ2014

1
すばらしい作業です。2列を超えるとロジックに欠陥がありますが、ここで修正を作成しました:jsfiddle.net/HP85j/393
Tr1stan

2
弾丸がありません
Jaider

1
リストの列1を列2の前に埋めるほうがよいでしょう。リストの項目を並べ替えるほうが簡単で、下に行く前に埋められているように見えます。もちろん、リストが変更された場合は、やり直す必要があります。とにかく、GabrielのCSS回答は私が必要としていたものでした。
パンストレス

3
最新のアップデートで、最初のオプションが最新のIEブラウザで機能するようになったと思います。
Fizz

82

私はうまくいった@jaiderのソリューションを見ていましたが、操作がより簡単で、ブラウザー全体で優れていると思われる少し異なるアプローチを提供しています。

ul{
    list-style-type: disc;
    -webkit-columns: 2;
    -moz-columns: 2;
    columns: 2;
    list-style-position: inside;//this is important addition
}

デフォルトでは、順不同リストは箇条書きの位置を外側に表示しますが、一部のブラウザーでは、ブラウザーのWebサイトのレイアウト方法に基づいて、いくつかの表示問題が発生します。

それをフォーマットで表示するには:

A B
C D
E

などは以下を使用します:

ul li{
    float: left;
    width: 50%;//helps to determine number of columns, for instance 33.3% displays 3 columns
}
ul{
    list-style-type: disc;
}

これにより、列の表示に関するすべての問題が解決されます。あなたの応答が私にこれを発見するのを助けてくれたので、@ jaiderに感謝します。


3
この方法には問題があります。非常に短い(この例では1文字)リスト項目を表示するのに最適です。より長い説明を含むリストを作成し、2番目の列が最初の列と重なり、ulコンテナーが不足します。
Shaggy

1
li要素のfloat:leftをdisplay:inline-blockに変更して、これを少し微調整しましたが、これは私にとっては不思議に機能しました。
ZeRemz

41

これをコメントとして投稿しようとしましたが、(質問に従って)列を正しく表示できませんでした。

あなたが求めているのは:

AB

CD

E

...しかし、解決策が返されると認められた答え:

広告

BE

C

...答えが間違っているか、質問が間違っています。

非常に簡単な解決策は、あなたの幅を設定して<ul>から、フロートして<li>アイテムの幅を次のように設定することです

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

ul{
    width:210px;
}
li{
    background:green;
    float:left;
    height:100px;
    margin:0 10px 10px 0;
    width:100px;
}
li:nth-child(even){
    margin-right:0;
}

ここに例http://jsfiddle.net/Jayx/Qbz9S/1/

質問が間違っている場合は、前の回答が適用されます(IEのサポートが不足しているためのJS修正)。


@ガブリエルあなたの解決策と動作は期待どおり期待どおりなので、私はあなたの答えをノックしようとはしていません...私はちょうど質問が誤って解釈された可能性があると思います...どちらにせよ-質問は関係なく答えられましたこれは正しい質問です:D
Jayx

16

私は最新のブラウザーのソリューションが好きですが、箇条書きが欠けているため、少しトリックを追加します。

http://jsfiddle.net/HP85j/419/

ul {
    list-style-type: none;
    columns: 2;
    -webkit-columns: 2;
    -moz-columns: 2;
}


li:before {
  content: "• ";
}

ここに画像の説明を入力してください


ここでは、変更せずに弾丸の色項目の色を変更することができますjsfiddle.net/HP85j/444
Jaider

3
list-style-position: inside;弾丸が適切に表示されるためのより良い解決策だと思います。
Alexis Wilke、2016

11

これが可能な解決策です:

スニペット:

ul {
  width: 760px;
  margin-bottom: 20px;
  overflow: hidden;
  border-top: 1px solid #ccc;
}
li {
  line-height: 1.5em;
  border-bottom: 1px solid #ccc;
  float: left;
  display: inline;
}
#double li {
  width: 50%;
}
<ul id="double">
  <li>first</li>
  <li>second</li>
  <li>third</li>
  <li>fourth</li>
</ul>

そしてそれが行われます。
3列の場合はli幅を33%として使用し、4列の場合は25%を使用します。


5

これが最も簡単な方法です。CSSのみ。

  1. ul要素に幅を追加します。
  2. 新しい列のdisplay:inline-blockと幅を追加します(ulの幅の半分未満にする必要があります)。
ul.list {
  width: 300px;  
}

ul.list li{
  display:inline-block;
  width: 100px;
}
<ul class="list">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

2
現在の問題を修正する方法で、この答えのヘルプOPのための答えを持ついくつかの説明を追加
ρяσѕρєяK

4

CSSは 2列以上の設定にのみ使用できます

AE

B

C

D

 <ul class="columns">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

ul.columns  {
   -webkit-columns: 60px 2;
   -moz-columns: 60px 2;
    columns: 60px 2;
   -moz-column-fill: auto;
   column-fill: auto;
 }

3

これは、親divのcolumn-count cssプロパティを使用して実現できます。

お気に入り

 column-count:2;

詳細はこちらをご覧ください。

フローティングDIVリストを行ではなく列に表示する方法


1
column-countアイテムが正しい順序で表示されません。たとえば、最初の行の目的の表示はA B(2番目の要素は右側に追加する必要があります)ですが、使用するcolumn-count場合はになりますA E
パオロモレッティ2014

2

これは、jQuery-Columnsプラグインを使用して本当に簡単に行うことができます。たとえば、ulを.mylistのクラスで分割します。

$('.mylist').cols(2);

ここだjsfiddle上の実際の例

CSSソリューションではすべてが上に垂直に配置されるわけではないので、CSSを使用するよりもこれが好きです。


興味深いですが、実際には<ul>リストが複数のリストに分類されています...それは他のことを複雑にする可能性があります。
Alexis Wilke、2016

これは実際に私が感謝した後の解決策でした。反対投票の結果、OPの質問を読んでDVを行う必要がなかった場合、この回答は有効です。
トリッキー2016年

2

数年後にもう1つ回答が得られます。

この記事の内容: http : //csswizardry.com/2010/02/mutiple-column-lists-using-one-ul/

HTML:

<ul id="double"> <!-- Alter ID accordingly -->
  <li>CSS</li>
  <li>XHTML</li>
  <li>Semantics</li>
  <li>Accessibility</li>
  <li>Usability</li>
  <li>Web Standards</li>
  <li>PHP</li>
  <li>Typography</li>
  <li>Grids</li>
  <li>CSS3</li>
  <li>HTML5</li>
  <li>UI</li>
</ul>

CSS:

ul{
  width:760px;
  margin-bottom:20px;
  overflow:hidden;
  border-top:1px solid #ccc;
}
li{
  line-height:1.5em;
  border-bottom:1px solid #ccc;
  float:left;
  display:inline;
}
#double li  { width:50%;}
#triple li  { width:33.333%; }
#quad li    { width:25%; }
#six li     { width:16.666%; }

1

updateColumns()必要if (column >= columns.length)ではなく、if (column > columns.length)(Cは、例えばスキップされる)ので、すべての要素をリストします。

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

http://jsfiddle.net/e2vH9/1/



1

ページの複数のリストに影響を与えたかったので、トップアンサーのレガシーソリューションは機能しませんでした。回答は単一のリストに加えて、かなりのグローバルステートを使用していると想定しています。この場合、私は内のすべてのリストを変更したいと思いました<section class="list-content">

const columns = 2;
$("section.list-content").each(function (index, element) {
    let section = $(element);
    let items = section.find("ul li").detach();
    section.find("ul").detach();
    for (let i = 0; i < columns; i++) {
        section.append("<ul></ul>");
    }
    let lists = section.find("ul");
    for (let i = 0; i < items.length; i++) {
        lists.get(i % columns).append(items[i]);
    }
});

たとえば、2つの列を生成するにはどうすればよいですか。1つはタイルのみを含み、もう1つは順序付けられていないリストを含みます。
Dalek

どういう意味かよくわかりません。タイトル付きのアイテムのシリーズがある場合、タイトル、アイテム、タイトル、アイテムの1つのリストにそれらを配置できます。これでうまくいくはずです。
トム・

1

ガブリエルの答えはある程度うまくいきましたが、リストを縦に並べようとしたときに次のことがわかりました(最初のul ADと2番目のul EG)。

  • ulに偶数のliが含まれている場合、ul全体に均等に広がりませんでした。
  • ulでdata-columnを使用してもうまく機能しないようでした。3カラムに4を配置する必要があり、それでもなお、JSによって生成されたulの2つにliを広げるだけでした。

上記がうまく行かないように、jQueryを修正しました。

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

    $(setupColumns);
})(jQuery);
.customcolumns {
  float: left;
  position: relative;
  margin-right: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <ul class="customcolumns" data-columns="3">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
    <li>F</li>
    <li>G</li>
    <li>H</li>
    <li>I</li>
    <li>J</li>
    <li>K</li>
    <li>L</li>
    <li>M</li>
  </ul>
</div>

-1

Thisdは私にとって完璧なソリューションでした。

http://css-tricks.com/forums/topic/two-column-unordered-list/


3
「常に標的部位に到達できないか、永続的にオフラインになった場合には、重要なリンクの最も関連する部分を引用し、」 - stackoverflow.com/help/how-to-answer
Sk8erPeter

必要ありません。これは、Abdul彼の回答で使用されているコードのリンク/参照であり、使用されている幅とIDと同じです。
cssyphus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.