2010-12-04 42 views
3

Je suis en train de créer une liste horizontale à partir d'un balisage de liste imbriquée, comme un exemple, j'ai le balisage actuel:liste horizontale imbriquée à l'aide CSS

<ul> 
<li class="alone">List Item 1</li> 
<li class="alone">List Item 2</li> 
<li class="alone">List Item 3</li> 
<li class="group">List Item 4 
    <ul> 
    <li class="not_alone">List Item 4a</li> 
    <li class="not_alone">List Item 4b</li> 
    <li class="not_alone">List Item 4c</li> 
    <li class="not_alone">List Item 4d</li> 
    </ul> 
</li> 
<li class="alone">List Item 5</li> 
</ul> 

je voudrais obtenir quelque chose de similaire à ceci:

<style> 
div { display: inline-block; } 
.alone { background: #E5ECF9; border: 1px solid #336699; color: #336699; } 
.group { background: #FBE3E4; border: 1px solid #CC0000; color: #CC0000; } 
.group .not_alone { background: #FBE3E4; border: 1px solid #CC0000; color: #CC0000; } 
.item { padding: 2px; margin: 0 2px; } 
</style> 
<div class="wrapper"> 
    <div class="alone item">List Item 1</div> 
    <div class="alone item">List Item 2</div> 
    <div class="alone item">List Item 3</div> 
    <div class="group item"> 
    List Item 4 
    <div class="group item">List Item 4a</div> 
    <div class="group item">List Item 4b</div> 
    <div class="group item">List Item 4c</div> 
    <div class="group item">List Item 4d</div> 
    </div> 
    </div> 
    <div class="alone item">List Item 5</div> 
</div> 

Vous pouvez voir une démo ici http://jsbin.com/exivi5. Est-ce possible en utilisant le balisage de liste imbriqué existant? Aussi, puis-je également garder la largeur de la liste des parents ul à 100% afin qu'elle corresponde à la fenêtre entière?

Ceci doit être compatible avec FF, Webkit et IE7 + mais se contentera du support d'IE8 +.

Merci d'avance!

+0

Quelle est votre question exactement? Vous n'avez pas déjà ce dont vous avez besoin dans le balisage basé sur div, prêt à être appliqué sur les éléments de la liste? –

+0

en utilisant les éléments ul-li au lieu de divs et les mêmes classes, vous n'obtenez pas le même résultat ?? – Sotiris

+0

Non, vous n'obtenez pas le même résultat exact. – schone

Répondre

2

essayer d'ajouter ces règles CSS:

ul {list-style: none; margin: 0; padding: 0; float:left; display: inline;} 
ul li {float:left; display: inline; margin: 0 5px; padding: 3px 2px;} 
ul li ul {float:right;} 
h2 {clear: left;} 

avec un peu de jongler avec des marges & rembourrages il devrait regarder le même que le vôtre

+0

y at-il un moyen d'avoir l'ul agi comme un div et force 100% de largeur? – schone

+0

vous pouvez garder la largeur de 100% du parent ul en lui attribuant une largeur: 100%, mais gardez à l'esprit que si vous modifiez ses marges ou paddings, vous devrez les prendre en compte aussi – Lucius

+0

les éléments flottants adaptent automatiquement leur taille à adapter celle de leur contenu, de sorte qu'ils ne servent plus d'éléments de bloc communs. Pour restaurer ce comportement, vous devez spécifier manuellement la largeur souhaitée. Malheureusement, si votre élément a des marges latérales ou des rembourrages réglés, une largeur de 100% ne vous convient pas, mais vous devrez les soustraire de la largeur totale – Lucius

1

Si vous ajoutez le style

display:block; 

de la li se rendre en tant que des éléments de niveau bloc, et vous devriez alors être en mesure de les coiffer juste comme l'exemple à base Div. Vous pourriez avoir besoin de les faire flotter à gauche pour les obtenir l'un à côté de l'autre exactement comme votre page d'exemple. (Ou utiliser inline-block à la place du bloc peut-être)

Essayez ceci (je n'ai pas testé ce que je suis sur mon petit ordinateur portable - ceci est basé sur la mémoire/devinettes)

<style> 
    #horizontallist li { display: block; float:left; } 
    .alone { background: #E5ECF9; border: 1px solid #336699; color: #336699; } 
    .group { background: #FBE3E4; border: 1px solid #CC0000; color: #CC0000; } 
    .group .not_alone { background: #FBE3E4; border: 1px solid #CC0000; color: #CC0000; } 
    .item { padding: 2px; margin: 0 2px; } 
</style> 

<ul id="horizontallist"> 
    <li class="alone item">List Item 1</li> 
    <li class="alone item">List Item 2</li> 
    <li class="alone item">List Item 3</li> 
    <li class="group item">List Item 4 
     <ul> 
     <li class="group item">List Item 4a</li> 
     <li class="group item">List Item 4b</li> 
     <li class="group item">List Item 4c</li> 
     <li class="group item">List Item 4d</li> 
     </ul> 
    </li> 
    <li class="alone">List Item 5</li> 
</ul> 
+1

Le mode de blocage en ligne n'est pas entièrement pris en charge dans les éléments en ligne non fontionnels d'IE fon: voir http://www.quirksmode.org/css/display.html – Lucius

+0

@Lucius - Merci, j'ai édité mon exemple pour utiliser le bloc et flotter à la place. J'ai aussi bloqué un cours sur le ul, pour rendre ces styles assez dramatiques plus spécifiques. (Il aurait été une pièce d'identité, mais je suis sur mon mac, et de manière embarrassante ne sais pas comment taper un signe de hachage/livre). –

+0

@Lucius - Et maintenant j'ai appris comment obtenir le symbole # sur mon mac UK, je l'ai édité à nouveau (alt + 3 si quelqu'un se demande). –

0

Try this (nécessite jQuery):

var wrapper = $("body").append("<div id='wrapper'></div>").find("#wrapper"); 

var lis = $("ul > li"); 

lis.each(function() { 
    var li = $(this); 
    if (li.hasClass("alone")) wrapper.append("<div class = 'alone item' >" + li.text() + " </div>"); 
    else if (li.hasClass("group")) { 
     var html = "<div class='group item'>"; 
     li.find("li").each(function() { 
      html += "<div class = 'group item' >" + $(this).text() + " </div>"; 
     }); 
     html += "</div>"; 
     wrapper.append(html); 
    } 
}); 

Démo: http://fiddle.jshell.net/EJZMS/show/light/

code: http://fiddle.jshell.net/EJZMS/

Mon code n'est pas récursif: Si vous avez plus d'un niveau d'imbrication, vous devrez le modifier vous-même.

+0

vous devriez préférer les règles css statiques à JS, puisque vous ne pouvez pas être sûr que tout votre utilisateur l'a activé .. – Lucius

+1

C'est à la hauteur de OP. J'essaie juste de leur donner autant d'options que possible –

+0

Malheureusement, je cherche seulement une solution basée sur CSS, méthode plutôt cool si! Merci. – schone