2010-08-15 5 views
4

J'ai un ensemble de divs avec des hauteurs variables qui ont été flottées à gauche. Quand il y a trop de divs sur une seule ligne, le div suivant s'intègre à une nouvelle ligne (comme il se doit). Le problème que je rencontre est que la nouvelle ligne est démarrée à une position offset x sur la nouvelle ligne, de sorte que la div est sous la dernière div de la ligne précédente qui n'a pas de divs plus grands derrière elle - laissant souvent une grande marge sur le côté gauche.Effacement du dernier élément flottant dans chaque ligne

div.entry 
{ 
    float: left; 
    width: 180px; 
    padding: 10px; 
} 

Je veux essentiellement pour que la dernière div.entry « rangée » (la précédente enveloppe à une nouvelle ligne) efface le flotteur, de sorte que la rangée suivante de divs flottaient sont tous alignés à la même hauteur, et n'ont pas un assez grand écart sur le côté gauche. Illustré en ASCII:

Ce que je pense arriver:

+-----+ +-----+ +-----+ +-----+ 
| A | | B | | C | | D | 
|  | |  | |  | +-----+ 
+-----+ |  | +-----+ 
     +-----+ 
+-----+ +-----+ +-----+ +-----+ 
| E | | F | | G | | H | 
|  | |  | |  | +-----+ 
+-----+ |  | +-----+ 
     +-----+ 

Qu'est-ce qui se passe réellement:

+-----+ +-----+ +-----+ +-----+ 
| A | | B | | C | | D | 
|  | |  | |  | +-----+ 
+-----+ |  | +-----+ 
     +-----+ +-----+ +-----+ 
       | E | | F | 
       |  | |  | 
       +-----+ |  | 
         +-----+ 
+-----+ +-----+ 
| G | | H | 
|  | +-----+ 
+-----+ 

Michael

+0

est-ce que le nombre de blocs dans une rangée est fixé? –

Répondre

0

J'ai eu ce problème une fois, je pense que je suis autour de mon définir une propriété min-height pour les divs.

Ce qui m'a donné:

+-----+ +-----+ +-----+ +-----+ 
| A | | B | | C | | D | 
|  | |  | |  | +-----+ 
+-----+ |  | +-----+ 
     +-----+ 
+-----+ +-----+ +-----+ +-----+ 
| E | | F | | G | | H | 
|  | |  | |  | +-----+ 
+-----+ |  | +-----+ 
     +-----+ 
+1

Cela fonctionnerait, mais les divs ont une hauteur variable inconnue; toute hauteur minimale arbitrairement définie peut potentiellement être dépassée (et le sera probablement), auquel cas elle revient au comportement ci-dessus. – Jason

+0

Ouais j'ai eu ce problème aussi ... J'avais fini par détecter la hauteur maximale des divs côté serveur et l'assigner comme la taille min ... –

+0

J'espérais qu'il y avait un moyen de le faire en CSS, si pas je vais probablement aller avec cette solution ou utiliser javascript pour effacer la dernière div dans chaque rangée. – Jason

1

Si float: left est pas obligatoire, il y a toujours display: inline-block qui serait plus adapté pour le travail. Depuis le "flux en ligne" fonctionne déjà comme vous le souhaitez.

.item { 
    display: inline-block; 
    vertical-align: top; 
    width: 300px; 
} 

Cela se comporte à peu près correctement dans les navigateurs actuels. Voir fiddle.

Si vous voulez la compatibilité avec les anciens navigateurs, il y a un bel article sur le blog de mozilla décrivant la situation: http://blog.mozilla.org/webdev/2009/02/20/cross-browser-inline-block/

Questions connexes