Wie zeige ich eine ungeordnete Liste in zwei Spalten an?

215

Was ist mit dem folgenden HTML die einfachste Methode, um die Liste als zwei Spalten anzuzeigen?

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

Gewünschte Anzeige:

A B
C D
E

Die Lösung muss in Internet Explorer funktionieren können.

atp03
quelle
1
Hier ist ein Live-Beispiel, wie man es einfach in jquery macht: jsfiddle.net/EebVF/5 Verwenden dieses jquery-Plugins: github.com/fzondlo/jquery-columns - das gefällt mir besser als mit CSS, da mit der CSS-Lösung nicht alles übereinstimmt senkrecht nach oben.
newUserNameHere

Antworten:

371

Moderne Browser

Nutzen Sie das CSS3-Spaltenmodul, um das zu unterstützen, wonach Sie suchen.

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

CSS:

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

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

Legacy-Browser

Leider benötigen Sie für die IE-Unterstützung eine Codelösung, die JavaScript- und Dom-Manipulationen umfasst. Dies bedeutet, dass Sie jedes Mal, wenn sich der Inhalt der Liste ändert, den Vorgang zum Neuordnen der Liste in Spalten und zum erneuten Drucken ausführen müssen. Die folgende Lösung verwendet der Kürze halber 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;
}

BEARBEITEN:

Wie unten ausgeführt, werden die Spalten wie folgt angeordnet:

A  E
B  F
C  G
D

während das OP nach einer Variante fragte, die der folgenden entspricht:

A  B
C  D
E  F
G

Um die Variante zu erreichen, ändern Sie einfach den Code wie folgt:

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column > columns.length){
            column = 0;
        }
        $(columns.get(column)).append(el);
        column += 1;
    });
}
Gabriel
quelle
2
Sie zeigen die Elemente nicht in der richtigen Reihenfolge an: jsfiddle.net/HP85j/258 Die gewünschte Anzeige in der ersten Zeile lautet beispielsweise A B(das zweite Element sollte rechts angehängt werden), in Ihren Beispielen jedoch A E.
Paolo Moretti
1
Großartige Arbeit, obwohl die Logik fehlerhaft ist, wenn mehr als 2 Spalten vorhanden sind, habe ich das Update
Tr1stan
2
Die Kugeln fehlen
Jaider
1
Es ist wahrscheinlich wahrscheinlicher, dass die Liste Spalte 1 vor Spalte 2 ausfüllt. Es ist möglicherweise einfacher, die Elemente der Liste einfach neu anzuordnen, sodass sie anscheinend vor dem Ausfüllen ausgefüllt werden. Dies kann natürlich eine Wiederholung erfordern, wenn sich die Liste ändert. Wie auch immer, Gabriels CSS-Antwort war genau das, was ich brauchte, danke!
Punstress
3
Nur ein spätes Update, ich glaube, die erste Option wird jetzt in modernen IE-Browsern funktionieren.
Fizz
82

Ich habe mir die Lösung von @ jaider angesehen, die funktioniert hat, aber ich biete einen etwas anderen Ansatz an, mit dem ich meiner Meinung nach einfacher arbeiten kann und der sich in allen Browsern als gut erwiesen hat.

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

Standardmäßig zeigt eine ungeordnete Liste die Position des Aufzählungszeichens außerhalb an. In einigen Browsern kann es jedoch zu Anzeigeproblemen kommen, die auf der Art und Weise beruhen, wie der Browser Ihre Website gestaltet.

So zeigen Sie es im folgenden Format an:

A B
C D
E

usw. Verwenden Sie Folgendes:

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

Dies sollte alle Ihre Probleme mit der Anzeige von Spalten lösen. Alles Gute und danke @jaider, da Ihre Antwort mir geholfen hat, dies zu entdecken.

Winnifred
quelle
3
Bei dieser Methode liegt ein Problem vor. Es eignet sich hervorragend zum Anzeigen sehr kurzer Listenelemente (in diesem Beispiel 1 Zeichen). Erstellen Sie eine Liste mit längeren Beschreibungen, und die zweite Spalte überlappt die erste und hat keinen ul-Container mehr.
Shaggy
1
Ich habe dies leicht angepasst, indem ich float geändert habe: left to display: Inline-Block für li-Elemente, ansonsten hat dies Wunder für mich gewirkt.
ZeRemz
41

Ich habe versucht, dies als Kommentar zu veröffentlichen, konnte jedoch die Spalten nicht richtig anzeigen (gemäß Ihrer Frage).

Sie fragen nach:

AB

CD

E.

... aber die als Lösung akzeptierte Antwort wird zurückkehren:

ANZEIGE

SEIN

C.

... also ist entweder die Antwort falsch oder die Frage ist.

Eine sehr einfache Lösung wäre, <ul>die Breite Ihrer <li>Artikel einzustellen und dann zu schweben und die Breite Ihrer Artikel so einzustellen

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

Beispiel hier http://jsfiddle.net/Jayx/Qbz9S/1/

Wenn Ihre Frage falsch ist, gelten die vorherigen Antworten (mit einem JS-Fix für mangelnde IE-Unterstützung).

Jayx
quelle
@Gabriel deine Lösung und das Verhalten ist gut und wie erwartet, also versuche ich nicht, deine Antwort anzuklopfen, hey ... Ich denke nur, dass die Frage falsch interpretiert worden sein könnte ... so oder so - die Frage wurde egal beantwortet Das ist die richtige Frage: D
Jayx
16

Ich mag die Lösung für moderne Browser, aber die Aufzählungszeichen fehlen, deshalb füge ich einen kleinen Trick hinzu:

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

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


li:before {
  content: "• ";
}

Geben Sie hier die Bildbeschreibung ein

Jaider
quelle
Hier können wir die Farbe der Elemente ändern, ohne die Farbe der Kugel zu ändern. Jsfiddle.net/HP85j/444
Jaider
3
Ich denke, es list-style-position: inside;ist eine bessere Lösung, wenn die Kugeln richtig angezeigt werden.
Alexis Wilke
11

Hier ist eine mögliche Lösung:

Snippet:

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>

Und es ist geschafft.
Verwenden Sie für 3 Spalten die liBreite 33%, für 4 Spalten 25% usw.

Abdul
quelle
5

Dies ist der einfachste Weg, dies zu tun. Nur CSS.

  1. füge dem ul-Element eine Breite hinzu.
  2. Anzeige hinzufügen: Inline-Block und Breite der neuen Spalte (sollte weniger als die Hälfte der ul-Breite betragen).
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>
Aviv Shaal
quelle
2
Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft
4

Sie können CSS nur verwenden , um zwei oder mehr Spalten festzulegen

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;
 }
Bouhejba zied
quelle
3

Dies kann mithilfe der CSS-Eigenschaft für die Spaltenanzahl auf dem übergeordneten div erreicht werden.

mögen

 column-count:2;

Überprüfen Sie dies für weitere Details.

So wird eine schwebende DIV-Liste in Spalten und nicht in Zeilen angezeigt

maximus ツ
quelle
1
column-countzeigt die Artikel nicht in der richtigen Reihenfolge an. Die gewünschte Anzeige in der ersten Zeile ist beispielsweise A B(das zweite Element sollte rechts angehängt werden), aber wenn Sie es verwenden column-count, wird es angezeigt A E.
Paolo Moretti
2

Sie können dies ganz einfach mit dem jQuery-Columns-Plugin tun, um beispielsweise eine ul mit einer Klasse von .mylist zu teilen, die Sie tun würden

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

Hier ist ein Live-Beispiel zu jsfiddle

Das gefällt mir besser als mit CSS, weil mit der CSS-Lösung nicht alles vertikal nach oben ausgerichtet ist.

newUserNameHere
quelle
Interessant, aber es zerlegt die <ul>Liste tatsächlich in mehrere Listen ... Das könnte andere Dinge komplizieren.
Alexis Wilke
Dies war eigentlich die Lösung, nach der ich dank des Downvotters gesucht habe. Diese Antwort ist gültig, wenn Sie die Frage des OP gelesen haben und DV nicht benötigt wurde.
Tricky
2

mehr eine Antwort nach ein paar Jahren!

in diesem Artikel: 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%; }
user3632930
quelle
1

In updateColumns()Not, if (column >= columns.length)anstatt if (column > columns.length)alle Elemente aufzulisten (C wird zum Beispiel übersprungen), also:

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/

Daver
quelle
1

Die Legacy-Lösung in der oberen Antwort hat bei mir nicht funktioniert, da ich mehrere Listen auf der Seite beeinflussen wollte und die Antwort eine einzelne Liste voraussetzt und ein gutes Stück globalen Status verwendet. In diesem Fall wollte ich jede Liste in einem ändern <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]);
    }
});
Tom
quelle
Wie ist es beispielsweise möglich, zwei Spalten zu generieren, von denen eine nur die Kachel und die andere eine ungeordnete Liste enthält?
Dalek
Ich bin mir nicht ganz sicher, was du meinst. Wenn Sie eine Reihe von Elementen mit Titeln haben, können Sie diese in eine einzelne Liste mit Titel, Element, Titel, Element einfügen. Dies sollte dann für Sie funktionieren.
Tom
1

Obwohl ich Gabriels Antwort auf die Arbeit bis zu einem gewissen Grad gefunden habe, habe ich beim Versuch, die Liste vertikal zu ordnen (erste ul AD und zweite ul EG), Folgendes gefunden:

  • Wenn die Ul eine gerade Anzahl von Li's hatte, verteilte sie sie nicht gleichmäßig über die Ul's
  • Die Verwendung der Datenspalte in der ul schien nicht sehr gut zu funktionieren, ich musste 4 für 3 Spalten setzen und selbst dann verteilte sie die Li nur noch in 2 der von der JS erzeugten ul

Ich habe die JQuery überarbeitet, damit das oben Genannte hoffentlich nicht passiert.

(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>
Anthony Medhurst
quelle