web-dev-qa-db-ja.com

番号なしリストを2列に表示する方法

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

187
atp03

現代のブラウザ

あなたが探しているものをサポートするために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;
}

編集:

以下に指摘するように、これは列を以下のように並べるでしょう:

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

私はうまくいった@ 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はこれを発見するために私を導くのを助けました。

76
Winnifred

私はこれをコメントとして投稿しようとしましたが、(あなたの質問のとおりに)列を正しく表示することができませんでした。

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

A B

C D

E

...しかし、解決策として受け入れられる答えは戻るでしょう:

A D

B E

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修正で)以前の答えが当てはまります。

38
Jayx

私は現代のブラウザのための解決策が好きです、しかし弾丸が欠けているので、私はそれを少しトリックを加える:

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

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


li:before {
  content: "• ";
}

enter image description here

13
Jaider

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

抜粋:

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%を使用します。

10
Abdul

これが最も簡単な方法です。 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>
4
Aviv Shaal

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

好き

 column-count:2;

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

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

3
maximus ツ

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

A E

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
Bouhejba zied

数年後のもう一つの答え!

この記事の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%; }
2
user3632930

例えば、 jQuery-Columnsプラグイン を使えば、これを簡単に行うことができます。例えば、ulを.mylistのクラスに分割する場合は、

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

これがjsfiddleの ライブサンプルです

CSSソリューションでは、すべてが上に垂直に並んでいるわけではないので、私はCSSよりもこれが好きです。

2
newUserNameHere

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
Daver

私はページ上の複数のリストに影響を与えたいと思っていたため、トップの答えのレガシーな解決策は私にはうまくいきませんでした。この場合、私は<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]);
    }
});
1
Tom

ブートストラップで...この答え( https://stackoverflow.com/a/23005046/1128742 )は、この解決策に向けて私が指摘してくれました:

<ul class="list-unstyled row">
   <li class="col-xs-6">Item 1</li>
   <li class="col-xs-6">Item 2</li>
   <li class="col-xs-6">Item 3</li>
</ul>

http://jsfiddle.net/patrickbad767/472r0ynf/

0
patrickbadley