59 votes

Quelle est la meilleure façon de supprimer le style CSS "float" ?

Je suis assez habitué à nettoyer mes flottants en utilisantmais les choses ne cessent de changer et je ne suis pas sûr que ce soit la meilleure pratique.

Il existe un "hack" CSS (de positioneverything) disponible qui vous permet d'obtenir le même résultat sans utiliser de div de nettoyage. Mais... ils affirment que ce hack est un peu dépassé et qu'il vaudrait peut-être mieux regarder ce hack. Mais... après avoir lu 700 pages de commentaires :) il semble qu'il y ait des endroits où ce dernier hack ne fonctionne pas.

J'aimerais éviter tout "hack" javascript car je souhaite que mon nettoyage fonctionne indépendamment de l'activation du javascript.

Quelle est la meilleure pratique actuelle pour nettoyer les divs de manière indépendante du navigateur ?

1 votes

Lorsque j'ai lu ce titre, j'ai pensé que cela allait être une question stupide, à laquelle on répondrait par "float f = 0.0". Mes excuses, je n'ai pas encore pris mon café ce matin :-)

0 votes

De toute façon, la réponse à toute question avec "Javascript" et "indépendant du navigateur" est jQuery.

0 votes

@Pax : moi aussi. J'ai édité le titre.

58voto

Bryan M. Points 9403

Mise à jour: En 2014, vous devez utiliser une technique clearfix qui utilise des pseudo-éléments, comme celui mentionné par @RodrigoManguinho. Ceci est la méthode moderne pour effacer les flottants. Pour une méthode encore plus récente, consultez le micro clearfix de Nicholas Gallagher :

/**
 * Pour les navigateurs modernes
 * 1. Le contenu espace est une façon d'éviter un bug d'Opera lorsque
 *    l'attribut contenteditable est inclus ailleurs dans le document.
 *    Sinon, cela provoque un espace en haut et en bas des éléments
 *    qui sont clearfixed.
 * 2. L'utilisation de `table` plutôt que `block` est seulement nécessaire si l'on utilise
 *    `:before` pour contenir les marges supérieures des éléments enfants.
 */
.cf:before,
.cf:after {
    content: " "; /* 1 */
    display: table; /* 2 */
}

.cf:after {
    clear: both;
}

/**
 * Pour IE 6/7 seulement
 * Inclure cette règle pour déclencher hasLayout et contenir les flottants.
 */
.cf {
    *zoom: 1;
}

Réponse originale:

Je n'aime vraiment pas utiliser du balisage supplémentaire non sémantique, donc j'évite d'utiliser un élément de dégagement. Au lieu de cela, j'applique simplement overflow: hidden; au parent du flottant(s) pour les effacer. Fonctionne sur tous les navigateurs, aucun problème. Je crois que overflow: auto; fonctionne également.

Évidemment, cela ne fonctionnera pas si vous souhaitez utiliser une propriété overflow différente, mais en raison du bug de la boîte expansible d'IE6, je n'ai rarement une raison de faire délibérément déborder mes conteneurs.

Voir plus d'informations sur l'utilisation de overflow au lieu de clear pour éviter d'ajouter du balisage supplémentaire.

0 votes

Ces jours-ci, cela peut même être plus facile que ça - cssmojo.com/latest_new_clearfix_so_far

27voto

Mike Points 333

J'ai trouvé que la plupart du temps (moi-même inclus), cette méthode est utilisée dans le html :

Avec ceci dans la feuille de style :

.clear {clear: both;}

0 votes

Non, je ne pense pas; car il utilise un DIV, vous devrez utiliser un point.

0 votes

Le point devrait être dans la feuille de style uniquement - cela a été corrigé maintenant.

0 votes

Comment class="clear" serait-il meilleur que style="clear:both" s'il n'y a aucune chance que le style pour .clear ne change jamais ? Ajouter simplement une couche d'indirection n'équivaut pas nécessairement à un meilleur design.

23voto

Rodrigo Manguinho Points 432
.clear-fix:after
{
    content: ".";
    display: block;
    clear: both;
    visibility: hidden;
    line-height: 0;
    height: 0;
}

.clear-fix
{
    zoom: 1;
}

    Some Div With Float
    Another Div With Float

À mon avis, c'est la meilleure façon. Pas besoin d'éléments DOM supplémentaires ou d'une mauvaise utilisation de overflow ou de tout piratage.

3 votes

Je pense que c'est la solution la plus belle. Si vous choisissez celle-ci, n'oubliez pas d'ajouter ceci dans une feuille de style spécifique à IE, sinon IE 7 sera triste. .clear-fix { zoom: 1; }

0 votes

Vous avez raison Filip. J'ai édité ma réponse pour la solution complète. +1 pour votre observation.

1 votes

A été utilisé depuis l'aube des temps. En 2012, est-ce vraiment toujours la solution autoritative??? J'espérais que 5 générations de navigateurs plus récents auraient rendu possible une solution plus directe...

8voto

Kent Fredric Points 35592

Il y a un peu de vaudou que j'ai tendance à utiliser.

span.clear { 
    display: block; 
    clear: both; 
    width: 1px; 
    height: 0.001%;
    font-size: 0px; 
    line-height: 0px; 
} 

Cette combinaison résout miraculeusement tout un tas de problèmes de navigateur, et je l'utilise depuis si longtemps que j'ai oublié quels problèmes cela résout.

0 votes

Au lieu de span display:block pourquoi ne pas simplement mettre une balise div?

2 votes

@aleemb : C'est utile lorsque vous devez l'utiliser à l'intérieur de

et des cas similaires, où

ne peut pas être utilisé - à mon avis.

3voto

dylanfm Points 4668

Vous voudrez peut-être regarder comment certains frameworks CSS gèrent cela. Voici Blueprint's (regardez la fin du code).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X