web-dev-qa-db-fra.com

Comment afficher une liste sur deux lignes?

J'ai une liste d'éléments que je veux insérer dans un espace contraint verticalement:

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
    <li>Six</li>
</ul>

Puisque je ne veux pas que la liste ait plus d'une hauteur spécifique, mais que je suis libre de l'étendre horizontalement, je veux la diviser en colonnes, comme ceci:

One    Two     Three
Four   Five    Six

Ou, alternativement (dans mon cas, l'ordre n'est pas important)

One    Three   Five
Two    Four    Six

La propriété css column-count permet de diviser une liste en colonnes, mais elle n'accepte qu'un nombre fixe de colonnes. Je ne connais pas le nombre d'éléments que je vais avoir (il peut aller de 1 à plus de 40), donc si je règle le nombre de colonnes à 3, toute liste de plus de 6 éléments sera trop élevée, et s'il n'y a que 4 éléments, seule la première colonne aura deux éléments et elle aura un aspect inégal.

Donc, idéalement, j'aurais besoin d'une propriété row-count, mais elle n'existe pas. J'imagine que je peux aussi le faire en Javascript, mais je recherche une solution uniquement en CSS.

J'ai essayé quelque chose: float:left sur chaque li met la liste dans une ligne. Pour le diviser en deux lignes, il me faudrait non appliquer float:left à l'élément N/2. Je ne sais pas comment faire ça.

Je sais aussi que je peux le faire en le divisant en plusieurs ul, chacun avec deux li et float:left entre eux, mais je voudrais éviter de gâcher le code HTML pour quelque chose de complètement présenté.

Est-ce que quelqu'un a une solution à ce problème?

Edit: Je pense que je n'ai pas été clair dans l'explication de mes besoins. Je veux que la liste soit triée dans les colonnes sans savoir combien d’éléments je vais avoir, et afin que j’aie toujours deux rangées.

Donc, par exemple avec 7 éléments, je veux avoir:

One    Two     Three   Four
Five   Six     Seven

Et avec 3 articles:

One    Two
Three  
19
Cyrille Ka

Voici un moyen simple de le faire en utilisant jQuery. Je sais qu'il est mentionné qu'une méthode CSS est nécessaire, mais ceci est juste pour référence future si quelqu'un veut se référer à cette question.

Obtenez le nombre d'éléments LI et divisez-le par le nombre de lignes et définissez cette valeur sur la propriété count-column.

Jquery

$(document).ready(function() {
var numitems =  $("#myList li").length;

$("ul#myList").css("column-count",Math.round(numitems/2));
});

CSS

ul {
  width: 900px;
}
li {
width: 75px;
height: 75px;
margin-top: 10px;
margin-right: 10px;
display: inline-block;
}

HTML

<ul id="myList">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
<li>Five</li>
<li>Six</li>
<li>Seven</li>
<li>Eight</li>
<li>Nine</li>    
</ul>

Fiddle ici

MODIFIER:

Même implémentation en javascript simple.

var ul = document.getElementById("myList");
var li = ul.getElementsByTagName("li");
var numItems = li.length;

var css = document.createElement("style");
css.type = "text/css";
css.innerHTML = "ul { column-count: " + Math.round(numItems/2) + "; }";
document.body.appendChild(css);

Vous devez définir la largeur de UL, car le nombre de lignes dépendra de la largeur, même après la définition du nombre de colonnes. Vous pouvez également le définir sur 100%, mais le nombre de lignes changera en fonction de la taille de la fenêtre. Pour limiter le nombre de lignes à 2, une largeur fixe pour UL peut être requise.

12
Poornima

Vous pouvez définir votre li à 33% de la largeur et flotter les uns contre les autres. Une fois qu’il n’ya plus assez de place dans une rangée, ils sont abaissés par rangées de 3 de largeur égale.

ul li{
  width: 33%;
  float: left;
}
7
user1620090

Pourquoi ne pas lui donner un max-width?

ul {
  max-width: somevalue; // which would last when the third item ends
}

Ou, vous pouvez leur ajouter une classe comme

<ul>
    <li class="one">One</li>
    <li class="one">Two</li>
    <li class="one">Three</li>
    <li class="two">Four</li>
    <li class="two">Five</li>
    <li class="two">Six</li>
</ul>

Maintenant CSS comme:

.one {
  display: inline;
}

.two {
  display: inline;
}

La dernière chose du rembourrage est aussi

ul li {
  padding: somevalue;
} 

Et pour trancher: 

ul {
  max-width: 200px; // to break the list
}

La bonne chance pour vous serait que vous puissiez d'abord vérifier la largeur de la liste! Puis coupez-le en deux parties égales à l'aide de JS, puis appliquez-le.

Si vous voulez obtenir le calculateur CSS, utilisez ceci:

width: calc(var1 + var2); // calc will do the math..

Voici le violon pour cette situation: http://jsfiddle.net/afzaal_ahmad_zeeshan/xN87Q/

2

vous pouvez utiliser

li:nth-child(even) 

li:nth-child(odd)

http://jsfiddle.net/nCmZT/

1
user3037493

Source: Création d'une liste non ordonnée à deux colonnes

Violon: Démo fournie dans le lien

HMTL

<ul class="two-col-special">
    <li>First Category</li>
    <li>Second Category</li>
    <li>Third Category</li>
    <li>Fourth Category</li>
    <li>Fifth Category</li>
</ul>

CSS

.two-col-special {
    border: 1px dotted blue;
    overflow: auto;
    margin: 0;
    padding: 0;
}

.two-col-special li {
    display: inline-block;
    width: 45%;
    margin: 0;
    padding: 0;
    vertical-align: top; /* In case multi-Word categories form two lines */
}
.two-col-special li:before {
    content: '+';
    padding: 5px;
    margin-right: 5px; /* you can Tweak the gap */
    color: orange;
    background-color: white; /* in case you want a color... */
    display: inline-block;
}
1

Voici un exemple utilisant display: flex et flex-direction: row pour changer l'ordre des colonnes en lignes:

#list-1 {
  border: 3px solid red;
  columns: 2;
  column-gap: 5px;
  width: 200px;
}

#list-2 {
  border: 3px solid blue;
  columns: 2;
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  height: auto; /* can change this */
  width: 200px;
}

#list-2 li {
  width: 100px;
  height: auto;
}
<ul id="list-1">
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
<li>f</li>
<li>g</li>
</ul>

<ul id="list-2">
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
<li>f</li>
<li>g</li>
</ul>

0
Ethan Ryan