Comment afficher une liste non ordonnée en deux colonnes?

avec le HTML suivant, Quelle est la méthode la plus facile pour afficher la liste en deux colonnes?

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

affichage désiré:

A B
C D
E

la solution doit être capable de travailler sur Internet Explorer.

159
demandé sur TylerH 2013-02-07 10:50:56

13 réponses

Navigateurs Modernes

utilisez le module colonnes CSS3 pour supporter ce que vous recherchez.

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

CSS:

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

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

Navigateurs Traditionnels

malheureusement pour IE support vous aurez besoin d'une solution de code qui implique la manipulation JavaScript et dom. Cela signifie que chaque fois que le contenu de la liste change, vous devrez effectuer l'opération pour réorganiser la liste en colonnes et réimprimer. La solution ci-dessous utilise jQuery pour la brièveté.

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:

comme indiqué ci-dessous, ceci ordonnera les colonnes comme suit:

A  E
B  F
C  G
D

alors que L'OP demandait une variante correspondant à ce qui suit:

A  B
C  D
E  F
G

pour accomplir la variante vous changez simplement le code à ce qui suit:

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column > columns.length){
            column = 0;
        }
        $(columns.get(column)).append(el);
        column += 1;
    });
}
238
répondu Gabriel 2014-02-25 18:50:13

j'étais en train de regarder la solution de @jaider qui a fonctionné mais j'offre une approche légèrement différente qui je pense est plus facile à travailler et que j'ai vu pour être bon à travers les navigateurs.

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

par défaut liste non-ordonnée afficher la position de la puce à l'extérieur, mais puis dans certains navigateurs, il serait causer des problèmes d'affichage basé sur la façon dont le navigateur de la disposition de votre site web.

pour l'afficher dans le format:

A B
C D
E

etc. utilisez le texte suivant:

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

cela devrait résoudre tous vos problèmes avec l'affichage des colonnes. Tout le meilleur et merci @jaider car votre réponse a aidé à me guider pour découvrir cela.

67
répondu Winnifred 2017-09-03 13:27:45

j'ai essayé de poster ceci comme un commentaire, mais n'ai pas pu obtenir les colonnes pour afficher correctement (selon votre question).

vous demandez:

A B

C D

E

... mais la réponse acceptée comme solution reviendra:

A D

B E

C

... si la réponse est incorrecte ou la question est de.

une solution très simple serait de régler la largeur de votre <ul> puis flotter et régler la largeur de votre <li> articles comme ainsi

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

exemple ici http://jsfiddle.net/Jayx/Qbz9S/1 /

si votre question est fausse, alors les réponses précédentes s'appliquent (avec un correctif JS pour manque de support IE).

34
répondu Jayx 2013-02-08 09:20:05

j'aime la solution pour les navigateurs modernes, mais les balles sont manquantes, j'ai donc ajouter un petit truc:

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

12
répondu Jaider 2014-06-12 15:44:40

Voici une solution possible:

Extrait de:

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>

Et c'est fait.

Pour 3 colonnes utiliser li largeur comme 33%, pour 4 colonnes utiliser 25% et ainsi de suite.

9
répondu Abdul 2016-05-15 06:47:24

cela peut être réalisé en utilisant la propriété CSS de colonne-count sur parent div,

comme

 column-count:2;

Regardez ceci pour plus de détails.

comment faire apparaître la liste des DIV flottantes dans les colonnes, pas les lignes

3
répondu maximus ツ 2017-05-23 12:18:20

C'est la façon la plus simple de le faire. CSS seulement.

  1. ajouter de la largeur à l'élément ul.
  2. ajouter affichage: bloc en ligne et largeur de la nouvelle colonne (doit être inférieure à la moitié de la largeur 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>
3
répondu Aviv Shaal 2016-05-15 09:44:48

vous pouvez le faire très facilement avec le jQuery-colonnes Plugin par exemple pour diviser un ul avec une classe de .mylist vous le feriez

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

voici un live example sur jsfiddle

j'aime mieux cela qu'avec CSS parce qu'avec la solution CSS tout ne s'aligne pas verticalement vers le haut.

1
répondu newUserNameHere 2014-05-03 14:26:08

plus d'une réponse après quelques années!

dans cet article: 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
répondu user3632930 2014-07-21 20:36:57

Dans updateColumns() besoin if (column >= columns.length) plutôt que if (column > columns.length) pour obtenir la liste de tous les éléments (C est ignorée par exemple):

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 /

0
répondu Daver 2014-04-14 20:55:35

la solution d'héritage dans la réponse supérieure n'a pas fonctionné pour moi parce que je voulais affecter plusieurs listes sur la page et la réponse suppose une liste unique plus il utilise un peu d'état global. Dans ce cas, je voulais modifier chaque liste à l'intérieur d'un <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]);
    }
});
0
répondu Tom 2017-06-09 16:22:47

Avec Bootstrap... Cette réponse ( https://stackoverflow.com/a/23005046/1128742 ) m'a fait pointer vers cette solution:

<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 /

-1
répondu patrickbadley 2017-05-23 12:26:32

Thisd était une solution parfaite pour moi, à la recherche depuis des années:

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

-2
répondu rok 2014-05-23 08:29:02