Rendi il div esterno automaticamente alla stessa altezza del suo contenuto fluttuante


94

Voglio che l'esterno div, che è nero, avvolga il suo divfluttuare al suo interno. Non voglio usare style='height: 200pxin divcon l' outerdivid in quanto voglio che sia automaticamente l'altezza del suo contenuto (ad esempio, i floating div).

<div id='outerdiv' style='border: 1px solid black;background-color: black;'>
<div style='width=300px;border: red 1px dashed;float: left;'>
    <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
</div>

<div style='width=300px;border: red 1px dashed;float: right;'>
    <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
</div>

Come ottenerlo?

Risposte:


167

Puoi impostare il outerdivCSS di questo

#outerdiv {
    overflow: hidden; /* make sure this doesn't cause unexpected behaviour */
}

Puoi farlo anche aggiungendo un elemento alla fine con clear: both. Questo può essere aggiunto normalmente, con JS (non una buona soluzione) o con lo :afterpseudo elemento CSS (non ampiamente supportato nei vecchi IE).

Il problema è che i contenitori non si espandono naturalmente per includere elementi figlio flottati. Stai attento con l'utilizzo del primo esempio, se hai elementi figli al di fuori dell'elemento genitore, saranno nascosti. Puoi anche usare 'auto' come valore della proprietà, ma questo richiamerà le barre di scorrimento se qualsiasi elemento appare all'esterno.

Puoi anche provare a far fluttuare il contenitore principale, ma a seconda del tuo design, questo potrebbe essere impossibile / difficile.


37
Vorrei aver capito la logica del perché overflow: in questo caso funziona nascosto.
masteroleary

2
Sì, speravo di non essere stato solo io a pensare che fosse controintuitivo. alex?
regularmike

3
@masteroleary @regularmike HTML/CSSnon è mai stata una buona tecnologia dell'interfaccia utente, quindi le cose contro-intuitive sono abbastanza comuni :)
Yuriy Nakonechnyy

2
@masteroleary Mi rendo conto che questo è un vecchio thread, ma di recente ho provato a rispondere a una domanda simile su stackoverflow.com/questions/21041297#21041625 - spero che aiuti
xec

1
+1 per la floatsoluzione. Funziona molto bene con gli altri guasti, soprattutto se abbinato a Twitter Bootstrap.
Fizzix

17

In primo luogo, ti consiglio vivamente di eseguire lo stile CSS in un file CSS esterno, piuttosto che farlo in linea. È molto più facile da mantenere e può essere più riutilizzabile utilizzando le classi.

Elaborando la risposta di Alex (e la clearfix di Garret) di "aggiungere un elemento alla fine con clear: both", puoi farlo in questo modo:

    <div id='outerdiv' style='border: 1px solid black; background-color: black;'>
        <div style='width: 300px; border: red 1px dashed; float: left;'>
            <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
        </div>

        <div style='width: 300px; border: red 1px dashed; float: right;'>
            <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
        </div>
        <div style='clear:both;'></div>
    </div>

Funziona (ma come puoi vedere i CSS in linea non sono così belli).


Perché sono stato valutato in basso? Funziona e ho giustamente riconosciuto che non era una bella soluzione.
Lycana

1
Non ne sono sicuro, avrei fatto +1 per riportarti almeno a 0. Forse sei stato rifiutato perché non hai corretto il suo CSS errato ... cioè l'uso del segno di uguale per impostare una proprietà CSS non è corretto.
alex

giusto. Apprezzo il +1 alex. Ho pensato che la mia affermazione fosse giusta.
Lycana

Questa soluzione è migliore IMO. Avrei accettato questa risposta se fosse la mia domanda.
ksg91


7

So che alcune persone mi odieranno, ma ho trovato display:table-cellaiuto in questi casi.

È davvero più pulito.


display uso div esterno: tabella; e all'interno di div utilizzano display: table-cell;
Anukul Limpanasil il

4

Prima di tutto non usi width=300pxche è un'impostazione di attributo per il tag non CSS, usa width: 300px;invece.

Suggerirei di applicare la clearfixtecnica su #outerdiv. Clearfix è una soluzione generale per cancellare 2 div floating in modo che il div genitore si espanderà per accogliere i 2 div floating.

<div id='outerdiv' class='clearfix' style='width:600px; background-color: black;'>
    <div style='width:300px; float: left;'>
        <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
    </div>

    <div style='width:300px; float: left;'>
        <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
    </div>
</div>

Ecco un esempio della tua situazione e cosa fa Clearfix per risolverlo.


3

Usa jQuery:

Set Parent Height = Child offsetHeight.

$(document).ready(function() {
    $(parent).css("height", $(child).attr("offsetHeight"));
}

3
Overkill, quando puoi farlo solo con i CSS.
alex

1
Con la mia risposta puoi impostare l'altezza del genitore come quella del bambino, ma usando l'overflow non stiamo cambiando l'altezza del genitore che creerà qualche problema se stiamo mostrando i dati dopo il div genitore.
Harpal

1

Uso clear: both;

Ho passato più di una settimana a cercare di capirlo!

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.