271 votes

Une liste ordonnée peut-elle produire un résultat qui ressemble à 1.1, 1.2, 1.3 (au lieu de 1, 2, 3, ...) avec css ?

Une liste ordonnée peut-elle produire des résultats ressemblant à 1.1, 1.2, 1.3 (au lieu de 1, 2, 3, ...) avec CSS ? Jusqu'à présent, l'utilisation de list-style-type:decimal n'a produit que 1, 2, 3, pas 1.1, 1.2., 1.3.

2 votes

Je vous suggère de comparer la réponse acceptée avec celle de Jakub Jirutka. Je pense que cette dernière est même bien meilleure.

0 votes

Solution élégante. Une idée de la raison pour laquelle Wikipedia utilise un ul pour ses sections de contenu au lieu de cette solution ?

1 votes

@davnicwil Je suis d'accord ; il semble que j'ai probablement appliqué le duplicata dans le mauvais ordre en septembre.

360voto

Gumbo Points 279147

Vous pouvez utiliser compteurs pour le faire :

La feuille de style suivante numérote les éléments de listes imbriquées comme "1", "1.1", "1.1.1", etc.

OL { counter-reset: item }
LI { display: block }
LI:before { content: counters(item, ".") " "; counter-increment: item }

Exemple

ol { counter-reset: item }
li{ display: block }
li:before { content: counters(item, ".") " "; counter-increment: item }

<ol>
  <li>li element
    <ol>
      <li>sub li element</li>
      <li>sub li element</li>
      <li>sub li element</li>
    </ol>
  </li>
  <li>li element</li>
  <li>li element
    <ol>
      <li>sub li element</li>
      <li>sub li element</li>
      <li>sub li element</li>
    </ol>
  </li>
</ol>

Voir Compteurs imbriqués et portée pour plus d'informations.

2 votes

Grande réponse. Quel est le support pour cela ?

1 votes

@Jason McCreary : Eh bien, c'est le mauvais côté : Les compteurs ne sont pas supportés dans IE jusqu'à la version 8 .

0 votes

Ohhh c'est sympa... mec... je ne connaissais aucune de ces possibilités. Je travaille dans mon design maintenant... la seule mauvaise chose à ce sujet est que l'algorithme insère un nouvel objet DOM avec le nombre 1.1, 1.2 etc à côté de l'objet <li> donc certains design peuvent être corrompus par cela, aussi vous devez mettre OL{list-style:none}

354voto

Jakub Jirutka Points 768

Aucune des solutions proposées sur cette page ne fonctionne correctement et universellement pour tous les niveaux et les longs paragraphes (enveloppés). Il est vraiment difficile d'obtenir une indentation cohérente en raison de la taille variable des marqueurs (1., 1.2, 1.10, 1.10.5, ) ; elle ne peut pas être simplement "simulée", même pas avec une marge/un renfort précalculé pour chaque niveau d'indentation possible.

J'ai finalement trouvé une solution qui fonctionne réellement et ne nécessite pas de JavaScript.

Il a été testé sur Firefox 32, Chromium 37, IE 9 et Android Browser. Ne fonctionne pas sur IE 7 et antérieur.

CSS:

ol {
  list-style-type: none;
  counter-reset: item;
  margin: 0;
  padding: 0;
}

ol > li {
  display: table;
  counter-increment: item;
  margin-bottom: 0.6em;
}

ol > li:before {
  content: counters(item, ".") ". ";
  display: table-cell;
  padding-right: 0.6em;    
}

li ol > li {
  margin: 0;
}

li ol > li:before {
  content: counters(item, ".") " ";
}

Exemple : Example

Essayez-le JSFiddle et de la fourchette. Gist .

2 votes

Bon travail pour obtenir ce type d'indentation. Je soutiens cependant que les deux premiers cas d'indentation que vous avez énumérés sont une question de préférence plutôt que de bien ou de mal. Considérez cas 1 et cas 2 -- Ce dernier parvient à intégrer beaucoup plus de niveaux avant que l'espacement ne devienne difficile à gérer, tout en conservant une apparence soignée. En outre, MS Word et style du navigateur par défaut Les deux utilisent l'indentation du cas 2. Je suppose qu'ils s'y prennent également mal ?

3 votes

@saul-fautley C'est faux en termes de typographie. Votre exemple avec un nombre insensé de niveaux imbriqués démontre que la numérotation imbriquée ne convient pas à un trop grand nombre de niveaux, mais c'est assez évident. MS Words n'est pas un système de composition, c'est un simple traitement de documents avec une mauvaise typographie. Le style par défaut du navigateur oh, vous ne connaissez pas grand chose à la typographie, n'est-ce pas ?

5 votes

Cela fonctionne vraiment (techniquement) pour tous les niveaux et les longs paragraphes. S'il est raisonnable d'utiliser une douzaine de niveaux, c'est une autre question qui n'a rien à voir avec la solution technique. Le fait est que vous n'avez pas à prédéfinir une règle CSS pour chaque niveau d'imbrication comme c'est le cas avec d'autres solutions.

75voto

Saul Fautley Points 148

La réponse choisie est un bon début, mais elle force essentiellement list-style-position: inside; sur les éléments de la liste, ce qui rend le texte enveloppé difficile à lire. Voici une solution de contournement simple qui permet également de contrôler la marge entre le numéro et le texte, et d'aligner le numéro à droite, conformément au comportement par défaut.

ol {
    counter-reset: item;
}
ol li {
    display: block;
    position: relative;
}
ol li:before {
    content: counters(item, ".")".";
    counter-increment: item;
    position: absolute;
    margin-right: 100%;
    right: 10px; /* space between number and text */
}

JSFiddle : http://jsfiddle.net/3J4Bu/

1 votes

L'inconvénient est qu'il ajoute un point à la fin de chaque élément de la liste.

4 votes

@Davin Studer : Il ajoute seulement un point à la fin de chaque numéro, comme par défaut. ol comportement. Il peut facilement être supprimé en supprimant le dernier fichier "." de la content mais ça me semble un peu bizarre.

8voto

KennyTM Points 232647

Note : Utilisez les CSS counter**s** pour créer une numérotation imbriquée dans un navigateur moderne. Voir la réponse acceptée. Ce qui suit n'a qu'un intérêt historique.


Si le navigateur prend en charge content et counter ,

.foo {
  counter-reset: foo;
}
.foo li {
  list-style-type: none;
}
.foo li::before {
  counter-increment: foo;
  content: "1." counter(foo) " ";
}

<ol class="foo">
  <li>uno</li>
  <li>dos</li>
  <li>tres</li>
  <li>cuatro</li>
</ol>

0 votes

Cette solution échoue terriblement lorsque les listes sont imbriquées.

0 votes

@LS Vous pouvez toujours adapter les sélecteurs à vos besoins. .foo > ol > li .

2 votes

Ce que je veux dire, c'est que vous avez codé en dur "1." dans le style. Que se passe-t-il lorsque la sous-liste est un enfant du deuxième élément de la liste parent ? Vous voulez qu'il apparaisse comme "2.", mais il sera toujours "1." en raison de la façon dont il est codé ici. Quelle est la solution ? Créer de nouveaux ensembles de styles pour chaque nombre possible ? Non. counters() comme dans les exemples ci-dessus, au lieu de la fonction counter() fonction.

2voto

hunter Points 33850

Ce n'est pas le cas :

http://www.w3schools.com/css/pr_list-style-type.asp

Je ne vois rien de tel qui soit soutenu par CSS3 soit :

http://www.css3.com/css-list-style-type/

mais vous pouvez utiliser le remise à zéro du compteur css comme décrit ici :

http://www.w3schools.com/css/pr_gen_counter-reset.asp

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