883 votes

La méthode de "clearfix" est mieux?

J'ai le vieux problème de div d'habillage d'une disposition en deux colonnes. Ma sidebar est flottant, donc mon conteneur div ne parvient pas à envelopper le contenu et la barre latérale.

<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>

Il semble y avoir de nombreuses méthodes de fixation de la claire bug dans FF:

  • <br clear="all"/>
  • overflow:auto
  • overflow:hidden
  • etc.

Mais dans ma situation, le seul qui semble fonctionner correctement, c'est l' <br clear="all"/> de la solution, qui est un peu délabrée. overflow:auto me donne méchant barres de défilement, et overflow:hidden doit sûrement avoir des effets secondaires. Aussi, IE7 est apparemment censé pour ne pas souffrir de ce problème en raison de son comportement incorrect, mais dans ma situation, c'est de la souffrance la même que FF.

Quelle est la plus fiable et la meilleure pratique de la méthode actuellement disponible pour nous?

1060voto

Beau Smith Points 8112

Selon la conception du produit, chacun des ci-dessous clearfix css solutions a ses propres avantages.


"Battre ClearFix", un clearfix pour les navigateurs modernes

Thierry Coblence " de CSS Mojo a souligné que lorsque le ciblage des navigateurs modernes, nous pouvons maintenant déposer l' zoom et ::before propriété/valeurs et utilisez simplement:

.container:after {
  content:"";
  display:table;
  clear:both;
}

Cette solution ne prend pas en charge pour IE 6/7 ...sur le but!

Thierry propose également: "Un mot d'avertissement: si vous démarrez un nouveau projet à partir de zéro, allez-y, mais ne pas les swaps de cette technique avec celui que vous avez maintenant, parce que même si vous ne supportez pas oldIE, vos règles existantes de prévenir l'effondrement des marges."


Micro Clearfix

La plus récente et à l'échelle mondiale a adopté clearfix solution, le Micro Clearfix par Nicolas Gallagher.

.container:before,
.container:after {
  content:"";
  display:table;
}
.container:after {
  clear:both;
}
.container {
  zoom:1; /* For IE 6/7 (trigger hasLayout) */
}

Propriété De Dépassement

Cette méthode de base est préféré pour le cas d'habitude, lors du positionnement, le contenu ne sera pas le montrer à l'extérieur des limites du conteneur.

http://www.quirksmode.org/css/clearing.html - explique comment résoudre les problèmes courants liés à cette technique, à savoir le paramètre width: 100% sur le conteneur.

.container {
    overflow: hidden;
    display: inline-block; /* Necessary to trigger "hasLayout" in IE */
    display: block; /* Sets element back to block */
}

Plutôt que d'utiliser l' display de propriété pour définir "hasLayout" pour IE, d'autres propriétés peuvent être utilisées pour trigering "hasLayout" pour un élément.

.container {
    overflow: hidden; /* Clearfix! */
    zoom: 1;  /* Triggering "hasLayout" in IE */
    display: block; /* Element must be a block to wrap around contents. Unnecessary if only using block-level elements. */
}

Une autre façon d'effacer les flotteurs à l'aide de l' overflow de la propriété est d'utiliser le trait de soulignement hack. IE appliquer les valeurs préfixées avec le trait de soulignement, les autres navigateurs ne le sera pas. L' zoom de la propriété des déclencheurs hasLayout dans IE:

.container {
    overflow: hidden;
    _overflow: visible; /* for IE */
    _zoom: 1; /* for IE */
}

Bien que cela fonctionne... il est idéal de ne pas utiliser des hacks.


":après" Pseudo-élément

Cette ancienne "Facile de Compensation de la" méthode a l'avantage de permettre les éléments en position pour accrocher à l'extérieur des limites du conteneur, au détriment de la plus délicate CSS.

http://www.positioniseverything.net/easyclearing.html

.container {
    display: inline-block;
}
.container:after {
    content: " ";
    display: block;
    height: 0;
    clear: both;
    overflow: hidden;
    visibility: hidden;
}
.container {
    display: block;
}

Élément à l'aide de "clair" de la propriété

Le rapide et sale de la solution:

<br style="clear:both" /> <!-- So dirty! -->

À l'aide de l'élément de compensation de la solution n'est pas idéale pour de nombreuses raisons:

  • la raison principale: vous mettez présentation dans votre balisage. Cela permet de réutiliser le balisage plus difficile si vous ne voulez pas l' <br> style dans un autre contexte où le même langage est utilisé. CSS devrait être utilisé pour le style de la même balise différemment dans des contextes différents.
  • ne pas ajouter de la sémantique de la valeur à votre balisage,
  • rend votre code non professionnels, et
  • dans l'avenir, lorsque d'autres clearfix solutions sont disponibles, vous n'aurez pas à revenir en arrière et supprimer toutes les <br> balises qui sont éparpillées autour dans votre balisage.

Choisir à bon escient. =)

73voto

Quels sont les problèmes que nous essayons de résoudre?

Il y a deux considérations importantes lors de l'flottant trucs:

  1. Contenant descendant des flotteurs. Cela signifie que l'élément en question est assez grand pour envelopper toutes les descendants. (Ils n'accrochez pas à l'extérieur.)

    Floating content hanging outside its container

  2. Isolation des descendants de l'extérieur de flotteurs. Cela signifie que les descendants à l'intérieur d'un élément doit être en mesure d'utiliser clear: both et ne l'ai pas interagir avec les chars à l'extérieur de l'élément.

    <code>clear: both</code> interacting with a float elsewhere in the DOM

Bloc de mise en forme des contextes

Il n'y a qu'une façon de faire les deux de ces. Et c'est d'établir un nouveau bloc de mise en forme de contexte. Éléments qui établissent un bloc de mise en forme de contexte sont d'une isolation rectangle dans lequel flotte d'interagir les uns avec les autres. Un bloc de mise en forme de contexte sera toujours assez haut pour que visuellement écharpe flottant de descendants, et pas de flotte à l'extérieur d'un bloc de mise en forme de contexte peuvent interagir avec des éléments à l'intérieur. Cette isolation est exactement ce que vous voulez. Dans IE, ce même concept est appelé hasLayout, qui peut être défini via zoom: 1.

Il y a plusieurs façons de mettre en place un bloc de mise en forme de contexte, mais la solution que je recommande est display: inline-block avec width: 100%. (Bien sûr, il y a les mises en garde habituelles avec l'aide d' width: 100%, afin de l'utiliser box-sizing: border-box ou de mettre des padding, margin, et border sur un élément différent.)

Le plus robuste solution

Probablement l'application la plus commune de chars est la disposition en deux colonnes. (Peut être étendue à trois colonnes.) D'abord la structure de majoration.

<div class="container">
  <div class="sidebar">
    sidebar<br/>sidebar<br/>sidebar
  </div>
  <div class="main">
    <div class="main-content">
      main content
      <span style="clear: both">
        main content that uses <code>clear: both</code>
      </span>
    </div>
  </div>
</div>

Et maintenant le CSS.

/* Should contain all floated and non-floated content, so it needs to
 * establish a new block formatting context without using overflow: hidden. */
.container {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

/* Fixed-width floated sidebar. */
.sidebar {
  float: left;
  width: 160px;
}

/* Needs to make space for the sidebar. */
.main {
  margin-left: 160px;
}

/* Establishes a new block formatting context to insulate descendants from
 * the floating sidebar. */
.main-content {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

Essayez-le vous-même

Aller à la JS Bin de jouer avec le code et de voir comment cette solution est construit à partir du sol.

Traditionnelle clearfix les méthodes considérées comme nuisibles

Le problème avec la traditionnelle clearfix solutions , c'est qu'ils utilisent deux rendu concepts pour atteindre le même objectif pour IE et pour tout le monde. Dans IE ils utilisent hasLayout d'établir un nouveau bloc de mise en forme de contexte, mais pour tout le monde qu'ils utilisent généré boîtes (:after) avec clear: both, ce qui ne permet pas d'établir un nouveau bloc de mise en forme de contexte. Cela signifie que les choses ne se comportent pas de la même dans toutes les situations. Pour une explication de pourquoi c'est mauvais, voir Tout ce que vous Savez à propos de Clearfix est Faux.

57voto

twome Points 1178

La nouvelle norme, tel qu'utilisé par les Inuits.css et de Bourbon - deux très largement utilisé et bien entretenu CSS/Sass cadres:

.btcf:after {
    content:"";
    display:table;
    clear:both;
}

Notes

Cela ne prend pas en charge IE7. Vous ne devriez pas être prise en charge d'IE7. Faire continue à exposer les utilisateurs à des interprétations exploits et rend la vie plus difficile pour tous les autres développeurs de sites web, car il réduit la pression sur les utilisateurs et les organisations à passer à des navigateurs modernes.

Il a été annoncé et expliqué par Thierry Coblence en juillet 2012. Elle met en poids inutile de Nicolas Gallagher 2011 de micro-clearfix. Dans le processus, il libère un pseudo-élément pour votre propre usage.

C'est maintenant au moins un an que cette méthode a été conçue, et l'original lourd haut de réponse devrait être mis à jour - c'est une très populaire en question.

29voto

Eric the Red Points 1418

Je recommande d'utiliser les éléments suivants, lequel est effectué à partir de http://html5boilerplate.com/

/* >> The Magnificent CLEARFIX << */
.clearfix:after { 
  content: "."; 
  display: block; 
  height: 0; 
  clear: both; 
  visibility: hidden; 
}
.clearfix { 
  display: inline-block;  
}
* html .clearfix {  
  height: 1%;  
} /* Hides from IE-mac \*/
.clearfix {  
  display: block;  
}

24voto

Jack Sleight Points 6684

Le débordement de la propriété peut être utilisée pour effacer des chars avec aucune autre marque:

.container { overflow: hidden; }

Cela fonctionne pour tous les navigateurs, sauf IE6, où tout ce que vous devez faire est d'activer le hasLayout (zoom de ma méthode préférée):

.container { zoom: 1; }

http://www.quirksmode.org/css/clearing.html

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