44 votes

html css - comment créer une liste à colonnes multiples ?

J'ai une "liste ordonnée" qui contient environ 100 "éléments de liste". Cette liste rend ma page très longue et les utilisateurs doivent faire défiler la page trop souvent.

Comment puis-je faire en sorte que l'UL s'affiche comme ceci :

1.           6.           11.
2.           7.           12.
3.           8.           13.
4.           9.           14.
5.          10.           15.

0 votes

Que représente la ligne de 1. au milieu ? la rupture de colonne ?

1 votes

@Alistair : Je pense que c'était censé être 6, 7, 8, 9 et 10.

0 votes

C'était un bug dans stack overflow, ça a changé ce que j'avais écrit.

34voto

Enrico Carlesso Points 3182

Si pour vous l'ordre vertical ne compte pas, mais seulement la mise en page :

1.      2.      3.       4.
5.      6.      7.       8.
9.      10.     11.      12.

Vous pouvez simplement définir les éléments li de cette manière :

li {
    display: block;
    width: 25%;
    float: left;
}

Cela devrait fonctionner. Si vous avez besoin de les avoir en ordre vertical, vous devez agir dans le php script en les divs séparés et ensuite les flotter.

0 votes

Y a-t-il un moyen de les mettre en ordre vertical en utilisant css/html ? sans avoir à les séparer ?

1 votes

Pour autant que je sache, non. Comme mentionné, lorsque le mode colonne css3 sera supporté, ce sera une tâche facile, mais toutes les astuces que je me demande nécessitent de briser la page d'une manière ou d'une autre.

1 votes

Il semble y avoir un problème si, par exemple, l'élément 3 a une hauteur de 2 lignes, et l'élément 4 a une hauteur de 5 lignes, etc., alors il y aura de grands espaces entre l'élément 1 et l'élément 5, alors que l'arrangement vertical peut avoir toujours une ligne vide entre l'élément 1 et l'élément 5.

21voto

Knu Points 8385

1 votes

En d'autres termes, non soutenu par l'I.E. (comme d'habitude).

0 votes

IE 10 et 11 ont un support complet, tandis que Mozilla et Webkit (Safari et Chrome) ont un support partiel.

1 votes

Pourriez-vous fournir un exemple de travail utilisant le module de colonne css3 ?

9voto

Michiel Points 1209

Il y avait un article sur A List Apart il y a quelque temps, qui traitait exactement de cette question. Je suppose que si ce qui y est mentionné ne suffit pas, vous pouvez bien sûr toujours recourir au codage côté serveur ou côté client pour diviser automatiquement la liste en trois parties.

5voto

blocks Points 316

J'ai pu obtenir le bon ordonnancement avec un peu de jQuery :

function splitList($list, n) {
    var i, k;
    var colHeight = Math.ceil($list.children().length / n)
    var colWidth = Math.floor(100 / n) + "%"

    for (i = 0; i < n; i++) {
        $list.append("<ul class='liCol'></ul>")
        for (k = 0; k < colHeight; k++) {
            $list.children("li").eq(0).appendTo(".liCol:last")          
        }   
    }

    $(".liCol").css("width", colWidth)
    $list.show() // list originally hidden to avoid displaying before ready
}

styles de base pour .liCol :

.liCol {
    padding: 0px;
    margin: 0px;
    float: left;
}

0 votes

Il s'agit d'une excellente solution, notamment pour un CMS où vous ne souhaitez pas coder en dur le balisage du menu (afin de permettre à l'utilisateur final d'ajouter ultérieurement d'autres liens au menu).

1voto

Herman Points 52

J'ai créé une solution qui fonctionne également pour les listes ordonnées (numérotées). Ces listes doivent continuer à être numérotées dans les colonnes.

Ajoutez le script suivant à votre page (peu importe l'endroit, le mieux est dans un fichier js séparé) :

<script type="text/javascript">
// As soon as the document's structure has been loaded:
document.addEventListener( "DOMContentLoaded", function() {
    // For each html elem:
    elems = document.getElementsByTagName("*"); // OL and UL wanted: chose all (*) here and select later.
    for ( var e = 0; e < elems.length; e++ ) {
        // Check if elem is a list (ordered/unordered) and has class name "cols":
        if ( ( elems[e].tagName == "OL" || elems[e].tagName == "UL" ) && elems[e].className.search("cols") > -1 ) {
            // Collect list items and number of columns (from the rel attribute):
            var list = elems[e];
            var listItems = list.getElementsByTagName("LI");
            var Ncols = list.getAttribute("rel")*1; // *1 converts rel from string to int.
            // Determine total number of items, items per column and column width:
            var Ntotal = listItems.length;
            var Npercol = Math.ceil( Ntotal/Ncols );
            var colWidth = Math.floor( 100/Ncols )+"%";
            // For each column:
            for ( var c = 0; c < Ncols; c++ ) {
                // Create column div:
                var colDiv = document.createElement("DIV");
                colDiv.style.cssFloat = "left";
                colDiv.style.width = colWidth;
                // Add list items to column div:
                var i_start = c*Npercol;
                var i_end = Math.min( (c+1)*Npercol, Ntotal );
                for ( var i = i_start; i < i_end; i++ )
                    colDiv.appendChild( listItems[0] ); // Using listItems[0] instead of listItems[i], because items are moved to colDiv!
                // Add column div to list:  
                list.appendChild( colDiv );
            }
        }
    }
} );
</script>

Ensuite, vous pouvez simplement créer des listes à colonnes multiples comme ceci :

<ol class="cols" rel="3">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
    <li>F</li>
    <li>G</li>
</ol>

Donc, il suffit de définir class="cols" et rel="[number_of_columns]" et le script fera le reste !

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