Che cos'è un clearfix?


1004

Recentemente ho cercato il codice di alcuni siti Web e ho visto che ognuno <div> aveva una lezione clearfix.

Dopo una rapida ricerca su Google, ho appreso che a volte è per IE6, ma che cos'è in realtà un clearfix?

Potresti fornire alcuni esempi di un layout con un clearfix, rispetto a un layout senza un clearfix?


65
Non è per IE 6. Un clearfix assicura che a divsi espanderà completamente all'altezza corretta per racchiudere i suoi figli galleggianti. webtoolkit.info/css-clearfix.html
Sparky

Risposte:


983

Se non è necessario supportare IE9 o versioni precedenti, è possibile utilizzare liberamente flexbox e non è necessario utilizzare layout fluttuati.

Vale la pena notare che oggi, l'uso di elementi fluttuati per il layout sta diventando sempre più scoraggiato dall'uso di alternative migliori.

  • display: inline-block - Meglio
  • Flexbox - Migliore (ma supporto browser limitato)

Flexbox è supportato da Firefox 18, Chrome 21, Opera 12.10 e Internet Explorer 10, Safari 6.1 (incluso Safari mobile) e dal browser predefinito 4.4 di Android.

Per un elenco dettagliato del browser, consultare: https://caniuse.com/flexbox .

(Forse una volta che la sua posizione sarà completamente stabilita, potrebbe essere il modo assolutamente consigliato di disporre gli elementi.)


Un clearfix è un modo per un elemento di cancellare automaticamente i suoi elementi figlio , quindi non è necessario aggiungere un markup aggiuntivo. Viene generalmente utilizzato nei layout float in cui gli elementi vengono flottati per essere impilati orizzontalmente.

Il clearfix è un modo per combattere il problema del contenitore ad altezza zero per gli elementi mobili

Un clearfix viene eseguito come segue:

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}

Oppure, se non hai bisogno di supporto per IE <8, anche il seguente va bene:

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

Normalmente dovresti fare qualcosa come segue:

<div>
    <div style="float: left;">Sidebar</div>
    <div style="clear: both;"></div> <!-- Clear the float -->
</div>

Con clearfix, hai solo bisogno di quanto segue:

<div class="clearfix">
    <div style="float: left;" class="clearfix">Sidebar</div>
    <!-- No Clearing div! -->
</div>

Leggilo in questo articolo - di Chris Coyer @ CSS-Tricks


1
in ogni caso, per qualsiasi motivo, uno spazio bianco è una pratica migliore di un punto, ho avuto problemi con il punto su alcuni browser, quindi perché l'ho menzionato :) un piccolo miglioramento non farà male :)
Val

1
content: "\00A0";gli \ 00A0 rappresentano uno spazio bianco, un semplice spazio bianco non funziona bene :) scusa. :)
Val

14
@MadaraUchiha, perché display: blocco inline è meglio degli elementi mobili? L'unico problema che ho è che la visualizzazione con blocco inline causa problemi con lo spazio tra i tag, che non è sempre facilmente controllabile.
mowwwalker,

2
@Kzqai: ecco perché flexbox è l'opzione preferita quando diventa più ampiamente supportata.
Madara's Ghost

11
Non display: inline-blocksono d' accordo che sia meglio dei float per il layout basato su blocchi. I blocchi in linea sono, come suggerisce il nome, disposti in linea - la maggior parte dei layout sono basati su blocchi e avere questi blocchi in un contesto di formattazione in linea non ha senso. Devi anche affrontare vari problemi associati alla formattazione in linea, come spazi bianchi tra elementi, altri elementi in linea, dimensionamento, allineamento e così via, come molti altri hanno sottolineato. Certo, anche i layout float non hanno molto senso, ma almeno i float hanno il vantaggio di essere basati su blocchi.
BoltClock

70

Le altre risposte sono corrette. Ma voglio aggiungere che si tratta di una reliquia del tempo in cui le persone imparavano per la prima volta CSS e abusavano floatdi fare tutto il loro layout. floatè pensato per fare cose come immagini fluttuanti accanto a lunghe tirature di testo, ma molte persone lo hanno usato come meccanismo di layout principale. Dal momento che non era proprio pensato per questo, hai bisogno di hack come "clearfix" per farlo funzionare.

Al giorno d'oggi display: inline-blockè una valida alternativa (ad eccezione di IE6 e IE7 ), anche se i browser più moderni stanno arrivando con meccanismi di layout ancora più utili sotto nomi come flexbox, layout di griglia, ecc.


1
La mia pratica è arrivata a questo: non c'è motivo di usare mai il galleggiante. Ogni volta che lo usi la metà delle cose si rompono. Lo userei solo quando ho bisogno di cose per evocare all'interno di un div. Inline-block è fantastico. Il nuovo modello di scatola è fantastico. Quindi non più hack per andare in linea verticale.
Muhammad Umer,

50
inline-blocknon è un miglioramento rigoroso rispetto ai float a causa del problema di spaziatura tra blocchi , in cui gli spazi bianchi nell'HTML si traducono in caratteri spaziali che separano i blocchi. inline-blockrichiede soluzioni alternative , proprio come floatrichiede clearfix.
Rory O'Kane,

41

Ciò clearfixconsente a un contenitore di avvolgere i suoi figli galleggianti. Senza uno clearfixstile equivalente o equivalente, un contenitore non avvolge i suoi figli galleggianti e collassa, proprio come se i suoi figli galleggianti fossero posizionati in modo assoluto.

Esistono diverse versioni del clearfix, con Nicolas Gallagher e Thierry Koblentz come autori chiave.

Se desideri supporto per browser meno recenti, è meglio utilizzare questo clearfix:

.clearfix:before, .clearfix:after {
    content: "";
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

In SCSS, è possibile utilizzare la seguente tecnica:

%clearfix {
    &:before, &:after {
        content:" ";
        display:table;
    }

    &:after {
        clear:both;
    }

    & {
        *zoom:1;
    }
}

#clearfixedelement {
    @extend %clearfix;
}

Se non ti interessa supportare browser meno recenti, esiste una versione più breve:

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

1
Bella risposta John! Quello che mi chiedo è perché Clear rende divavvolgente gli elementi fluttuati? Potete aiutarmi a visualizzarlo?
Alexander Suraphel,

@AlexanderSuraphel: Questa risposta spiega in dettaglio -> stackoverflow.com/questions/12871710/...
John Slegers

16

Offrire un aggiornamento sulla situazione nel secondo trimestre del 2017.

Una nuova proprietà di visualizzazione CSS3 è disponibile in Firefox 53, Chrome 58 e Opera 45.

.clearfix {
   display: flow-root;
}

Controlla la disponibilità per qualsiasi browser qui: http://caniuse.com/#feat=flow-root

L'elemento (con una proprietà display impostata su flow-root) genera un box contenitore di blocchi e ne espone il contenuto usando il layout del flusso. Stabilisce sempre un nuovo contesto di formattazione dei blocchi per i suoi contenuti.

Ciò significa che se si utilizza un div parent contenente uno o più figli mobili, questa proprietà garantirà che il genitore racchiuda tutti i suoi figli. Senza alcun bisogno di un hack di clearfix. Su tutti i bambini, nemmeno su un ultimo elemento fittizio (se si utilizzava la variante clearfix con: prima sugli ultimi figli).

.container {
  display: flow-root;
  background-color: Gainsboro;
}

.item {
  border: 1px solid Black;
  float: left;
}

.item1 {  
  height: 120px;
  width: 120px;
}

.item2 {  
  height: 80px;
  width: 140px;
  float: right;
}

.item3 {  
  height: 160px;
  width: 110px;
}
<div class="container">
  This container box encloses all of its floating children.
  <div class="item item1">Floating box 1</div>
  <div class="item item2">Floating box 2</div> 
  <div class="item item3">Floating box 3</div>  
</div>


1
Puoi descrivere cosa fa questo in relazione alla domanda?
1,21 gigawatt

Le modifiche di Clearfix ai bambini fluttuanti che non influenzano il flusso dei genitori usando gli hack intelligenti flow-rootsono la vera soluzione.
mystrdat,

11

In poche parole, clearfix è un trucco .

È una di quelle brutte cose con cui tutti dobbiamo solo convivere poiché è davvero l'unico modo ragionevole per garantire che elementi figlio fluttuati non trabocchino i loro genitori. Esistono altri schemi di layout, ma oggi il floating è troppo comune nel web design / sviluppo per ignorare il valore dell'hack di clearfix.

Personalmente mi rivolgo alla soluzione Micro Clearfix (Nicolas Gallagher)

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

riferimento


5

Una tecnica comunemente utilizzata nei layout basati su float CSS consiste nell'assegnare una manciata di proprietà CSS a un elemento che saprà conterrà elementi fluttuanti. La tecnica, che è comunemente implementata usando una definizione di classe chiamata clearfix, (di solito) implementa i seguenti comportamenti CSS:

.clearfix:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
    zoom: 1
}

Lo scopo di questi comportamenti combinati è quello di creare un contenitore :afterl'elemento attivo contenente un singolo "." contrassegnato come nascosto che cancellerà tutti i float preesistenti e reimposterà efficacemente la pagina per il prossimo contenuto.


2

L'altra (e forse la più semplice) opzione per ottenere un clearfix è da usare overflow:hidden;sull'elemento contenitore. Per esempio

.parent {
  background: red;
  overflow: hidden;
}
.segment-a {
  float: left;
}
.segment-b {
  float: right;
}
<div class="parent">
  <div class="segment-a">
    Float left
  </div>
  <div class="segment-b">
    Float right
  </div>
</div>

Ovviamente questo può essere usato solo nei casi in cui non si desidera mai che il contenuto trabocchi.


1

Ho provato la risposta accettata ma ho ancora avuto problemi con l'allineamento del contenuto. L'aggiunta di un selettore ": before" come mostrato di seguito ha risolto il problema:

// LESS HELPER
.clearfix()
{
    &:after, &:before{
       content: " "; /* Older browser do not support empty content */
       visibility: hidden;
       display: block;
       height: 0;
       clear: both;
    }
}

MENO sopra verrà compilato in CSS di seguito:

clearfix:after,
clearfix:before {
  content: " ";
  /* Older browser do not support empty content */
  visibility: hidden;
  display: block;
  height: 0;
  clear: both;
}

0

Ecco un metodo diverso, la stessa cosa, ma un po 'diverso

la differenza è il punto di contenuto che viene sostituito con un \00A0==whitespace

Maggiori informazioni su questo http://www.jqui.net/tips-tricks/css-clearfix/

.clearfix:after { content: "\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
.clearfix{ display: inline-block;}
html[xmlns] .clearfix { display: block;}
* html .clearfix{ height: 1%;}
.clearfix {display: block}

Eccone una versione compatta ...

.clearfix:after { content: "\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;width:0;font-size: 0px}.clearfix{ display: inline-block;}html[xmlns] .clearfix { display: block;}* html .clearfix{ height: 1%;}.clearfix {display: block}

Ti stai sostituendo qui in almeno 3 casi. .clearfix {...}, html[xmlns] .clearfix {...}, * html .clearfix {...}, E .clearfix {...}tutto selezionare la stessa cosa e sovrascrivere l'altro. Questo è un po 'confuso e non proprio necessario.
ORyan,

Questa è la vecchia versione del metodo clearfix CSS, è stata presa da css-tricks.com/snippets/css/clear-fix che ho poi scoperto, che il "." [Punto] era troppo fastidioso e lo ha sostituito con uno spazio bianco , quindi perché \00A0, penso che sia stato a causa della compatibilità tra browser e la conoscenza del tempo.
Val
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.