Div altezza 100% e si espande per adattarsi al contenuto


172

Ho un elemento div sulla mia pagina con la sua altezza impostata al 100%. Anche l'altezza del corpo è impostata al 100%. Il div interno ha uno sfondo e tutto ciò che è diverso dallo sfondo del corpo. Questo funziona per rendere l'altezza div al 100% dell'altezza dello schermo del browser, ma il problema è che ho contenuti all'interno di quel div che si estende verticalmente oltre l'altezza dello schermo del browser. Quando scorro verso il basso, il div termina nel punto in cui hai dovuto iniziare a scorrere la pagina, ma il contenuto trabocca oltre. Come faccio a far sì che il div vada sempre fino in fondo per adattarsi al contenuto interno?

Ecco una semplificazione del mio CSS:

body {
    height:100%;
    background:red;
}

#some_div {
    height:100%;
    background:black;
}

Una volta che scorro la pagina, l'oscurità termina e il contenuto scorre sullo sfondo rosso. Non sembra importare se ho impostato la posizione su relativa o assoluta su #some_div, il problema si verifica in entrambi i casi. Il contenuto all'interno di #some_div è per lo più posizionato in modo assoluto ed è generato dinamicamente da un database, quindi la sua altezza non può essere conosciuta in anticipo.

Modifica: ecco uno screenshot del problema: problema div


Questo è stato chiesto alcune settimane fa. Vedrò se riesco a trovare quella domanda. Credo di averlo commentato. modificare Credo che la tua domanda è simile a questo: stackoverflow.com/questions/9398313/...
jmbertucci

per favore, il tuo codice per una migliore comprensione
sandeep

puoi pubblicare il tuo codice completo pls
Sven Bieder

23
Vuoi tutte le mie migliaia di righe di codice php, css e javascript? Ho pubblicato la parte di CSS pertinente alla domanda ...
Joey

2
NECROPOST è un GO: impostando la proprietà overflow risolve generalmente questioni come queste in cui il contenuto all'interno di un div sta allungando passato ( overflow: hidden;, overflow: scroll;, ecc).
AlbertEngelB,

Risposte:


308

Ecco cosa dovresti fare in stile CSS, principalmente div

display: block;
overflow: auto;

E non toccare height


4
Ha funzionato alla grande. Avevo bisogno di aggiungere height: 100%al html, bodye il div contenitore per renderlo riempire l'altezza, quando non c'era abbastanza contenuti però.
Nico Huysamen,

soluzione incredibile ma puoi effettivamente toccare l'altezza se l'objetive è qualcosa di simile a un montaggio a finestra reattivo
Alexis Rabago Carvajal

È display: block;necessario? I div sono già elementi a livello di blocco.
Max Heiber,

aggiunge una barra di scorrimento interna per me (sia orizzontale che verticale)
Nathan H

Se l'elemento padre è ancora un po 'più alto degli elementi figlio, controlla eventuali spazi extra e / o  rimuovili. Prova anche a regolare l'altezza della linea. Ad esempio, ho messo line-height: 0, perché non avevo bisogno di testo, solo per mostrare un'immagine.
Zorgatone,

57

Impostare heighta autoe min-heighta 100%. Questo dovrebbe risolverlo per la maggior parte dei browser.

body {
  position: relative;
  height: auto;
  min-height: 100% !important;
}

3
IMO, questo risponde alla domanda "Come faccio a fare in modo che il div vada sempre fino in fondo per adattarsi al contenuto interno?" meglio della risposta attualmente contrassegnata, che attiva semplicemente lo scorrimento overflow piuttosto che garantire che div / body si espanda per adattarsi al suo contenuto. +1
Jammerz858,

Ha funzionato per il mio caso. Grazie!
Tyson Nero,

Potrebbe valere la pena notare che per qualche motivo, non funziona se heightè 100%ed min-heightè auto- mi aspetto che questi siano intercambiabili in questo caso, ma sembra che non lo siano.
PeaBrain,

13

Di solito questo problema sorge quando gli elementi figlio di un genitore div vengono flottati. Ecco l' ultima soluzione del problema:

Nel tuo file CSS scrivi la seguente classe chiamata .clearfix insieme allo pseudo-selettore : after

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

Quindi, nel tuo HTML, aggiungi la classe .clearfix al tuo Div genitore. Per esempio:

<div class="clearfix">
    <div></div>
    <div></div>
</div>

Dovrebbe funzionare sempre. Puoi chiamare il nome della classe come .group anziché .clearfix , poiché renderà il codice più semantico. Si noti che non è necessario aggiungere il punto o anche uno spazio nel valore del contenuto tra la doppia citazione "". Inoltre, overflow: auto; potrebbe risolvere il problema, ma causa altri problemi come mostrare la barra di scorrimento e non è raccomandato.

Fonte: Blog di Lisa Catalano e Chris Coyier


8

Se si lascia il height: 100%e utilizzare display:block;l' divavrà tanto spazio quanto il contenuto all'interno della div. In questo modo tutto il testo rimarrà sullo sfondo nero.


Dove hai usato display: block? Non lo vedo nella tua domanda.
Razze di leggerezza in orbita

L'ho aggiunto a #some_div dopo che Ronnie lo ha suggerito, ma non ha risolto il problema.
Joey

1
Potresti provare ad aggiungere float: none; allo stesso #some_div css
RonnieVDPoel

Invece di float: none;, utilizzare clear:both;. Fa la stessa cosa ma è più cross-browser, @RonnieVDPoel
Cannicide,

7

Questa domanda potrebbe essere vecchia, ma merita un aggiornamento. Ecco un altro modo per farlo:

#yourdiv {
    display: flex;
    width:100%;
    height:100%;
}

1
Se hai intenzione di pubblicare una vecchia domanda, si consiglia di utilizzare i valori correnti (AKA senza prefissi su flex).
jhpratt,

Scusa, non so di cosa stai parlando.
user9459537

1
I prefissi Flex non sono necessari da un po 'di tempo ormai.
jhpratt,

E quali sono?
user9459537

5

Prova questo:

body { 
    min-height:100%; 
    background:red; 
} 

#some_div {
    min-height:100%; 
    background:black; 
} 

IE6 e le versioni precedenti non supportano la proprietà di altezza minima.

Penso che il problema sia che quando si dice al corpo di avere un'altezza del 100%, il suo sfondo può essere alto solo come il hieght di un "viewport" del browser (l'area di visualizzazione che esclude le barre degli strumenti del browser e le barre di stato e le barre dei menu e il bordi della finestra). Se il contenuto è più alto di una finestra, traboccherà l'altezza dedicata allo sfondo.

Questa proprietà di altezza minima sul corpo dovrebbe FORZARE che lo sfondo sia alto almeno quanto una finestra se il contenuto non riempie l'intera pagina fino in fondo, ma dovrebbe anche lasciarlo crescere verso il basso per includere più contenuti interni.


3

Vecchia domanda, ma nel mio caso ho scoperto che l'ho position:fixedrisolto per me. La mia situazione potrebbe essere stata leggermente diversa. Avevo un semitrasparente sovrapposto divcon un'animazione di caricamento che avevo bisogno di essere visualizzato durante il caricamento della pagina. Quindi usando height:auto / 100%o min-height: 100%entrambi riempivo la finestra ma non l'area fuori dallo schermo. Utilizzando position:fixedfatto questo overlay scorrere con l'utente, in modo da coprire sempre l'area visibile e mantenere la mia animazione di precaricamento centrata sullo schermo.


1

Aggiungi queste due righe nel tuo ID CSS #some_div

display: block;
overflow: auto;

Dopodiché otterrai ciò che stai cercando!


0

Non sono del tutto sicuro di aver capito la domanda perché questa è una risposta abbastanza semplice, ma qui va ... :)

Hai provato a impostare la proprietà di overflow del contenitore su visibile o automatico?

#some_div {
    height:100%;
    background:black; 
    overflow: visible;
    }

L'aggiunta di ciò dovrebbe spingere il contenitore nero a qualsiasi dimensione richiesta dal contenitore dinamico. Preferisco visibile ad auto perché auto sembra venire con barre di scorrimento ...


0

I browser moderni supportano l'unità "viewport height". Questo espanderà il div all'altezza della finestra disponibile. Lo trovo più affidabile di qualsiasi altro approccio.

#some_div {
    height: 100vh;
    background: black;
}

0

Anche tu puoi fare così

display:block;
overflow:auto;
height: 100%;

Ciò includerà ogni tuo div dinamico secondo il contenuto. Supponiamo che se hai un div comune con classe aumenterà l'altezza di ogni div dinamico in base al contenuto


0

Puoi anche usare

 display: inline-block;

il mio ha lavorato con questo


0

OVERLAY SENZA POSIZIONE: FISSO

Un modo davvero interessante che ho capito per un menu recente è stato impostare il corpo su:

position: relative

e imposta la tua classe wrapper in questo modo:

#overlaywrapper {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: #00000080;
    z-index: 100;
}

Ciò significa che non è necessario impostare la posizione fissa e consentire comunque lo scorrimento. L'ho usato per i menu sovrapposti che sono DAVVERO grandi.


0

usa la flessibilità

.parent{
    display: flex
}

.fit-parent{
    display: flex;
    flex-grow: 1
}

0

Ok, ho provato qualcosa del genere:

corpo (normale)

#MainDiv { 
  /* where all the content goes */
  display: table;
  overflow-y: auto;
}

Non è il modo esatto per scriverlo, ma se fai div il display principale come una tabella, si espande e quindi ho implementato le barre di scorrimento.

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.