Come fare un div flottato al 100% di altezza del suo genitore?


256

Ecco l'HTML:

<div id="outer">
    <div id="inner"></div>
    Test
</div>

Ed ecco il CSS:

#inner {
  float: left;
  height: 100%;
}

Dopo l'ispezione con gli strumenti di sviluppo di Chrome, il div interno sta ottenendo un'altezza di 0px.

Come posso forzarlo ad essere il 100% dell'altezza del div genitore?


1
Quindi vuoi che il testo nel div esterno (non nel div interno), ma il div interno fluttuato sia l'altezza del div esterno?
edl,

Qual è il risultato finale che stai cercando di ottenere? Immagino che la mia confusione risieda nel fatto che se il div interno è alto come quello esterno e l'esterno è alto come il testo, non è lo stesso di avere il testo nel div interno?
edl,

2
@edl: Sì, lo è :) Il motivo per cui lo voglio in questo modo è che il div interno ha un'immagine come sfondo. Il testo deve essere accanto. Entrambi devono essere all'interno del div esterno in quanto ha anche un'immagine di sfondo.
Nathan Osman,


2
Vedere e provare le risposte a questa domanda era semplicemente deprimente.
EternalHour

Risposte:


125

Affinché l' #outeraltezza sia basata sul suo contenuto e abbia la #innersua altezza su quello, rendi entrambi gli elementi assolutamente posizionati.

Maggiori dettagli sono disponibili nelle specifiche per la proprietà css height , ma essenzialmente #innerdevono ignorare l' #outeraltezza se #outerl'altezza è auto, a meno che non #outer sia posizionata in modo assoluto. Quindi l' #inneraltezza sarà 0, a meno che non #inner sia posizionata in modo assoluto.

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

Tuttavia ... Posizionando #innerassolutamente, floatun'impostazione verrà ignorata, quindi dovrai scegliere #inneresplicitamente una larghezza e aggiungere un'imbottitura #outerper falsificare la disposizione del testo che sospetto desideri. Ad esempio, di seguito, l'imbottitura di #outerè la larghezza di #inner+3. Convenientemente (dato che l'intero punto doveva raggiungere l' #inneraltezza al 100%) non è necessario avvolgere il testo sottostante #inner, quindi sembrerà proprio #innerfluttuato.

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

Ho eliminato la mia risposta precedente, poiché si basava su troppe ipotesi errate sul tuo obiettivo.


118
Hmm .. la domanda era su Floated div's. Hai risposto ai div di posizione assoluta
Mihkel L.

57
Non smetto mai di sorprendere quanto sia complesso realizzare cose follemente semplici in HTML/CSS:)
Yuriy Nakonechnyy

15
Un modo per farlo senza larghezze di hardcoding? Non eccezionale per contenitori reattivi.
Jake Wilson,

23
Non so perché questo sia stato accettato e votato così tanto. La domanda riguarda i div flottati, che è ciò che mi ha portato qui dalla mia ricerca, e invece questo risponde a div posizionati in modo assoluto.
Matt K,

2
Come fare in modo che un contenitore flottante si adatti verticalmente al suo contenitore? Non facendolo galleggiare più! Haha. Bel tentativo, e abbastanza vicino per essere considerato utile, in realtà.
Rolf,

124

Per il genitore:

display: flex;

Dovresti aggiungere alcuni prefissi http://css-tricks.com/using-flexbox/

Modifica: l'unico inconveniente è IE come al solito, IE9 non supporta la flessibilità. http://caniuse.com/flexbox

Modifica 2: Come notato da @toddsby, allineare gli elementi è per parent e il suo valore predefinito è effettivamente stretch . Se si desidera un valore diverso per figlio, esiste la proprietà align-self.

Modifica 3: jsFiddle: https://jsfiddle.net/bv71tms5/2/


3
Dovresti sottolineare che questo funziona solo nei browser moderni e anche in questo caso richiede prefissi dei fornitori.
kontur

12
Sono sorpreso che questa soluzione non abbia ricevuto più attenzione, dato che la domanda originale richiede che il div bambino sia fluttuato e in tutte le posizioni: le soluzioni assolute lanciano davvero una chiave inglese nelle opere nella maggior parte delle situazioni in cui si utilizzerà float. Questa soluzione offre un'ottima soluzione in cui gli effetti collaterali della posizione: l'assoluto non sono un problema e se sei disposto a scavare un po 'oltre, è possibile ottenere una buona compatibilità cross-browser.
Luke

Questa è la risposta proprio qui. IE9 uscirà abbastanza presto, potrebbe anche aiutarlo con un calcio buono e solido. Questa soluzione è così bella, semplice e facile ... Ho finito di hackerare insieme soluzioni alternative. ;)
jrista

2
Secondo le specifiche più recenti per Flexbox: consultare w3.org/TR/css-flexbox-1/#align-items-property . align-items: stretch;non è richiesto in quanto è il valore predefinito. Inoltre dovrebbe essere definito sul genitore e non sul figlio.
toddsby,

1
Aggiunto violino in risposta. @Tigran
Aiphee,

77

In realtà, finché l'elemento genitore è posizionato, puoi impostare l'altezza del bambino al 100%. Vale a dire, nel caso in cui non si desideri che il genitore sia posizionato in modo assoluto. Lasciami spiegare ulteriormente:

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
Bene, questo è meno limitante del requisito di Chadwick position:absolute(che potrebbe interferire con gli stili di un sito)
henry,

3
Potrei essere solo io, ma ho problemi se la barra laterale è più grande del contenuto. Un colore di sfondo si interromperà nel contenitore principale ma il contenuto della barra laterale trabocca all'esterno del padre.
Howdy_McGee,

Questa è una soluzione molto più flessibile e, anche se hai diversi elementi figlio fluttuati, sembra un inconveniente accettabile lo stile del loro offset assolutamente posizionato. +1
kontur

Grazie molto molto. Ho pubblicato la mia soluzione specifica come risposta a un'altra domanda su SO: stackoverflow.com/a/31749164/84661 .
Brian Haak,

24

Finché non è necessario supportare versioni di Internet Explorer precedenti a IE8, è possibile utilizzare display: table-cell per eseguire ciò:

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

Ciò costringerà ogni elemento con la .innerclasse a occupare l'intera altezza del suo elemento padre.


Anche se funzionerà, non mostrerà un margine, anche se ne specifichi uno. Quindi questa soluzione fallirà se si desidera assegnare un margine. Puoi assegnare il riempimento come soluzione alternativa, ma come lo risolveresti se avessi bisogno di un margine (e non di riempimento)?
Devner,

13
Mi sto perdendo qualcosa qui? La tua domanda richiede che un elemento fluttuato abbia un'altezza del 100%. Quando è mobile, un display: table-cell;elemento non riempie più l'altezza del suo contenitore? Mi manca qualcosa, perché è una tua domanda ...?
user56reinstatemonica8

16

Ho fatto un esempio per risolvere il tuo problema.

Devi creare un involucro, farlo galleggiare, quindi posizionare il div in assoluto e dargli un'altezza del 100%.

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

Spiegazione: Il div .right è assolutamente posizionato. Ciò significa che la sua larghezza e altezza, e le posizioni superiore e sinistra verranno calcolate in base al div genitore principale in posizione assoluta o relativa SOLO se le proprietà di larghezza o altezza sono esplicitamente dichiarate nei CSS; se non vengono dichiarate esplicitamente, tali proprietà verranno calcolate in base al contenitore principale (.right-wrapper).

Pertanto, l'altezza del 100% del DIV verrà calcolata in base all'altezza finale del contenitore e la posizione finale della posizione verticale verrà calcolata in base al contenitore principale.


1
Questa è una soluzione solida per situazioni in cui è possibile garantire che il .rightcontenuto della colonna sia più corto .leftdel contenuto della colonna. Ad esempio, se lo si utilizza su un componente in cui la .leftcolonna ha contenuti di dimensioni variabili e la colonna di destra mostra semplicemente una freccia su una pagina di dettaglio, questa soluzione funziona bene. +1 per quello
Zachary Kniebel

15

Ecco un modo più semplice per ottenerlo:

  1. Imposta la visualizzazione del contenitore (#outer) dei tre elementi: tabella
  2. E imposta gli stessi elementi (#inner) display: table-cell
  3. Rimuovi il galleggiante.
  4. Successo.
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

Grazie a @Itay in Floated div, 100% altezza


8

Se sei pronto a usare un po 'di jQuery, la risposta è semplice!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

Questo funziona bene per far fluttuare un singolo elemento su un lato con il 100% di altezza del suo genitore mentre altri elementi flottanti che normalmente si avvolgono vengono mantenuti su un lato.

Spero che questo aiuti gli altri fan di jQuery.


18
Sembra eccessivo lanciare JavaScript a questo problema di layout.
kontur

1
Come qualcuno che deve sviluppare in IE: GRAZIE!
Rook,

1
Un po 'eccessivo forse, ma questa è una bella risposta, grazie!
Martin,

1
Concordo sul fatto che tutti i problemi di posizionamento dovrebbero essere risolti senza JS.
michaeluskov,

1
È eccessivo usare JS AND jQuery
ViliusL

3

Questo è un esempio di codice per un sistema a griglia di uguale altezza.

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

Sopra è il CSS per div esterno

#inner{
width: 20%;
float: left;
border: 1px solid;
}

Sopra è il div interno

Spero che questo ti aiuti


1

Questo mi ha aiutato.

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

Cambia a destra: e a sinistra: per impostare la larghezza interna # preferibile.


1

Un caso simile quando sono necessari più elementi figlio con la stessa altezza può essere risolto con flexbox:

https://css-tricks.com/using-flexbox/

Impostati display: flex;per gli elementi genitore e flex: 1;figlio, avranno tutti la stessa altezza.


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.