49 votes

Clearfix est-il déprécié ?

Vous connaissez l'éternel problème : les conteneurs contenant des éléments flottants n'augmentent pas automatiquement leur hauteur pour englober leurs enfants.

Une approche pour résoudre ce problème est le "clearfix" qui ajoute un certain nombre de règles CSS pour garantir l'étirement correct d'un conteneur.

Cependant, le fait de donner le conteneur overflow: hidden semble fonctionner tout aussi bien, et avec la même compatibilité avec les navigateurs.

Selon ce guide Les deux méthodes sont compatibles avec tous les navigateurs qui sont importants aujourd'hui.

Cela signifie-t-il que "clearfix" est déprécié ? Y a-t-il encore un avantage à l'utiliser par rapport à overflow: hidden ?

Une question très similaire se pose ici : Quelle est la différence entre clearfix hack et overflow:hidden vs overflow:auto ? mais la question n'y trouve pas vraiment de réponse.

32voto

thirtydot Points 114021

Vous pouvez utiliser overflow: hidden tout le temps.

Mais, il y a sont exceptions. En voici un exemple :

Débordement d'un div de conteneur horizontalement mais pas verticalement

La question qui se posait était la suivante :


Voici un exemple plus important de quand vous ne pouvez pas utiliser overflow: hidden :

http://fordinteractive.com/misc/overflow/

Cela ne veut pas dire que clearfix est la uniquement alternative - display: inline-block corrige proprement cet exemple :

http://jsbin.com/ubapog

10voto

clairesuzy Points 14882

Comme mentionné dans une autre réponse, l'inconvénient de l'option hidden est qu'elle va, de manière surprenante, masquer des éléments tels que les menus déroulants. Cependant, il existe un autre moyen de contenir l'information avec une seule ligne, en faisant flotter le conteneur parent. overflow: hidden a un inconvénient, et le flottement permet de résoudre de nombreux problèmes liés à l'ancien IE, notamment dans les listes. Si vous pouvez utiliser une largeur, j'utiliserais un "flottement dans un flottement", ou bien display: inline-block

Je ne dis pas que le "clearfix" n'a pas d'utilité - mais pour moi, il est trop largement ancré dans les thèmes CMS (comme Wordpress et Drupal) et je pense que dans de nombreux cas, il est trop utilisé et sur des divs qui n'ont pas réellement besoin d'être dégagés ou contenus.

Je n'arrive pas à penser à une situation où je ne pourrais pas utiliser overflow ou float, plutôt que clearfix, mais mon cerveau est en mode vacances - mais comme clearfix est une solution de copier/coller, c'est parfois la chose la plus facile à recommander, mais il doit être celui qui définit hasLayout pour IE, ce que overflow et float font aussi maintenant.


ajouté cela vient de se reproduire : et le cerveau n'est pas en mode vacances

Je commence vraiment à penser que oui, clearfix n'est pas nécessaire (du moins, je n'ai pas encore trouvé d'exemple où ce serait le cas), même l'exemple de @thirtydot ci-dessus peut être contourné avec display: inline-block tout en conservant la prise en charge d'IE6, le conteneur ayant une largeur fixe répond à l'exigence hasLayout d'IE7 et des versions inférieures, et en le transformant en bloc inline pour tous les autres navigateurs, il peut être centré et les éléments autocollants "décalés" fonctionneront correctement alors que le conteneur s'étire verticalement.

Exemple

J'ai également vu une référence à un nouveau clearfix amélioré pour les marges qui s'effondrent en utilisant :before ainsi que :after dans le hack clearfix, mais à moins que je ne manque quelque chose le la démo est défectueuse - il y a des espaces irréguliers dans les pre et les cases "clearfixed" ne contiennent pas réellement de flottants, dès que vous faites flotter les éléments dans ces cases, chaque méthode s'exécute de la même manière.

Marges des notes sur pre ne réagissent pas de la même façon que les autres (essayez donc avec padding au lieu de margin pour voir la même image lors du test) et il y a aussi un autre "défaut" d'IE qui fait qu'il ne contient pas les marges correctement si elles ne sont pas explicitement spécifiées et dans la démo, il y a des marges explicites sur l'élément h2 mais pas le p donc, toutes choses égales par ailleurs, un élément clearfixed, tel que démontré par TJK dans cette page, force artificiellement le confinement des marges sur un élément de bloc normal, de la même manière qu'un padding top/bottom de 1px le ferait, car les navigateurs le font différemment de toute façon !

Si vous faites flotter les éléments à l'intérieur de ces conteneurs (ce qui est le but de la compensation de toute façon) - les marges contiennent alors comme vous le souhaiteriez probablement, comme elles le feraient à l'intérieur d'un nouveau contexte de formatage de bloc - sans aucun élément supplémentaire. :before une partie du hack, toutes les variations de clearfix fonctionnent aussi bien !

Voir la démo rechargée

Donc, à mon avis, il n'y a plus besoin de cette méthode "clearfix", il suffit de trouver la meilleure façon de créer ce nouveau contexte de formatage de bloc, en utilisant haslayout pour les anciens IE. Les propriétés sont les mêmes pour les deux !

comme le souligne TJK dans son article : http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified/

De meilleures alternatives

Si vous pouvez appliquer une largeur à l'élément élément contenant des flottants, alors votre meilleure option est d'utiliser :

display: inline-block; width: <any explicit value>;

Je pense que c'est juste et même avec des éléments à 100% qui pourraient avoir besoin de rembourrage, vous pouvez le faire en conjonction avec box-sizing

.clearfix {
  display: inline-block;
  width: 100%;
  *width: auto;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

8voto

stecb Points 7663

overflow:hidden est très "puissant" (je l'utilise depuis plusieurs années, et je suis d'accord avec ce que David a dit) mais en même temps, il pose un problème. Si, par exemple, à l'intérieur du conteneur, vous avez des éléments abs que vous devez glisser et déposer à l'extérieur de celui-ci, vous ne pourrez pas les voir à l'extérieur du conteneur. Dans ce cas particulier, vous devez utiliser l'astuce "clearfix" ;)

1voto

Quentin Points 325526

Je recommande le overflow: hidden depuis de nombreuses années. Elle est largement soutenue.

1voto

Finbarr Points 8420

J'ai récemment découvert à ma grande surprise que overflow:hidden fonctionne parfaitement aujourd'hui. J'utilisais la méthode clearfix jusqu'à il y a environ 6 mois et elle est assez gonflée en comparaison.

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