La liste ordonnée HTML 1.1, 1.2 (compteurs imbriqués et portée) ne fonctionne pas


87

J'utilise des compteurs imbriqués et une portée pour créer une liste ordonnée:

ol {
    counter-reset: item;
    padding-left: 10px;
}
li {
    display: block
}
li:before {
    content: counters(item, ".") " ";
    counter-increment: item
}
<ol>
    <li>one</li>
    <li>two</li>
    <ol>
        <li>two.one</li>
        <li>two.two</li>
        <li>two.three</li>
    </ol>
    <li>three</li>
    <ol>
        <li>three.one</li>
        <li>three.two</li>
        <ol>
            <li>three.two.one</li>
            <li>three.two.two</li>
        </ol>
    </ol>
    <li>four</li>
</ol>

J'attends le résultat suivant:

1. one
2. two
  2.1. two.one
  2.2. two.two
  2.3. two.three
3. three
  3.1 three.one
  3.2 three.two
    3.2.1 three.two.one
    3.2.2 three.two.two
4. four

Au lieu de cela, voici ce que je vois (mauvaise numérotation) :

1. one
2. two
  2.1. two.one
  2.2. two.two
  2.3. two.three
2.4 three <!-- this is where it goes wrong, when going back to the parent -->
  2.1 three.one
  2.2 three.two
    2.2.1 three.two.one
    2.2.2 three.two.two
2.3 four

Je n'ai aucune idée, est-ce que quelqu'un voit où ça va mal?

Voici un JSFiddle: http://jsfiddle.net/qGCUk/2/

Réponses:


102

Décochez "normaliser CSS" - http://jsfiddle.net/qGCUk/3/ La réinitialisation CSS utilisée dans qui définit par défaut toutes les marges et les rembourrages de la liste à 0

UPDATE http://jsfiddle.net/qGCUk/4/ - vous devez inclure vos sous-listes dans votre<li>

ol {
  counter-reset: item
}
li {
  display: block
}
li:before {
  content: counters(item, ".") " ";
  counter-increment: item
}
<ol>
  <li>one</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
</ol>


2
Comment faire suivre son index avec un point - comme 1.> 1.1. 1.2. 1.3.et ainsi de suite?
URL87

2
Assurez-vous simplement de corriger les sélecteurs css afin que cela n'affecte pas des choses comme les listes de navigation.
Okomikeruko

@Okomikeruko Que signifie «réparer les sélecteurs css»? Parce que j'exécute exactement le problème auquel vous avez fait allusion - cette astuce n'affecte pas seulement la liste numérotée pour laquelle je veux l'utiliser, mais aussi les autres listes de mon HTML. : - \ Nevermind: La réponse de Moshe Simantov corrige cela. :)
antred le

1
Les attributs d'élément @antred aiment idet classvous permettent de définir des css spécifiques à ces éléments avec des sélecteurs. Si vous utilisez une couverture li, ul, oletc, le css affecte toutes les instances de celui - ci. Mais si vous définissez votre élément sur <ol class="cleared">et votre sélecteur css sur ol.cleared, vous n'affectez pas olinutilement les autres éléments.
Okomikeruko le

64

Utilisez ce style pour modifier uniquement les listes imbriquées:

ol {
    counter-reset: item;
}

ol > li {
    counter-increment: item;
}

ol ol > li {
    display: block;
}

ol ol > li:before {
    content: counters(item, ".") ". ";
    margin-left: -20px;
}

2
Génial! Cela a fonctionné hors de la boîte pour moi! Toda.
yO_

3
C'est la meilleure réponse car elle a également le premier niveau avec un point et incrusté le contenu.
Martin Eckleben le

si j'ajoute font-weight: boldaux ol ol > li:beforecompteurs de la liste imbriquée boldmais que cela ne fait pas les compteurs de la liste de premier niveau bold?
Sushmit Sagar le

14

Regarde ça :

http://jsfiddle.net/PTbGc/

Votre problème semble avoir été résolu.


Ce qui me ressort (sous Chrome et Mac OS X)

1. one
2. two
  2.1. two.one
  2.2. two.two
  2.3. two.three
3. three
  3.1 three.one
  3.2 three.two
    3.2.1 three.two.one
    3.2.2 three.two.two
4. four

Comment je l'ai fait


Au lieu de :

<li>Item 1</li>
<li>Item 2</li>
   <ol>
        <li>Subitem 1</li>
        <li>Subitem 2</li>
   </ol>

Faire :

<li>Item 1</li>
<li>Item 2
   <ol>
        <li>Subitem 1</li>
        <li>Subitem 2</li>
   </ol>
</li>

7

C'est une excellente solution! Avec quelques règles CSS supplémentaires, vous pouvez le formater comme une liste de plan MS Word avec un retrait de première ligne suspendu:

OL { 
  counter-reset: item; 
}
LI { 
  display: block; 
}
LI:before { 
  content: counters(item, ".") "."; 
  counter-increment: item; 
  padding-right:10px; 
  margin-left:-20px;
}

2
Le problème avec cette approche est que vous ne pouvez pas copier les numéros de liste. Donc, si vous copiez une énorme liste, ce sera sans numéros
Rohit

1

J'ai rencontré un problème similaire récemment. Le correctif consiste à définir la propriété d'affichage des éléments li dans la liste ordonnée sur list-item, et non sur display block, et à s'assurer que la propriété display de ol n'est pas list-item. c'est à dire

li { display: list-item;}

Avec cela, l'analyseur html voit all li comme l'élément de liste et lui attribue la valeur appropriée, et voit l'ol, comme un élément de bloc ou de bloc en ligne basé sur vos paramètres, et n'essaye pas d'attribuer une valeur de comptage à il.


Cela duplique la numérotation.
TylerH

0

La solution de Moshe est excellente, mais le problème peut toujours exister si vous devez placer la liste dans un fichier div. (lire: réinitialisation du compteur CSS sur la liste imbriquée )

Ce style pourrait éviter ce problème:

ol > li {
    counter-increment: item;
}

ol > li:first-child {
  counter-reset: item;
}

ol ol > li {
    display: block;
}

ol ol > li:before {
    content: counters(item, ".") ". ";
    margin-left: -20px;
}
<ol>
  <li>list not nested in div</li>
</ol>

<hr>

<div>
  <ol>
  <li>nested in div</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
  </ol>
</div>

Vous pouvez également activer la réinitialisation du compteur li:before.


que faire si je ne veux pas la fin .de la liste imbriquée mais la liste racine?
Sushmit Sagar le

0

Après avoir parcouru d'autres réponses, j'ai trouvé ceci, appliquez simplement la classe nested-counter-listà la olbalise racine :

code sass:

ol.nested-counter-list {
  counter-reset: item;

  li {
    display: block;

    &::before {
      content: counters(item, ".") ". ";
      counter-increment: item;
      font-weight: bold;
    }
  }

  ol {
    counter-reset: item;

    & > li {
      display: block;

      &::before {
        content: counters(item, ".") " ";
        counter-increment: item;
        font-weight: bold;
      }
    }
  }
}

code css :

ol.nested-counter-list {
  counter-reset: item;
}
ol.nested-counter-list li {
  display: block;
}
ol.nested-counter-list li::before {
  content: counters(item, ".") ". ";
  counter-increment: item;
  font-weight: bold;
}
ol.nested-counter-list ol {
  counter-reset: item;
}
ol.nested-counter-list ol > li {
  display: block;
}
ol.nested-counter-list ol > li::before {
  content: counters(item, ".") " ";
  counter-increment: item;
  font-weight: bold;
}

ol.nested-counter-list {
  counter-reset: item;
}

ol.nested-counter-list li {
  display: block;
}

ol.nested-counter-list li::before {
  content: counters(item, ".") ". ";
  counter-increment: item;
  font-weight: bold;
}

ol.nested-counter-list ol {
  counter-reset: item;
}

ol.nested-counter-list ol>li {
  display: block;
}

ol.nested-counter-list ol>li::before {
  content: counters(item, ".") " ";
  counter-increment: item;
  font-weight: bold;
}
<ol class="nested-counter-list">
  <li>one</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
</ol>

Et si vous avez besoin d'une fin .à la fin des compteurs de la liste imbriquée, utilisez ceci:

ol.nested-counter-list {
  counter-reset: item;
}

ol.nested-counter-list li {
  display: block;
}

ol.nested-counter-list li::before {
  content: counters(item, ".") ". ";
  counter-increment: item;
  font-weight: bold;
}

ol.nested-counter-list ol {
  counter-reset: item;
}
<ol class="nested-counter-list">
  <li>one</li>
  <li>two
    <ol>
      <li>two.one</li>
      <li>two.two</li>
      <li>two.three</li>
    </ol>
  </li>
  <li>three
    <ol>
      <li>three.one</li>
      <li>three.two
        <ol>
          <li>three.two.one</li>
          <li>three.two.two</li>
        </ol>
      </li>
    </ol>
  </li>
  <li>four</li>
</ol>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.