303 votes

Comment afficher une liste non ordonnée en deux c

Avec le code HTML suivant, quelle est la méthode la plus simple 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 souhaité :

A B
C D
E

La solution doit fonctionner avec Internet Explorer.

525voto

Gabriel Points 5234

Navigateurs modernes

tirez parti du module colonnes css3 pour prendre en charge 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/

Anciens navigateurs

Malheureusement, pour le support d'IE, vous aurez besoin d'une solution de code qui implique le JavaScript et la manipulation des domaines. Cela signifie que chaque fois que le contenu de la liste change, vous devrez effectuer l'opération de réorganisation de la liste en colonnes et de réimpression. La solution ci-dessous utilise jQuery pour des raisons de concision.

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

EDITAR:

Comme indiqué ci-dessous, les colonnes seront ordonnées comme suit :

A  E
B  F
C  G
D

alors que le PO demandait une variante correspondant à ce qui suit :

A  B
C  D
E  F
G

Pour réaliser cette variante, il suffit de modifier le code comme suit :

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

4 votes

Vous n'affichez pas les articles dans le bon ordre : jsfiddle.net/HP85j/258 Par exemple, l'affichage souhaité sur la première ligne est le suivant A B (le deuxième élément doit être ajouté à droite), mais dans vos exemples c'est A E .

1 votes

Bon travail, bien que la logique soit défectueuse s'il y a plus de 2 colonnes, j'ai créé le correctif ici : jsfiddle.net/HP85j/393

2 votes

Les balles sont manquantes

100voto

Winnifred Points 36

J'ai étudié la solution de @jaider, qui a fonctionné, mais je propose une approche légèrement différente, qui me semble plus facile à mettre en œuvre et qui s'est avérée efficace sur tous 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, les listes non ordonnées affichent la position de la puce à l'extérieur, mais dans certains navigateurs, cela peut poser des problèmes d'affichage en fonction de la manière dont le navigateur met en page votre site Web.

Pour qu'il s'affiche dans le format :

A B
C D
E

etc., utilisez ce qui suit :

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 d'affichage des colonnes. Bonne continuation et merci @jaider car votre réponse m'a permis de découvrir cela.

5 votes

Il y a un problème avec cette méthode. Elle fonctionne très bien pour afficher des éléments de liste très courts (1 caractère dans cet exemple). Si vous créez une liste avec des descriptions plus longues, la deuxième colonne se superpose à la première et déborde du conteneur ul.

2 votes

Je l'ai légèrement modifié en changeant float : left en display : inline-block pour les éléments li, mais sinon, cela a fonctionné à merveille pour moi.

47voto

Jayx Points 1139

J'ai essayé de poster ce message en tant que commentaire, mais je n'ai pas réussi à afficher les colonnes correctement (comme dans votre question).

Vous demandez :

A B

C D

E

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

A D

B E

C

... donc soit la réponse est incorrecte, soit la question l'est.

Une solution très simple serait de définir la largeur de votre <ul> et ensuite flotter et définir la largeur de votre <li> comme suit

<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 le manque de support d'IE).

0 votes

@Gabriel votre solution et le comportement est bon et comme prévu, donc je ne cherche pas à frapper votre réponse hey .... Je pense simplement que la question a pu être mal interprétée ... de toute façon - la question a été répondue, peu importe quelle est la bonne question :D

20voto

Jaider Points 2366

J'aime la solution pour les navigateurs modernes, mais les puces manquent, alors je l'ajoute 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

0 votes

Ici, nous pouvons changer la couleur des éléments sans changer la couleur de la balle. jsfiddle.net/HP85j/444

3 votes

Je pense list-style-position: inside; est une meilleure solution pour que les balles s'affichent correctement.

15voto

Abdul Points 31

Voici une solution possible :

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>

Et c'est fait.
Pour 3 colonnes, utilisez li pour une largeur de 33%, pour 4 colonnes, utilisez 25% et ainsi de suite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X