2009-03-04 12 views
0

Si quelqu'un peut donner un aperçu ici, il serait très apprécié. Je veux créer une sortie qui montre des réservations dans des cours de fitness à différentes dates. L'idée est d'avoir trois lignes et autant de lignes sont nécessaires pour couvrir toutes les dates. Pour ce faire, j'aimerais utiliser CSS plutôt que de recourir à des tables.Pourquoi ces balises Div ne s'emboîtent-elles pas correctement?

Ok, donc j'ai les définitions CSS suivantes:

.ListSetContainer 
{ 
    background-color:Red; 
    border:1px solid #999999; 
    text-align:center; 
} 

.ListSet 
{ 
    margin: 2px 2px 2px 16px; 
    float: left; 
    clear:none; 
} 

.ListSet ul 
{ 
    background-color: #EEEEEE; 
    border: 1px solid #999; 
    margin: 2px 2px 16px 2px; 
    padding: 6px 6px 0px 6px; 
} 

Et le code HTML suivant:

<div style="clear:both;"> 
    <h4>Class Dates, Counts and Participants</h4> 
    <div class='ListSetContainer'> 
     <div class='ListSet'> 
     <ul>...{Class information here...} 
     </ul> 
     </div> 
     <div class='ListSet'> 
     <ul>...{Class information here...} 
     </ul> 
     </div> 
     <div class='ListSet'> 
     <ul>...{Class information here...} 
     </ul> 
     </div> 
    </div> -- End of First ListSetContainer 

    <div class='ListSetContainer'> 
     <div class='ListSet'> 
     <ul>...{Class information here...} 
     </ul> 
     </div> 
     <div class='ListSet'> 
     <ul>...{Class information here...} 
     </ul> 
     </div> 
    </div> -- End of Second ListSetContainer 
    </div> -- End of surrounding Div 

Mais plutôt que d'obtenir trois divs disposées horizontalement, suivie d'une deuxième rangée avec deux divs , je reçois ceci:

Linked Image

Quelques notes. Tout d'abord, notez que la hiérarchie dans le HTML (divs ListSetContainer contient les divs ListSet) n'est pas reflétée dans la sortie. Deuxièmement, le div ListSetContainer est seulement un pixel haut - il n'y a pas d'arrière-plan montré! (J'utilise un fond rouge juste pour être sûr que je ne le rate pas). Le div englobant est simplement écrasé et les divs internes flottent d'eux-mêmes. La définition manuelle de la hauteur ne fonctionne pas car la div interne avec la liste est variable en hauteur (et cela semble étrange, pour démarrer). Si j'enlève le flotteur: à gauche; des divs internes, ils se développent pour être la pleine largeur de l'écran et ainsi je ne peux pas obtenir trois dans une rangée. Alors ... je suis à perte.

Encore une fois, merci pour toute aide que vous pouvez offrir!

+0

Une image large nuit vraiment à la disposition des questions. Vous devriez juste lier à l'image. – Tomalak

+0

@Randolpho: Merci. ;-) – Tomalak

+0

Merci à Garry d'avoir remplacé l'image. Veuillez accepter mes excuses alors que je me précipitais un peu: essayer d'obtenir cette question avant de partir au travail! –

Répondre

1

C'est parce que le ListSetContainer n'a pas de largeur définie. Je m'attends à ce qu'ils se rangent tous sur une ligne sur un moniteur à écran large.

Vous pouvez essayer:

.ListSetContainer { 
    width: 300px; 
} 

.ListSet { 
    clear: none; 
    float: left; 
    width: 100px; 
} 

et le style approprié.

+0

Il s'avère que l'élément width de ListSetContainer était la clé même si j'ai pris le conseil de Gumbo et utilisé des pourcentages sur ListSetContainer et ListSet. –

4

Votre ListSetContainer doit contenir un contenu non flottant pour qu'il ait une hauteur/largeur. Faire flotter un élément le sort de la hiérarchie de mise en page normale et ainsi le conteneur, contenant uniquement les ListSets, ne contient rien qui soit rendu normalement. Ajouter un espace insécable au conteneur, alors vous devriez être en mesure de définir sa largeur/hauteur car il y aura quelque chose à rendre.

Je voudrais également que votre ListSetContainer utilise clear: both. Cela devrait le faire démarrer une nouvelle "ligne" de ListSets.

+0

+1 - Merci pour la perspicacité. Homme, vous êtes partout tout le temps! –

+0

Je fais beaucoup de compilation: http://xkcd.com/303/ :-) – tvanfosson

+0

J'ai fini par utiliser une largeur de 100% selon les conseils de Richard Grundy et qui a pris soin d'avoir trois ListSets par rangée. Curieusement, il a également pris soin de la nécessité de contenu non flottant. Je ne suis pas sûr de savoir pourquoi la hauteur est juste venu correctement mais il l'a fait. CSS semble parfois comme un tir de merde ... –

1

Utilisez clear:both pour le bloc .ListSetContainer.

Mais vous pouvez encore améliorer cela en utilisant une seule liste:

<style type="text/css"> 
    .ListSetContainer { 
     list-style: none; 
     padding: 0; 
    } 
    .ListSetContainer li { 
     width: 33.333%; 
     float: left; 
    } 
    .ListSetContainer li li { 
     width: auto; 
     float: none; 
    } 
</style> 
<ul class="ListSetContainer"> 
    <li><ul><li>...{Class information here...}</li></ul></li> 
    <li><ul><li>...{Class information here...}</li></ul></li> 
    <li><ul><li>...{Class information here...}</li></ul></li> 
    <li><ul><li>...{Class information here...}</li></ul></li> 
    <li><ul><li>...{Class information here...}</li></ul></li> 
</ul> 
+0

+1 - Merci pour l'approche alternative. Votre CSS est nettement plus propre que le mien alors je vais essayer. –

+0

Plus vous pouvez l'ajuster au nombre d'éléments que vous voulez: il suffit de modifier la largeur. – Gumbo

+0

Mais pour tenir compte des problèmes d'arrondi et d'étrangeté générale dans IE6, je suggère de changer la largeur à 30% environ et/ou de régler la marge et le remplissage à 0. – Traingamer

1

Le problème réside dans le fait que votre classe a besoin de ListSet « display: block; » ajoutant ou "float: left;" En supprimant et en ajoutant le bloc, ajoutez "display: block; width: 100%" à la classe ListSetContainer.

+0

+1 - Merci d'avoir choisi l'affichage: l'approche par blocs. Je vais prendre le temps de jouer avec ça. –

+0

Il s'avère que la clé définissait ListSetContainer pour utiliser une largeur de 100%. Pour une raison quelconque, en utilisant display: block; n'a pas aidé du tout si le flotteur: à gauche; était encore utilisé. Si float: gauche; n'a pas été utilisé, je n'ai pas besoin d'affichage: bloquer; soit mais, sans la largeur: 100% les choses étaient empilées verticalement. –

1

Vous présentez des données tabulaires avec un ensemble fixe de colonnes - une par mois. On dirait que les tables étaient censées être utilisées. Maintenant est votre chance d'utiliser des tables et ne pas se sentir coupable de le faire!Maintenant, si vous n'utilisez pas de tables, vous devez corriger la taille de chaque élément, mais pas le nombre d'éléments par ligne. Laissez le nombre de colonnes être déterminé par la taille de la fenêtre du navigateur. A défaut, je pense que vous avez besoin d'un clear: both entre chaque rangée.

+0

C'est l'une de ces choses "par principe". Je génère ceci à partir du code et, alors que je savais que je pouvais le faire dans une table, je commençais juste à m'obstiner à comprendre pourquoi l'approche CSS/Div ne fonctionnait pas. Quoi qu'il en soit, +1 pour votre aide! –

+0

heh - quand vous y pensez, si vous deviez être approuvé par W3C Peanut Gallery (tm) [grimace], ils vous diraient d'utiliser une table dans ce cas. –

+0

Clair: les deux; aidé (les choses ont été arrangées correctement) mais le ListSetContainer enfermant n'était toujours pas la bonne taille (comme prédit tvanfossan). Cependant, la définition de Largeur: 100% a pris soin de tout. –

Questions connexes