2010-09-03 3 views
11

Je veux créer des listes imbriquées HTML qui a le format suivant:Comment créer une liste HTML 1.1, 1.2 1.3 ...?

1 
    1.1 
    1.2 
    1.3 
    1.4 
2 
    2.1 

J'ai essayé une solution que je trouve sur Internet:

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

Mais cela n'a pas fonctionné pour moi. Toute aide s'il vous plaît ??

Si la solution de compteur est trop compliqué, est-il un moyen de simuler l'effet de liste imbriquée, en les écrivant manuellement, mais en étant sûr que la mise en forme ressemble à une vraie liste


EDIT

besoin d'un soutien complet IE6

+1

Quel navigateur est-il ne fonctionne pas dans? Je l'ai vu travailler dans ce violon dans Firefox 3.6.8: http://jsfiddle.net/nWffg/ – Pat

+0

Je dois le faire fonctionner pour ie 6, 7, 8 – medusa

+4

Je ne pense pas que vous aurez jamais cela fonctionne dans IE6 en utilisant CSS seul. Vous pouvez faire une version JS uniquement qui va réparer les anciens navigateurs cassés, mais ce serait un très mauvais hack. –

Répondre

3

Cela devrait fonctionner. C'est un mauvais moyen de le faire mais si vous devez supporter IE6 pas beaucoup de choix.

 <ol> 
     <li><span>1</span> Item 
      <ol> 
      <li><span>1.1</span> Item</li> 
      <li><span>1.2</span> Item</li> 
      <li><span>1.3</span> Item</li> 
      <li><span>1.4</span> Item</li> 
      </ol> 
     </li>    
     <li><span>2</span> Item 
      <ol> 
      <li><span>2.1</span> Item</li> 
      </ol>    
     </li> 
     </ol> 

avec css

ol {list-style:none;} 

Après votre commentaire, je l'ai refait un peu.

<ol> 
    <li><span>1</span> Item 
     <ol> 
     <li><span>1.1</span> <p>ItemItemItem ItemItemItemItemItemItemItemItem ItemItemItemItemItemItemItemItem ItemItemItemItemItemItemItemItem</p></li> 
     <li><span>1.2</span> <p>ItemItemItem ItemItemItemItemItemItemItemItem ItemItemItemItemItemItemItemItem ItemItemItemItemItemItemItemItem</p></li> 
     <li><span>1.3</span> <p>ItemItemItem ItemItemItemItemItemItemItemItem ItemItemItemItemItemItemItemItem ItemItemItemItemItemItemItemItem</p></li> 
     <li><span>1.4</span> <p>Item</p></li> 
     </ol> 
    </li>    
    <li><span>2</span> Item 
     <ol> 
     <li><span>2.1</span> Item</li> 
     </ol>    
    </li> 
    </ol> 

Et le css serait

ol {list-style:none;} 
ol li span 
{ 
    display: block; 
    float: left; 
    width: 30px; 
} 
ol li 
{ 
clear:both; 
width: 400px; 

} 
ol li p 
{ 
    float: left; 
    width: 370px; 
    margin: 0; 

} 

Vous pourriez avoir à régler la largeur.

+0

non ça ne fonctionne pas parce que quand l'article est trop long, il se brise sur l'autre ligne et commence juste sous le numéro et non le texte. – medusa

0

fonctionne parfaitement pour moi, dans FF 3.6.6, donc:

  1. Dans quel navigateur ne fonctionne-t-il pas? À quoi ressemble votre balisage (c'est-à-dire, imbriquez-vous correctement les listes)?
+0

Je suis en train de tester avec IE. Le problème avec mon balisage pourrait être que j'ai un html qui a beaucoup de listes et je veux appliquer cet effet à certains d'entre eux qui ne sont pas les racines je veux dire: je ne veux pas que le compteur commence quand il commence obtient un élément ol. Puis-je utiliser différents noms de tag au lieu de ol et li pour cette liste que je veux imbriquer, dans le css et dans le balisage? – medusa

1

L'élément before ne fonctionne pas dans IE6, mais c'est la bonne façon de le faire. Je recommande d'utiliser IE7.js, une bibliothèque javascript qui fait IE6 se comporter comme IE7 où javascript et CSS sont concernés. Une autre façon pourrait être d'utiliser un hack javascript qui ne fonctionne que si le navigateur est IE6 et traverse de DOM en modifiant les éléments de la liste ...

En For A Beautiful Web vous trouverez plus d'informations concernant les sites compatibles IE6.

+0

Supposons que j'écris le js qui traverse le dom et trouve les éléments de la liste, quels attributs dois-je changer alors? – medusa

+0

Vous devez modifier le code HTML interne des éléments de la liste. Je vous recommande sérieusement d'inclure ie7.js dans votre page, c'est un hack bien fait qui fonctionne à merveille et vous permet de cibler de meilleurs navigateurs lors de la conception de votre page et émuler des fonctionnalités dans les navigateurs de la merde comme IE6. – Diego

10


cette réponse est pour la première question. Je suggère d'utiliser cette méthode si vous n'allez pas sous IE8 (IE7 =>?). pour ci-dessous IE7 vous pouvez utiliser la même logique avec jquery.

Original Post de
http://www.w3schools.com/cssref/pr_gen_counter-reset.asp

CSS

ul.numeric-decimals { counter-reset:section; list-style-type:none; } 
ul.numeric-decimals li { list-style-type:none; } 
ul.numeric-decimals li ul { counter-reset:subsection; } 
ul.numeric-decimals li:before{ 
    counter-increment:section; 
    content:counter(section) ". ";/*content:"Section " counter(section) ". ";*/ 
} 
ul.numeric-decimals li ul li:before { 
    counter-increment:subsection; 
    content:counter(section) "." counter(subsection) " "; 
} 

HTML

<ul class="numeric-decimals"> 
<li>Cats</li> 
<li>Dogs 
    <ul> 
     <li>Birds</li> 
     <li>Rats</li> 
    </ul> 
</li> 
<li>Rabbits</li> 
<li>Ants 
    <ul> 
     <li>Lions</li> 
     <li>Rats</li> 
    </ul> 
</li> 
<li>Ducks</li> 

+0

REMARQUE: L'OP indique qu'il doit prendre en charge IE6, 7 et 8, de sorte que votre réponse ne répond pas vraiment à leur question. ET soyez prévenus, les gens ici ne se soucient pas des références aux écoles W3 .... –

0

Cet exemple utilise l'attribut CSS spécifiques à IE6 behavior d'ajouter un marqueur statique avant chaque li. Il doit y avoir une magie spécifique à MS qui peut remplacer un tiret statique par un compteur.

Si vous voulez que ce soit une solution CSS, utilisez-le comme point de départ, puis google "MSDN".

ul.example { margin: 0.5em 0; padding: 0 0 0 2em; } 
ul.example li 
{ 
    margin: 0.5em 0; padding: 0 0 0 20px; 
    list-style-type: none; 
    behavior: expression(!this.before 
     ? this.before = this.innerHTML = '&mdash;&nbsp;' + this.innerHTML : ''); 
    text-indent: -1.24em; 
} 
ul.example li:before { content: '\2014\a0'; } 
0

Vous pouvez utiliser counters de le faire:

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>

Questions connexes