Quali metodi di 'clearfix' posso usare?


864

Ho il secolare problema di divavvolgere un layout a due colonne. La mia barra laterale è mobile, quindi il mio contenitorediv non riesce a racchiudere il contenuto e la barra laterale.

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

Sembra che ci siano numerosi metodi per correggere il bug chiaro in Firefox:

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

Nella mia situazione, l'unica che sembra funzionare correttamente è la <br clear="all"/>soluzione, che è un po 'trasandata.overflow:automi dà brutte barre di scorrimento e overflow:hiddendeve sicuramente avere effetti collaterali. Inoltre, IE7 apparentemente non dovrebbe soffrire di questo problema a causa del suo comportamento scorretto, ma nella mia situazione soffre lo stesso di Firefox.

Quale metodo attualmente disponibile per noi è il più efficace?


1
Uso jqui.net/tips-tricks/css-clearfix mi aiuta a nascondere il punto :)
Val

1
Che dire di IE 6 e IE 7? Non seguono mai il modo giusto di cancellare le cose.
Praveen Kumar Purushothaman,

Ora siamo tra un anno, c'è qualche possibilità di rivedere la risposta corretta al moderno clearfix a tre righe delineato qui , come utilizzato nei framework di grandi nomi Bourbon e Inuit.css? Vedi la mia risposta qui sotto .
iono,

Risposte:


1039

A seconda del design che viene prodotto, ciascuna delle soluzioni CSS clearfix di seguito ha i suoi vantaggi.

Il clearfix ha applicazioni utili ma è stato anche usato come hack. Prima di usare un clearfix forse queste moderne soluzioni CSS possono essere utili:


Moderne soluzioni Clearfix


Contenitore con overflow: auto;

Il modo più semplice per cancellare gli elementi fluttuati è usare lo stile overflow: autosull'elemento contenitore. Questa soluzione funziona in tutti i browser moderni.

<div style="overflow: auto;">
  <img
    style="float: right;"
    src="path/to/floated-element.png"
    width="500"
    height="500"
  > 
  <p>Your content here…</p>
</div>

Un aspetto negativo, l'uso di determinate combinazioni di margine e riempimento sull'elemento esterno può causare la visualizzazione di barre di scorrimento, ma ciò può essere risolto posizionando il margine e il riempimento su un altro elemento genitore contenente.

L'uso di 'overflow: hidden' è anche una soluzione clearfix, ma non avrà barre di scorrimento, tuttavia l'utilizzo ritaglierà hiddenqualsiasi contenuto posizionato all'esterno dell'elemento contenitore.

Nota: l'elemento floated è un imgtag in questo esempio, ma potrebbe essere qualsiasi elemento html.


Clearfix Reloaded

Thierry Koblentz su CSSMojo ha scritto: L'ultimo clearfix ricaricato . Ha notato che lasciando cadere il supporto per oldIE, la soluzione può essere semplificata in un'istruzione css. Inoltre, l'utilizzo display: block(anziché display: table) consente ai margini di collassare correttamente quando gli elementi con clearfix sono fratelli.

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

Questa è la versione più moderna di clearfix.


Soluzioni Clearfix precedenti

Le soluzioni seguenti non sono necessarie per i browser moderni, ma possono essere utili per il targeting di browser meno recenti.

Tieni presente che queste soluzioni si basano su bug del browser e pertanto dovrebbero essere utilizzate solo se nessuna delle soluzioni sopra descritte funziona per te.

Sono elencati approssimativamente in ordine cronologico.


"Beat That ClearFix", un clearfix per i browser moderni

Thierry Koblentz' di CSS Mojo ha sottolineato che quando si mira browser moderni, ora possiamo cadere il zoome ::beforedi proprietà / valori e utilizzare semplicemente:

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

Questa soluzione non supporta IE 6/7 ... apposta!

Thierry offre anche: " Un avvertimento : se avvii un nuovo progetto da zero, fallo, ma non scambiare questa tecnica con quella che hai adesso, perché anche se non supporti oldIE, le tue regole esistenti impediscono margini di collasso ".


Micro Clearfix

La soluzione Clearfix più recente e adottata a livello globale, Micro Clearfix di Nicolas Gallagher .

Supporto noto: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

.container::before, .container::after {
  content: "";
  display: table;
}
.container::after {
  clear: both;
}
.container {
  zoom: 1;
}

Proprietà di overflow

Questo metodo di base è preferito per il solito caso, quando il contenuto posizionato non verrà mostrato al di fuori dei limiti del contenitore.

http://www.quirksmode.org/css/clearing.html - spiega come risolvere i problemi comuni relativi a questa tecnica, vale a dire, l'impostazione width: 100%sul contenitore.

.container {
  overflow: hidden;
  display: inline-block;
  display: block;
}

Anziché utilizzare la displayproprietà per impostare "hasLayout" per IE, è possibile utilizzare altre proprietà per attivare "hasLayout" per un elemento .

.container {
  overflow: hidden;
  zoom: 1;
  display: block;
}

Un altro modo per cancellare i float usando la overflowproprietà è usare l' hackcore di sottolineatura . IE applicherà i valori preceduti dal carattere di sottolineatura, gli altri browser no. La zoomproprietà innesca hasLayout in IE:

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

Mentre funziona ... non è l'ideale usare gli hack.


Torta: metodo di schiarimento facile

Questo vecchio metodo "Easy Clearing" ha il vantaggio di consentire agli elementi posizionati di rimanere fuori dai limiti del contenitore, a spese di CSS più complicati.

Questa soluzione è piuttosto vecchia, ma puoi imparare tutto su Easy Clearing on Position Is Everything: http://www.positioniseverything.net/easyclearing.html


Elemento che utilizza la proprietà "clear"

La soluzione rapida e sporca (con alcuni inconvenienti) per quando schiacci rapidamente qualcosa insieme:

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

svantaggi

  • Non è reattivo e quindi potrebbe non fornire l'effetto desiderato se gli stili di layout cambiano in base alle query multimediali. Una soluzione in puro CSS è più ideale.
  • Aggiunge markup html senza necessariamente aggiungere alcun valore semantico.
  • Richiede una definizione e una soluzione incorporate per ogni istanza piuttosto che un riferimento di classe a una singola soluzione di un "clearfix" nel CSS e riferimenti di classe ad esso nel codice HTML.
  • Rende il codice difficile da lavorare con gli altri in quanto potrebbero dover scrivere più hack per aggirare il problema.
  • In futuro, quando è necessario / si desidera utilizzare un'altra soluzione clearfix, non sarà necessario tornare indietro e rimuovere tutti i <br style="clear: both" />tag disseminati attorno al markup.

25
@David Rivers: il metodo: after non è un hack in quanto non sfrutta un errore di analisi in un browser, utilizza una funzionalità di css come soluzione. Inoltre: after sarà supportato nei browser futuri, a differenza dell'hack di sottolineatura. Idealmente ci sarà una proprietà CSS che può essere applicata a un elemento che lo farà contenere tutto il suo contenuto.
Beau Smith,

7
Grazie per la rottura. Trovo il metodo: dopo "easy clearing" superiore a "overflow: hidden", in quanto non ritaglia le ombre della scatola CSS3 o gli elementi posizionati. Le righe extra di codice ne valgono sicuramente la pena.
Aneon,

7
Non sto sostenendo il chiaro: entrambe le soluzioni, ma non sono d'accordo con la tua "sporca" etichettatura. L'argomento 'aggiungere peso / caricare più lentamente' sembra sciocco, in quanto è una breve riga di codice html, rispetto alle diverse linee di CSS (che anche il tuo browser deve caricare). Per l'argomento del "valore semantico", un br con chiaro: entrambi è molto più facile da capire che cercare di capire un gruppo di sciocchi css della squadra di fuoco. chiaramente chiaro: entrambi sono brevi e semplici e imho non ha alcun effetto sulla "professionalità".
Vigrond,

16
Contrariamente alla credenza popolare, overflow: hiddeno overflow: autonon cancella i float (classificarlo come "clearfix" è un termine improprio); invece fa sì che un elemento crei un nuovo contesto di formattazione all'interno del quale possono essere contenuti i float. Questo fa sì che il contenitore si estenda all'altezza dei galleggianti per contenerli. Non è previsto alcun gioco: detto ciò, puoi comunque scegliere di cancellare, o non cancellare, i galleggianti all'interno del contenitore a seconda del layout.
BoltClock

3
Non dovremmo più supportare IE7. Si prega di aggiornare questo con il metodo a tre righe qui
iono

70

Quali problemi stiamo cercando di risolvere?

Ci sono due considerazioni importanti quando si fanno cose galleggianti:

  1. Contenente carri discendenti. Ciò significa che l'elemento in questione si rende abbastanza alto da avvolgere tutti i discendenti galleggianti. (Non pendono fuori.)

    Contenuto flottante appeso fuori dal suo contenitore

  2. Discendenti isolanti da galleggianti esterni. Ciò significa che i discendenti all'interno di un elemento dovrebbero essere in grado di usare clear: bothe non interagire con i float all'esterno dell'elemento.

    <code> clear: entrambi </code> interagiscono con un float altrove nel DOM

Blocca i contesti di formattazione

C'è solo un modo per fare entrambi. E questo per stabilire un nuovo contesto di formattazione dei blocchi . Gli elementi che stabiliscono un contesto di formattazione a blocchi sono un rettangolo isolato in cui i float interagiscono tra loro. Un contesto di formattazione dei blocchi sarà sempre abbastanza alto da avvolgere visivamente i suoi discendenti mobili e nessun float al di fuori di un contesto di formattazione dei blocchi può interagire con gli elementi all'interno. Questo isolamento bidirezionale è esattamente ciò che desideri. In IE, questo stesso concetto si chiama hasLayout , che può essere impostato tramite zoom: 1.

Ci sono diversi modi per stabilire un blocco di formattazione contesto, ma la soluzione che vi consiglio è display: inline-blockcon width: 100%. (Naturalmente, ci sono i soliti avvertimenti con l'utilizzo width: 100%, per cui l'uso box-sizing: border-boxo put padding, margineborder su un elemento diverso.)

La soluzione più robusta

Probabilmente l'applicazione più comune dei float è il layout a due colonne. (Può essere esteso a tre colonne.)

Innanzitutto la struttura del markup.

<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>

E ora il 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 */
}

Prova tu stesso

Vai a JS Bin per giocare con il codice e vedere come questa soluzione è costruita da zero.

Metodi di clearfix tradizionali considerati dannosi

Il problema con le tradizionali soluzioni clearfix è che usano due diversi concetti di rendering per raggiungere lo stesso obiettivo per IE e tutti gli altri. In IE usano hasLayout per stabilire un nuovo contesto di formattazione dei blocchi, ma per tutti gli altri usano i box generati ( ) con , che non stabiliscono un nuovo contesto di formattazione dei blocchi. Ciò significa che le cose non si comporteranno allo stesso modo in tutte le situazioni. Per una spiegazione del perché questo è negativo, vedere Tutto ciò che sai su Clearfix è sbagliato .:afterclear: both


Quali sono "le solite avvertenze sull'uso width: 100%"? Inoltre, stai suggerendo di usare zoom: 1in ¶1 di §2?
Baumr,

Risposta interessante, ma che dire overflow: hidden, quale concetto di rendering invoca? E come può essere diverso hasLayout?
Baumr,

Vero, ma se si evita di usarlo position: absolute, allora va bene e farà parte dello stesso concetto di rendering?
Baumr,

Vedo. Con il concetto di rendering intendevo dire se overflow: hiddenimpone qualcosa che differisce da ciò che hasLayout fa?
Baumr,

2
Maggiori informazioni hasLayoutsu stackoverflow.com/questions/1794350/what-is-haslayout . Lo considero sinonimo di stabilire un nuovo contesto di formattazione dei blocchi. Gli elementi che lo fanno sono essenzialmente responsabili del layout di tutti i loro elementi discendenti. Un risultato di ciò è che gli elementi che stabiliscono un nuovo contesto di formattazione del blocco contengono discendenti mobili e i float al di fuori dell'elemento non interagiscono con gli clear: left|right|bothelementi all'interno. (Questa è la risposta sopra.)
Chris Calo,

54

Il nuovo standard, usato da Inuit.css e Bourbon - due framework CSS / Sass molto usati e ben mantenuti:

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

Appunti

Tieni presente che i clearfix sono essenzialmente un trucco per ciò che i layout di flexbox possono ora fornire in un modo molto più intelligente . I float CSS sono stati originariamente progettati per far fluire il contenuto inline - come immagini in un lungo articolo testuale - e non per layout di griglia e simili. Se i tuoi browser di destinazione supportano flexbox , vale la pena esaminarli.

Questo non supporta IE7. Non dovresti supportare IE7. Ciò continua a esporre gli utenti a exploit di sicurezza non risolti e rende la vita più difficile per tutti gli altri sviluppatori web, poiché riduce la pressione su utenti e organizzazioni per passare ai browser moderni.

Questo clearfix è stato annunciato e spiegato da Thierry Koblentz nel luglio 2012. Ha perso peso inutile dal micro-clearfix del 2011 di Nicolas Gallagher . Nel processo, libera uno pseudo-elemento per uso personale. Questo è stato aggiornato per l'usodisplay: block anziché display: table(di nuovo, credito a Thierry Koblentz).


3
Spero che la tua risposta ottenga più voti su questo dato che sono totalmente d'accordo con te. Ancora una volta, è il 2013 e credo davvero che questa sia la soluzione che le persone dovrebbero usare.
rafaelbiten,

2
Concordato. theie7countdown.com Controlla la tua analisi e speriamo che IE7 non valga la pena.
Giustino,

1
@Justin concordato; la tua analisi personale lo spiegherà. Non penso che il sito del conto alla rovescia sia stato aggiornato da un po 'di tempo, tuttavia - è meglio usare le statistiche di caniuse che mettono IE7 allo 0,39% a livello globale.
iono,

1
Si spera che hack come il clearfix diventino presto inutili attraverso l'uso di flexbox, piuttosto che float, per il layout.
iono il

Puoi obiettare a supportare IE7 quanto vuoi, ma se esiste un requisito dal punto di vista aziendale per supportare questi utenti (per motivi diversi - in genere denaro), lo farai indipendentemente da come ti senti sul problema
Kris Selbekk,

27

Consiglio di utilizzare quanto segue, che è tratto da 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;  
}

8
Chi ricorda IE-mac ora? Perché rendere le cose così complicate a causa di problemi che non sono più rilevanti?
Ilya Streltsyn,

23

La proprietà overflow può essere utilizzata per cancellare i float senza mark-up aggiuntivo:

.container { overflow: hidden; }

Questo funziona per tutti i browser tranne IE6, dove tutto ciò che devi fare è abilitare hasLayout (lo zoom è il mio metodo preferito):

.container { zoom: 1; }

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


3
overflow: nascosto non funziona nel browser PS3. Non che la maggior parte delle persone abbia bisogno di questo per funzionare, ma è la cosa più significativa che fa esplodere il mio sito in PS3 che stiamo cercando di colpire per motivi di lavoro. Ugh.
gtd

1
Ed è un problema se si desidera che determinati contenuti si appendano all'esterno del contenitore.
Simon East,

trabocco: nascosto ha un brutto effetto collaterale del contenuto del ritaglio
Chris Calo,

9
overflow:hiddenha l' effetto del ritaglio del contenuto; ha l' effetto collaterale di svuotare il contenitore ;-)
Tamlyn,

overflow: auto attiverà anche un contesto di formattazione dei blocchi e non taglierà il contenuto.
Harry Robbins il

17

Ho trovato un bug nel metodo CLEARFIX ufficiale: il DOT non ha una dimensione del carattere. E se imposti il height = 0primo elemento nel tuo DOM-Tree ha la classe "clearfix" avrai sempre un margine in fondo alla pagina di 12px :)

Devi risolverlo in questo modo:

/* float clearing for everyone else */
.clearfix:after{
  clear: both;
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
  font-size: 0;
}

Ora fa parte del layout YAML ... Basta dare un'occhiata: è molto interessante! http://www.yaml.de/en/home.html


15

Questa è una soluzione abbastanza ordinata:

/* For modern browsers */
.cf:before,
.cf:after {
    content:"";
    display:table;
}

.cf:after {
    clear:both;
}

/* For IE 6/7 (trigger hasLayout) */
.cf {
    zoom:1;
}

È noto per funzionare in Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

Compreso il selettore: before non è necessario per cancellare i float, ma impedisce ai margini superiori di collassare nei browser moderni. Ciò garantisce la coerenza visiva con IE 6/7 quando viene applicato lo zoom: 1.

Da http://nicolasgallagher.com/micro-clearfix-hack/


1
Sì, a metà 2011, questa è la mia soluzione preferita. Consente di posizionare gli oggetti all'esterno del riquadro di contenimento, se necessario (evitando overflow: hidden).
Simon East,

10

Clearfix da bootstrap:

.clearfix {
  *zoom: 1;
}

.clearfix:before,
.clearfix:after {
  display: table;
  line-height: 0;
  content: "";
}

.clearfix:after {
  clear: both;
}

Da quale versione di bootstrap proviene?
Eric,

8

Uso solo: -

.clear:after{
  clear: both;
  content: "";
  display: block;
}

Funziona meglio e compatibile con IE8 + :)


Non funzionerà in IE7 in quanto non supporta gli pseudoelementi CSS.
superluminario,

4
... Ecco perché ha detto "compatibile con IE8 +". La maggior parte dei siti Web non deve più supportare IE7, il suo utilizzo è inferiore all'1% in tutto il mondo. theie7countdown.com
Justin il

8

Data l'enorme quantità di risposte che non avrei pubblicato. Tuttavia, questo metodo può aiutare qualcuno, come mi ha aiutato.

Stare lontano dai galleggianti quando possibile

Vale la pena ricordare che evito i galleggianti come l'Ebola. Ci sono molte ragioni e non sono solo; Leggi la risposta di Rikudo su cos'è un clearfix e vedrai cosa intendo. Con le sue stesse parole:...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...

Esistono altre buone (e talvolta migliori) opzioni oltre ai float. Man mano che la tecnologia avanza e migliora, la flexbox (e altri metodi) saranno ampiamente adottati e i float diventeranno solo un brutto ricordo. Forse un CSS4?


Cattivo comportamento fluttuante e cancellazioni fallite

Prima di tutto, a volte, potresti pensare di essere al sicuro dai galleggianti fino a quando il salvavita non viene bucato e il tuo flusso html inizia ad affondare:

Nel codepen http://codepen.io/omarjuvera/pen/jEXBya seguito, la pratica di sgombrare un galleggiante con <div classs="clear"></div>(o altro elemento) è comune ma disapprovata e antisemantica.

<div class="floated">1st</div>
<div class="floated">2nd</div>
<div class="floated">3nd</div>
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

div {
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

div.floated {
    float: left;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Tuttavia , proprio quando pensavi che il tuo galleggiante fosse degno della vela ... boom! Man mano che le dimensioni dello schermo diventano sempre più piccole, vedi comportamenti strani come nel grafico seguente (Stesso http://codepen.io/omarjuvera/pen/jEXBya ):

esempio di bug float 1

Perché dovresti preoccuparti? Non sono sicuro della cifra esatta, ma circa l'80% (o più) dei dispositivi utilizzati sono dispositivi mobili con schermi di piccole dimensioni. I computer desktop / laptop non sono più re.


Non finisce qui

Questo non è l'unico problema con i float. Ce ne sono molti, ma in questo esempio alcuni potrebbero dire all you have to do is to place your floats in a container. Ma come puoi vedere nel codepen e nella grafica, non è così. Apparentemente ha peggiorato le cose:

HTML

<div id="container" class="">
  <div class="floated">1st</div>
  <div class="floated">2nd</div>
  <div class="floated">3nd</div>
</div> <!-- /#conteiner -->
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

#container {
  min-height: 100px; /* To prevent it from collapsing */
  border: 1px solid #0f0;
}
.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Per quanto riguarda il risultato?

È lo stesso! float bug sample 2

Almeno sai, inizierai una festa CSS, invitando tutti i tipi di selettori e proprietà alla festa; creare un pasticcio più grande del tuo CSS rispetto a quello con cui hai iniziato. Solo per riparare il tuo galleggiante.


CSS Clearfix in soccorso

Questo pezzo di CSS semplice e molto adattabile è una bellezza e un "salvatore":

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Questo è tutto! Funziona davvero senza interrompere la semantica e ho già detto che funziona? :

Dallo stesso campione ... HTML

<div class="clearfix">
    <div class="floated">1st</div>
    <div class="floated">2nd</div>
    <div class="floated">3nd</div>
</div>
<section>Below</section>

CSS

div.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}
section {
        border: 4px solid #00f;
}


.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Ora non abbiamo più bisogno <div classs="clear"></div> <!-- Acts as a wall --> e felice la polizia semantica. Questo non è l'unico vantaggio. Questo clearfix risponde a qualsiasi dimensione dello schermo senza l'uso di@media nella sua forma più semplice. In altre parole, manterrà il tuo container galleggiante sotto controllo e prevenendo inondazioni. Infine, fornisce supporto per i vecchi browser tutto in un piccolo karate chop =)

Ecco di nuovo il clearfix

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

2
Il motivo per cui l'elemento con il clearnome della classe non funziona è che l'attributo classè sbagliato. Quello che hai scritto è classs, con un ulteriore s.
castagna,

Il tuo esempio non dimostra ciò che rivendichi, anche dopo aver corretto gli errori.
Ripristina Monica - notmaynard,

7

Galleggio sempre le sezioni principali della mia griglia e applico clear: both;al piè di pagina. Ciò non richiede un ulteriore div o classe.


Neil, immagino che il problema si presenti quando si desidera un bordo attorno a entrambe le colonne (o un colore / immagine di sfondo), è necessaria una sezione wrapper che richiede l'hack contenente.
Simon East,

5

onestamente; tutte le soluzioni sembrano essere un trucco per correggere un bug di rendering ... sbaglio?

ho scoperto <br clear="all" />di essere il più semplice, il più semplice. vedere class="clearfix"dappertutto non può accarezzare la sensibilità di qualcuno che si oppone a elementi estranei di markeup, vero? stai solo dipingendo il problema su una tela diversa.

utilizzo anche la display: hiddensoluzione, che è eccezionale e non richiede dichiarazioni di classe extra o markup html ... ma a volte sono necessari gli elementi per traboccare il contenitore, ad es. nastri e fasce graziosi


5
overflow: hiddenPenso che intendi
ajbeaven

Alcuni consigliano di usare la classe chiamata gruppo che rende le cose più semantiche. Sinceramente non sono sicuro del perché questo non abbia preso
piede

sto completamente ritrattando questa posizione. ora uso solo clearfix. ma su contenitori molto comuni, lo "infilo" nel css per ridurre l'inquinamento degli attributi di classe. inoltre, nominarlo "gruppo" sembra carino. anche meno caratteri da scrivere
duggi,

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

4

Ho provato tutte queste soluzioni, un grande margine verrà aggiunto <html>automaticamente all'elemento quando uso il codice qui sotto:

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

Infine, ho risolto il problema del margine aggiungendo font-size: 0;al CSS sopra.


2
Questo perché stai aggiungendo una riga con ., basta usarecontent: ""
Quaranta

4

Con SASS, il clearfix è:

@mixin clearfix {
    &:before, &:after {
        content: '';
        display: table;
    }
    &:after {
        clear: both;
    }
    *zoom: 1;
}

ed è usato come:

.container {
    @include clearfix;
}

se vuoi il nuovo clearfix:

@mixin newclearfix {
    &:after {
        content:"";
        display:table;
        clear:both;
    }
}

4

Con MENO ( http://lesscss.org/ ), è possibile creare un utile aiutante clearfix:

.clearfix() {
  zoom: 1;
  &:before { 
    content: ''; 
    display: block; 
  }
  &:after { 
    content: ''; 
    display: table; 
    clear: both; 
  }
}

E quindi usalo con contenitori problematici, ad esempio:

<!-- HTML -->
<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>
/* LESS */
div#container {
  .clearfix();
}

4

Usare overflow:hidden/ autoe l'altezza per ie6 sarà sufficiente se il contenitore mobile ha un elemento padre.

Uno dei #test potrebbe funzionare, perché l'HTML indicato di seguito cancella i float.

#test {
  overflow:hidden; // or auto;
  _height:1%; forces hasLayout in IE6
}

<div id="test">
  <div style="floatLeft"></div>
  <div style="random"></div>
</div>

Nei casi in cui questo si rifiuta di funzionare con ie6, è sufficiente fare galleggiare il genitore per cancellare il float.

#test {
  float: left; // using float to clear float
  width: 99%;
}

Non ho mai avuto bisogno di nessun altro tipo di compensazione. Forse è il modo in cui scrivo il mio HTML.


1
Mi piacerebbe studiare il tuo modo di scrivere HTML senza cancellare alcun elemento. Potresti pubblicare alcuni link?
Starx,

4

Un nuovo valore di visualizzazione sembra al lavoro in una riga.

display: flow-root;

Dalla specifica W3: "L'elemento genera un box contenitore di blocchi e ne espone i contenuti utilizzando il layout di flusso. Stabilisce sempre un nuovo contesto di formattazione dei blocchi per i suoi contenuti."

Informazioni: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136

※ Come mostrato nel link sopra, il supporto è attualmente limitato, quindi il supporto fallback come di seguito potrebbe essere utile: https://github.com/fliptheweb/postcss-flow-root


3

Vorrei #contentanche galleggiare , in questo modo entrambe le colonne contengono float. Anche perché ti permetterà di cancellare gli elementi all'interno #contentsenza cancellare la barra laterale.

La stessa cosa con il wrapper, dovresti renderlo un contesto di formattazione a blocchi per avvolgere le due colonne.

Questo articolo menziona alcuni trigger che è possibile utilizzare: bloccare i contesti di formattazione .


3

Un clearfix è un modo per un elemento di cancellare automaticamente dopo se stesso, quindi non è necessario aggiungere markup aggiuntivi.

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

Normalmente dovresti fare qualcosa come segue:

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

Con clearfix, devi solo

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

2

Perché solo provare a usare css hack per fare ciò che 1 riga di HTML fa il lavoro. E perché non usare HTML semantico tu put break per tornare alla linea?

Per me è davvero meglio usare:

<br style="clear:both" />

E se non vuoi uno stile nel tuo html devi solo usare la classe per la tua pausa e inserire il .clear { clear:both; }tuo CSS.

Vantaggio di questo:

  • Uso semantico di html per tornare alla linea
  • Se nessun caricamento CSS funzionerà
  • Non è necessario alcun codice CSS aggiuntivo e Hack
  • non c'è bisogno di simulare il br con CSS, esiste già in HTML

2

Supponendo che tu stia utilizzando questa struttura HTML:

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

Ecco il CSS che vorrei usare:

div#container {
    overflow: hidden;    /* makes element contain floated child elements */
}

div#content, div#sidebar {
    float: left;
    display: inline;    /* preemptively fixes IE6 dobule-margin bug */
}

Uso questo set tutto il tempo e funziona bene per me, anche in IE6.


2

A differenza di altri clearfix, eccone uno aperto senza contenitori

Altri clearfix richiedono che l'elemento flottante sia in un contenitore ben marcato o necessiti di un ulteriore, semanticamente vuoto <div>. Al contrario, una chiara separazione tra contenuto e markup richiede una rigorosa soluzione CSS a questo problema.

Il semplice fatto che si debba contrassegnare la fine di un float, non consente la composizione CSS automatica .

Se quest'ultimo è il tuo obiettivo, il float dovrebbe essere lasciato aperto a qualsiasi cosa (paragrafi, elenchi ordinati e non ordinati ecc.) Da avvolgere attorno ad esso, fino a quando non si incontra un "clearfix". Ad esempio, il clearfix potrebbe essere impostato da una nuova intestazione.

Questo è il motivo per cui utilizzo il seguente clearfix con nuove intestazioni:

h1 {
    clear: both;
    display: inline-block;
    width: 100%;
}

Questa soluzione viene ampiamente utilizzata sul mio sito Web per risolvere il problema: il testo accanto a una miniatura fluttuante è breve e il margine superiore del prossimo oggetto di cancellazione non viene rispettato.

Inoltre, impedisce qualsiasi intervento manuale durante la generazione automatica di PDF dal sito. Ecco una pagina di esempio .


2

Uso sempre il micro-clearfix :

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

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 */
.cf {
    *zoom: 1;
}

In Cascade Framework lo applico anche di default su elementi a livello di blocco. L'IMO, applicandolo di default sugli elementi a livello di blocco, offre agli elementi a livello di blocco un comportamento più intuitivo rispetto al loro comportamento tradizionale. Mi ha anche reso molto più facile aggiungere il supporto per i browser più vecchi a Cascade Framework (che supporta IE6-8 e i browser moderni).


0

Puoi anche inserirlo nel tuo CSS:

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

*:first-child+html .cb{zoom: 1} /* for IE7 */

E aggiungi la classe "cb" al tuo div parent:

<div id="container" class="cb">

Non dovrai aggiungere nient'altro al tuo codice originale ...


0

#content{float:left;}
#sidebar{float:left;}
.clear{clear:both; display:block; height:0px; width:0px; overflow:hidden;}
<div id="container">
  <div id="content">text 1 </div>
  <div id="sidebar">text 2</div>
  <div class="clear"></div>
</div>


-2

Hai provato questo:

<div style="clear:both;"/>

Non ho avuto problemi con questo metodo.


2
Penso che il punto sia che stiamo cercando di evitare sia markup extra sia stili in linea con questa soluzione. Dipende da quale compromesso sia il tuo più felice, suppongo
Sam Murray-Sutton,

1
Il problema con questo metodo è che nei browser IE il div ha un'altezza, quindi la tua spaziatura sarà disattivata. Ecco perché i metodi CSS impostano l'altezza e la dimensione del carattere.
zznq,

devi dire <div style = "clear: both"> </div> con un tag di chiusura adeguato per essere correttamente conforme a XHTML. Ho avuto problemi con jQuery quando non lo facevo
Simon_Weaver

1
Ironia della sorte, "presumibilmente da chiudere" <div/> è conforme a X (HT) ML, ma non è compatibile con HTML , quindi per i documenti pubblicati in quanto text/htmltutti i browser lo tratteranno come tag non chiuso. Sfortunatamente non esistono tag autochiudenti per i text/htmldocumenti, indipendentemente dal tipo di documento .
Ilya Streltsyn,

-2

Il mio metodo preferito è creare una classe clearfix nel mio documento css / scss come di seguito

.clearfix{
    clear:both
}

E poi chiamalo nel mio documento HTML come mostrato di seguito

<html>
  <div class="div-number-one">
    Some Content before the clearfix
  </div>

  <!-- Let's say we need to clearfix Here between these two divs --->
  <div class="clearfix"></div>

  <div class="div-number-two">
    Some more content after the clearfix
  </div>
</html>

-2

È così semplice clearfix che risolve il problema quando usiamo le proprietà float all'interno dell'elemento div. Se usiamo due elementi div uno come float: left; e l'altro come float: giusto; possiamo usare clearfix per il genitore dei due elementi div. Se ci rifiutiamo di utilizzare clearfix, gli spazi non necessari si riempiono con i contenuti di seguito e la struttura del sito verrà rotta.

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.