Perché l'altezza di un elemento contenitore non aumenta se contiene elementi mobili?


210

Vorrei chiedere come funzionano l'altezza e il galleggiante. Ho un div esterno e un div interno che ha contenuto in esso. La sua altezza può variare a seconda del contenuto del div interno ma sembra che il mio div interno trabocchi il div esterno. Quale sarebbe il modo corretto di farlo?

 <html>
    <body>
        <div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
    	    <div style="width:500px; height:200px; background-color:black; float:right"></div>
        </div>
    </body>
</html>



bello e molto bene grazie!
Bassam Alugili,

Risposte:


581

Gli elementi fluttuanti non aumentano l'altezza dell'elemento contenitore e, quindi, se non li cancelli, l'altezza del contenitore non aumenta ...

Ti faccio vedere visivamente:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Più spiegazione:

<div>
  <div style="float: left;"></div>
  <div style="width: 15px;"></div> <!-- This will shift 
                                        besides the top div. Why? Because of the top div 
                                        is floated left, making the 
                                        rest of the space blank -->

  <div style="clear: both;"></div> 
  <!-- Now in order to prevent the next div from floating beside the top ones, 
       we use `clear: both;`. This is like a wall, so now none of the div's 
       will be floated after this point. The container height will now also include the 
       height of these floated divs -->
  <div></div>
</div>

Puoi anche aggiungere overflow: hidden;elementi contenitore, ma ti suggerisco di usare clear: both;invece.

Inoltre, se desideri cancellare automaticamente un elemento, puoi utilizzarlo

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

Come funziona CSS Float?

Cos'è esattamente il galleggiante e cosa fa?

  • La floatproprietà è fraintesa dalla maggior parte dei principianti. Bene, cosa fa esattamente float? Inizialmente, la floatproprietà è stata introdotta per far fluire il testo attorno alle immagini, che sono mobili lefto right. Ecco un'altra spiegazione di @Madara Uchicha.

    Quindi, è sbagliato usare la floatproprietà per posizionare le scatole fianco a fianco? La risposta è no ; non ci sono problemi se si utilizza la floatproprietà per impostare le caselle affiancate.

  • Un elemento mobile inlineo blocklivellato farà sì che l'elemento si comporti come un inline-blockelemento.

    dimostrazione

  • Se si sposta un elemento lefto right, l' widthelemento dell'elemento sarà limitato al contenuto che contiene, a meno che non widthsia definito esplicitamente ...

  • Non puoi floatun elemento center. Questo è il problema più grande che abbia sempre visto con i principianti float: center;, che non è un valore valido per la floatproprietà. floatviene generalmente utilizzato per float/ spostare i contenuti all'estrema sinistra o all'estrema destra . Esistono solo quattro valori validi per la floatproprietà left, ad esempio right, none(predefinito) e inherit.

  • L'elemento genitore collassa, quando contiene elementi figlio fluttuati, per evitare ciò, usiamo la clear: both;proprietà, per cancellare gli elementi flottanti su entrambi i lati, il che impedirà il collasso dell'elemento genitore. Per ulteriori informazioni, puoi fare riferimento qui alla mia altra risposta .

  • (Importante) Pensaci dove abbiamo una pila di vari elementi. Quando usiamo float: left;o float: right;l'elemento si sposta sopra la pila di uno. Quindi gli elementi nel normale flusso di documenti si nasconderanno dietro gli elementi fluttuati perché si trovano a livello di pila sopra i normali elementi fluttuati. (Per favore, non fare riferimento a questo z-indexperché è completamente diverso.)


Prendendo come esempio un caso per spiegare come funzionano i float CSS, supponendo che abbiamo bisogno di un semplice layout a 2 colonne con intestazione, piè di pagina e 2 colonne, quindi ecco come appare il progetto ...

inserisci qui la descrizione dell'immagine

Nell'esempio sopra, fluttueremo solo le caselle rosse, o puoi floatsia sul left, oppure puoi floatsu left, e anche un altro right, dipende dal layout, se sono 3 colonne, puoi float2 colonne leftdove un'altra uno rightdipende così, anche se in questo esempio, abbiamo un layout semplificato a 2 colonne, quindi floatuno a lefte l'altro a right.

Markup e stili per la creazione del layout spiegati più in basso ...

<div class="main_wrap">
    <header>Header</header>
    <div class="wrapper clear">
        <div class="floated_left">
            This<br />
            is<br />
            just<br />
            a<br />
            left<br />
            floated<br />
            column<br />
        </div>
        <div class="floated_right">
            This<br />
            is<br />
            just<br />
            a<br />
            right<br />
            floated<br />
            column<br />
        </div>
    </div>
    <footer>Footer</footer>
</div>

* {
    -moz-box-sizing: border-box;       /* Just for demo purpose */
    -webkkit-box-sizing: border-box;   /* Just for demo purpose */
    box-sizing: border-box;            /* Just for demo purpose */
    margin: 0;
    padding: 0;
}

.main_wrap {
    margin: 20px;
    border: 3px solid black;
    width: 520px;
}

header, footer {
    height: 50px;
    border: 3px solid silver;
    text-align: center;
    line-height: 50px;
}

.wrapper {
    border: 3px solid green;
}

.floated_left {
    float: left;
    width: 200px;
    border: 3px solid red;
}

.floated_right {
    float: right;
    width: 300px;
    border: 3px solid red;
}

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

Andiamo passo dopo passo con il layout e vediamo come funziona float.

Prima di tutto, usiamo l'elemento wrapper principale, puoi solo supporre che sia il tuo viewport, quindi usiamo headere assegniamo un heightdi 50pxcosì niente di speciale. È solo un normale elemento a livello di blocco non flottante che occuperà 100%spazio orizzontale a meno che non sia flottato o non gli assegniamo inline-block.

Il primo valore valido per floatè leftcosì nel nostro esempio, che utilizziamo float: left;per .floated_left, quindi intendiamo spostare un blocco leftsull'elemento del nostro contenitore.

La colonna galleggiava a sinistra

E sì, se vedi, l'elemento genitore, che è .wrappercompresso, quello che vedi con un bordo verde non si è espanso, ma dovrebbe essere giusto? Torneremo su questo tra un po ', per ora, abbiamo fatto galleggiare una colonna left.

Venendo alla seconda colonna, lascia che floatquesto allaright

Un'altra colonna galleggiava a destra

Qui, abbiamo 300pxun'ampia colonna che noi floatal right, che siederà accanto alla prima colonna mentre galleggia sul left, e poiché è fluttuato sul left, ha creato una grondaia vuota sul right, e poiché c'era ampio spazio sul right, il nostro rightl'elemento flottante era perfettamente posizionato accanto a leftquello.

Tuttavia, l'elemento genitore è compresso, bene, risolviamolo ora. Esistono molti modi per impedire che l'elemento genitore venga compresso.

  • Aggiungi un elemento a livello di blocco vuoto e utilizzalo clear: both;prima della fine dell'elemento genitore, che contiene elementi fluttuanti, ora questo è una soluzione economica per i cleartuoi elementi fluttuanti che farà il lavoro per te ma, ti consiglio di non usarlo.

Aggiungi, <div style="clear: both;"></div>prima delle .wrapper divestremità, come

<div class="wrapper clear">
    <!-- Floated columns -->
    <div style="clear: both;"></div>
</div>

dimostrazione

Bene, questo risolve molto bene, nessun genitore compresso più, ma aggiunge un markup non necessario al DOM, quindi alcuni suggeriscono di usarlo overflow: hidden;sull'elemento genitore che contiene elementi figlio fluttuati che funzionano come previsto.

Usa overflow: hidden;su.wrapper

.wrapper {
    border: 3px solid green;
    overflow: hidden;
}

dimostrazione

Ciò ci consente di risparmiare un elemento ogni volta che è necessario, clear floatma quando ho testato vari casi con questo, ha fallito in uno specifico, che utilizza box-shadowgli elementi figlio.

Demo (impossibile vedere l'ombra su tutti e 4 i lati,overflow: hidden;causa questo problema)

Così quello che ora? Salvare un elemento, no, overflow: hidden;quindi andare per un chiaro hack di correzione, utilizzare lo snippet di seguito nel CSS e, proprio come si usa overflow: hidden;per l'elemento genitore, chiamare il classseguente elemento genitore per auto-cancellare.

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

<div class="wrapper clear">
    <!-- Floated Elements -->
</div>

dimostrazione

Qui, l'ombra funziona come previsto, inoltre, cancella automaticamente l'elemento genitore che impedisce il collasso.

E infine, usiamo il piè di pagina dopo che abbiamo cleargli elementi fluttuanti.

dimostrazione


Quando viene float: none;comunque utilizzato, in quanto predefinito, quindi è utile dichiararlo float: none;?

Bene, dipende, se stai cercando un design reattivo, userai questo valore molte volte, quando vuoi che gli elementi fluttuati vengano visualizzati uno sotto l'altro a una certa risoluzione. Perché quella float: none;proprietà gioca un ruolo importante lì.


Pochi esempi del mondo reale di quanto floatsia utile.

  • Il primo esempio che abbiamo già visto è quello di creare uno o più layout di una colonna.
  • Usando imgfloating all'interno pche consentirà al nostro contenuto di fluire.

Demo (senza galleggianteimg)

Demo 2 (imgfluttuato suleft)

  • Utilizzo floatper la creazione di menu orizzontale - Demo

Float anche il secondo elemento, oppure usa `margin`

Ultimo ma non meno importante, voglio spiegare questo caso particolare in cui floatsolo un singolo elemento leftma non floatl'altro, quindi cosa succede?

Supponiamo che se rimuoviamo float: right;dal nostro .floated_right class, la divvolontà sarà resa dall'estremo in leftquanto non è flottata.

dimostrazione

Quindi, in questo caso, sia possibile floatla al leftpure

O

È possibile utilizzare margin-leftquale sarà uguale alla dimensione della colonna mobile a sinistra, ovvero 200pxlarga .


3
Il fatto che i float non contribuiscano all'altezza di un genitore a livello di blocco è esplicitamente indicato qui nelle specifiche: w3.org/TR/CSS21/visudet.html#normal-block Il motivo per cui l'aggiunta di un clearfix funziona è perché 1) il clearfix è (di solito) nel flusso normale 2) i float di clearing richiedono che il clearfix sia posizionato in fondo ai float 3) il contenitore deve essere allungato per contenere quel clearfix.
BoltClock

@BoltClock sarebbe meglio se esegui il rollback della modifica del titolo in quanto influirà gravemente sul seo per gli utenti che trovano come funziona il float .. puoi scrivere quei termini su google e controllare .. altrimenti questa risposta canonica non è utile se le persone lo sono non sono in grado di trovare quello che stanno cercando.
Mr. Alien,

"Come funziona il float CSS?" è un titolo estremamente ampio, ed è anche fuorviante per le persone a votare per chiudere qualsiasi domanda fluttuante come un duplicato di questo. La domanda qui copre solo un aspetto: i contenitori che avvolgono (o non avvolgono) i galleggianti.
BoltClock

@BoltClock Comunque la tecnicità rimane la stessa di quella spiegata clear: both;, ma va bene se senti che la modifica giustifica così continuiamo così
Mr. Alien,

1
risposta brillante. "Spostando qualsiasi elemento a sinistra o a destra, la larghezza dell'elemento sarà limitata al contenuto che contiene, a meno che la larghezza non sia definita in modo esplicito" - ho osservato la stessa cosa e stavo solo cercando di confermarlo. Grazie
Deen John,

38

Devi aggiungere overflow:autoal tuo div genitore perché includa il div interno fluttuante:

<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

Esempio jsFiddle


6
questa non è una soluzione, stai nascondendo il contenuto che esce dai confini dal div esterno.
Alejandro Ruiz Arias,

@AlejandroRuizArias - Esattamente come si nasconde qualcosa?
j08691,

3
In questo esempio niente, ma se si introduce abbastanza contenuto nel div interno sì.
Alejandro Ruiz Arias,

Questo non fa ciò che l'OP stava cercando: Forked jsfiddle.net/h0ceb5ra
TecBrat

1
Eccezionale. L'unica soluzione di attributo che stavo cercando, se tutto il resto fosse così semplice, non ci sarebbe bisogno di riduzioni.
YK,

10

Stai riscontrando il bug float (anche se non sono sicuro che sia tecnicamente un bug a causa del numero di browser che presentano questo comportamento). Ecco cosa sta succedendo:

In circostanze normali, supponendo che non sia stata impostata un'altezza esplicita, un elemento a livello di blocco come un div imposterà la sua altezza in base al suo contenuto. La parte inferiore del div parent si estenderà oltre l'ultimo elemento. Sfortunatamente, il galleggiamento di un elemento impedisce al genitore di tenere conto dell'elemento fluttuante quando ne determina l'altezza. Ciò significa che se il tuo ultimo elemento è mobile, non "allungherà" il genitore allo stesso modo di un normale elemento.

radura

Esistono due modi comuni per risolvere questo problema. Il primo è aggiungere un elemento "clearing"; cioè un altro elemento al di sotto di quello mobile che costringerà il genitore ad allungarsi. Quindi aggiungi il seguente html come ultimo figlio:

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

Non dovrebbe essere visibile e usando clear: entrambi, ti assicuri che non siederà accanto all'elemento fluttuante, ma dopo di esso.

overflow:

Il secondo metodo, che è preferito dalla maggior parte delle persone (penso) è quello di cambiare il CSS dell'elemento genitore in modo che l'overflow sia tutt'altro che "visibile". Pertanto, impostando l'overflow su "nascosto", il genitore si allungherà oltre la parte inferiore del figlio fluttuante. Questo è vero solo se non hai impostato un'altezza sul genitore, ovviamente.

Come ho detto, il secondo metodo è preferito in quanto non richiede di andare e aggiungere elementi semanticamente privi di significato al markup, ma ci sono momenti in cui è necessario overflowche siano visibili, nel qual caso l'aggiunta di un elemento di clearing è più che accettabile .


3

È a causa del galleggiante del div. Aggiungi overflow: hiddenl'elemento esterno.

<div style="overflow:hidden; margin:0 auto;width: 960px; min-height: 100px; background-color:orange;">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

dimostrazione


3

Si confonde il modo in cui i browser visualizzano gli elementi quando sono presenti elementi mobili. Se un elemento di blocco è mobile (il div interno nel tuo caso), altri elementi di blocco lo ignoreranno perché il browser rimuove gli elementi mobili dal normale flusso della pagina Web. Quindi, poiché il div fluttuante è stato rimosso dal flusso normale, il div esterno viene riempito, come se il div interno non fosse presente. Tuttavia, gli elementi incorporati (immagini, collegamenti, testo, virgolette) rispetteranno i confini dell'elemento mobile. Se si introduce del testo nel div esterno, il testo verrà posizionato intorno al div interno.

In altre parole, gli elementi a blocchi (intestazioni, paragrafi, div, ecc.) Ignorano gli elementi fluttuanti e riempiono, e gli elementi incorporati (immagini, collegamenti, testo, ecc.) Rispettano i confini degli elementi fluttuanti.

Un esempio di violino qui

<body>
    <div style="float:right; background-color:blue;width:200px;min-height:400px;margin-right:20px">
           floating element
    </div>
    <h1 style="background-color:red;"> this is a big header</h1>
    <p style="background-color:green"> this is a parragraph with text and a big image. The text places arrounds the floating element. Because of the image is wider than space between paragrah and floating element places down the floating element. Try to make wider the viewport and see what happens :D
        <img src="http://2.bp.blogspot.com/_nKxzQGcCLtQ/TBYPAJ6xM4I/AAAAAAAAAC8/lG6XemOXosU/s1600/css.png">
     </p>

3
Non evidenziare il testo e condividere i collegamenti dei violini, inserisci i codici nella tua risposta dalla prossima volta, perché se il collegamento dei violini è morto, il futuro utente non riceverà alcun aiuto qui e la tua risposta non avrà alcun significato
Mr. Alien,


1

puoi utilizzare la proprietà di overflow nel div del contenitore se non hai alcun div da mostrare sul contenitore, ad esempio:

<div class="cointainer">
    <div class="one">Content One</div>
    <div class="two">Content Two</div>
</div>

Ecco i seguenti css:

.container{
    width:100%;/* As per your requirment */
    height:auto;
    float:left;
    overflow:hidden;
}
.one{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

.two{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

-----------------------O-------------------------- ----

    <div class="cointainer">
        <div class="one">Content One</div>
        <div class="two">Content Two</div>
        <div class="clearfix"></div>
    </div>

Ecco i seguenti css:

    .container{
        width:100%;/* As per your requirment */
        height:auto;
        float:left;
        overflow:hidden;
    }
    .one{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }

    .two{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }
    .clearfix:before,
    .clearfix:after{
        display: table;
        content: " ";
    }
    .clearfix:after{
        clear: both;
    }
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.