Come può un elemento html riempire il 100% dell'altezza dello schermo rimanente, usando solo css?


118

Ho un elemento di intestazione e un elemento di contenuto:

#header
#content

Voglio che l'intestazione sia di altezza fissa e che il contenuto riempia tutta l'altezza rimanente disponibile sullo schermo, con overflow-y: scroll;.

È possibile senza Javascript?

Risposte:


83

Il trucco è specificare l'altezza del 100% sugli elementi html e body. Alcuni browser guardano agli elementi principali (html, body) per calcolare l'altezza.

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">
        </div>
    </body>
</html>

html, body
{
    height: 100%;
}
#Header
{
    width: 960px;
    height: 150px;
}
#Content
{
    height: 100%;
    width: 960px;
}

1
Ho provato tutte le soluzioni, ma solo questo ha risolto il mio problema.
Alex

1
@Alex se funziona per tutti i browser a cui ti rivolgi, allora procedi con tutti i mezzi e implementalo. I requisiti di ognuno sono diversi.
BentOnCoding

321

dimentica tutte le risposte, questa riga di CSS ha funzionato per me in 2 secondi:

height:100vh;

1vh = 1% dell'altezza dello schermo del browser

fonte

Per ridimensionare il layout reattivo, potresti voler utilizzare:

min-height: 100vh

[aggiornamento novembre 2018] Come menzionato nei commenti, l'utilizzo dell'altezza minima potrebbe evitare problemi con i progetti che rispondono

[aggiornamento aprile 2018] Come accennato nei commenti, nel 2011, quando è stata posta la domanda, non tutti i browser supportavano le unità di visualizzazione. Le altre risposte erano le soluzioni all'epoca: non vmaxè ancora supportata in IE, quindi questa potrebbe non essere ancora la soluzione migliore per tutti.


9
Questa è la risposta più semplice, poiché non è necessario impostare l'altezza di tutti gli elementi principali al 100%. Ecco l'attuale supporto per vh - caniuse.com/#feat=viewport-units - iOS apparentemente potrebbe aver bisogno di una soluzione alternativa, poiché "vh su iOS è segnalato per includere l'altezza della barra degli strumenti inferiore nel calcolo dell'altezza".
Brian Burns

2
WOW, bella scoperta! Guarda tutte queste persone con risposte troppo complicate.
NoName

8
Quando la domanda è stata posta nel 2011, nessuno dei principali browser supportava le unità di visualizzazione. Quelle "risposte troppo complicate" erano le uniche opzioni allora.
JJJ

6
Piccolo suggerimento che a min-height: 100vhsarebbe molto meglio. Sarebbe scalabile anche per progetti reattivi.
Wiggy A.

3
Questo non risponde alla domanda posta, questo occuperebbe il 100% del viewport. Non lo vuole perché la sua intestazione occuperà il x% del viewport, in quanto tale le altre risposte sono corrette.
4cody

35

In realtà l'approccio migliore è questo:

html { 
    height:100%;
}
body { 
    min-height:100%;
}

Questo risolve tutto per me e mi aiuta a controllare il mio piè di pagina e può avere il piè di pagina fisso indipendentemente dallo scorrimento della pagina verso il basso.

Soluzione tecnica - MODIFICATA

Storicamente, l '"altezza" è una cosa difficile da modellare, rispetto alla "larghezza", la più semplice. Dal momento che css si concentra sullo <body>styling per funzionare. Il codice sopra - abbiamo dato <html>e <body>un'altezza. È qui che entra in gioco la magia: poiché abbiamo "altezza minima" sul tavolo da gioco, stiamo dicendo al browser che <body>è superiore rispetto a <html>perché <body>contiene l'altezza minima. Questo a sua volta, consente <body>di sovrascrivere <html>perché <html>aveva l'altezza già in precedenza. In altre parole, stiamo inducendo il browser a "saltare" <html>fuori dal tavolo, in modo da poter applicare lo stile in modo indipendente.


1
Oh mio dio è un miracolo!
Geoff

Come un miracolo, funziona! Ma per favore: perché min-heighte height?
Joy

1
@ShaojiangCai - Storicamente, l '"altezza" è una cosa difficile da modellare, rispetto alla "larghezza", la più semplice. Dal momento che css si concentra sullo <body>styling per funzionare. Questo codice: abbiamo dato <html>e <body>un'altezza. È qui che entra in gioco la magia: dal momento che abbiamo "altezza minima" sul tavolo da gioco, stiamo dicendo al server che <body>è superiore <html>perché <body>contiene l'altezza minima. Questo a sua volta, consente <body>di sovrascrivere <html>perché <html>aveva l'altezza già in precedenza. In altre parole, stiamo inducendo il server a "saltare" <html>fuori dal tavolo, in modo da poterlo stile in modo indipendente.
Faron

2
@Faron Sembra che "browser" sarebbe una parola migliore qui invece di "server". ;)
LET

@EunLeem ... sono d'accordo con te su come avrei potuto scegliere la formulazione corretta per affrontare questo problema. Grazie per il suggerimento "gomito del gomito". Ho aggiornato di conseguenza la mia risposta.
Faron

14

È possibile utilizzare vh sulla proprietà min-height.

min-height: 100vh;

Puoi fare come segue, a seconda di come stai usando i margini ...

min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element

10

La soluzione accettata non funzionerà effettivamente. Si noterà che il contenuto divsarà uguale all'altezza del suo genitore, body. Quindi impostando l' bodyaltezza su 100%verrà impostata uguale all'altezza della finestra del browser. Supponiamo che la finestra del browser fosse 768pxin altezza, impostando l' divaltezza del contenuto su 100%, l' divaltezza di sarà a sua volta 768px. Quindi, ti ritroverai con il div dell'intestazione 150pxe il div del contenuto 768px. Alla fine avrai dei contenuti 150pxsotto il fondo della pagina. Per un'altra soluzione, controlla questo collegamento.


8

Con HTML5 puoi fare questo:

CSS:

body, html{ width:100%; height:100%; padding: 0; margin: 0;}
header{ width:100%; height: 70px; }
section{ width: 100%; height: calc(100% - 70px);}

HTML:

<header>blabablalba </header>
<section> Content </section>

Fai attenzione a usare il calcolo sull'altezza percentuale. Firefox non funzionerà correttamente con questo a meno che tutti i genitori non abbiano un'altezza impostata.
TomDK

4

Per me, il prossimo ha funzionato bene:

Ho inserito l'intestazione e il contenuto in un div

<div class="main-wrapper">
    <div class="header">

    </div>
    <div class="content">

    </div>
</div>

Ho usato questo riferimento per riempire l'altezza con flexbox. Il CSS funziona così:

.main-wrapper {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
.header {
    flex: 1;
}
.content {
    flex: 1;
}

Per maggiori informazioni sulla tecnica flexbox, visita il riferimento



1

La risposta accettata non funziona. E la risposta con il voto più alto non risponde alla domanda effettiva. Con un'intestazione di altezza in pixel fissa e un riempimento nella visualizzazione rimanente del browser e scorrere per owerflow. Ecco una soluzione che funziona davvero, utilizzando il posizionamento assoluto. Presumo anche che l'altezza dell'intestazione sia nota, dal suono di "intestazione fissa" nella domanda. Uso 150px come esempio qui:

HTML:

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">      
        </div>
    </body>
</html>

CSS: (aggiunta del colore di sfondo solo per l'effetto visivo)

#Header
{
    height: 150px;
    width: 100%;
    background-color: #ddd;
}
#Content
{
   position: absolute;
   width: 100%;
   top: 150px;
   bottom: 0;
   background-color: #aaa;
   overflow-y: scroll;
}

Per uno sguardo più dettagliato su come funziona, con il contenuto effettivo all'interno di #Content, dai un'occhiata a questo jsfiddle , usando righe e colonne di bootstrap.


"intestazione altezza pixel fissa" -> esattamente questo! La bottomstruttura si è assicurata che i #Contentrimangano bloccati alla fine della pagina. Apprezzo che tu abbia dedicato del tempo per spiegarlo.
Armfoot

1
E sono felice che abbia aiutato qualcuno;)
jumps4fun

1

In questo caso, voglio che il mio div contenuto principale sia altezza liquida in modo che l'intera pagina occupi il 100% dell'altezza del browser.

height: 100vh;


1

Per favore lasciami aggiungere i miei 5 centesimi qui e offri una soluzione classica:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:0;">Content section</div>
</div>

Funzionerà con tutti i browser, senza script, senza flessibilità. Apri snippet in modalità a pagina intera e ridimensiona il browser: le proporzioni desiderate vengono mantenute anche in modalità a schermo intero.

Nota:

  • Gli elementi con un colore di sfondo diverso possono effettivamente coprirsi l'un l'altro. Qui ho usato il bordo solido per assicurarmi che gli elementi siano posizionati correttamente.
  • idHeader.heighte idContent.topvengono regolati per includere il bordo e dovrebbero avere lo stesso valore se il bordo non viene utilizzato. Altrimenti gli elementi verranno estratti dalla finestra, poiché la larghezza calcolata non include il bordo, il margine e / o il riempimento.
  • left:0; right:0; può essere sostituito da width:100% per lo stesso motivo, se non viene utilizzato alcun bordo.
  • Il test in una pagina separata (non come snippet) non richiede alcuna regolazione html / body.
  • In IE6 e nelle versioni precedenti dobbiamo aggiungere padding-tope / o padding-bottomattributi #idOuterall'elemento.

Per completare la mia risposta, ecco il layout del piè di pagina:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idContent" style="bottom:36px; top:0;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>

Ed ecco il layout con intestazione e piè di pagina:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:36px;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>


0

A meno che non sia necessario supportare IE 9 e versioni precedenti, utilizzerei flexbox

body { display: flex; flex-direction: column; }
.header { height: 70px; }
.content { flex: 1 1 0 }

È inoltre necessario che il corpo riempia l'intera pagina

body, html{ width:100%; height:100%; padding: 0; margin: 0;}

0

CSS PLaY | layout di intestazione / piè di pagina fissi per browser incrociati / colonna singola centrata

Frame CSS, versione 2: esempio 2, larghezza specificata | 456 Berea Street

Una cosa importante è che, sebbene questo sembri facile, ci sarà un bel po 'di codice brutto nel tuo file CSS per ottenere un effetto come questo. Sfortunatamente, è davvero l'unica opzione.


Le risposte di solo collegamento sono scoraggiate. Prova a includere il codice nella tua risposta.
Utente che non è un utente

0
#Header
{
width: 960px;
height: 150px;
}

#Content
{
min-height:100vh;
height: 100%;
width: 960px;
}

-1

La soluzione migliore che ho trovato finora è impostare un elemento piè di pagina nella parte inferiore della pagina e quindi valutare la differenza tra l'offset del piè di pagina e l'elemento che dobbiamo espandere. per esempio

Il file html

<div id="contents"></div>
<div id="footer"></div>

Il file css

#footer {
    position: fixed;
    bottom: 0;
    width: 100%;
}

Il file js (usando jquery)

var contents = $('#contents'); 
var footer = $('#footer');
contents.css('height', (footer.offset().top - contents.offset().top) + 'px');

Potresti anche aggiornare l'altezza dell'elemento del contenuto su ogni ridimensionamento della finestra, quindi ...

$(window).on('resize', function() {
  contents.css('height', (footer.offset().top -contents.offset().top) + 'px');
});

-1

Molto semplice:

#content {
    max-height: 100%;
}

-3

Hai provato qualcosa di simile?

CSS:

.content {
    height: 100%;
    display: block;
}

HTML:

<div class=".content">
<!-- Content goes here -->
</div>
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.