2012-08-16 12 views
5

Se ho il seguente markupaltezza e larghezza su elementi HTML e corpo

<html> 
<body> 
<div id="wrapper"> 
<div id="container"> 
<p>Lots of pragraphs here</p> 
</div> 
</div> 
</body> 
</html> 

con i seguenti stili

html, body, #wrapper 
{ 
width: 100%; 
height: 100%; 
} 
#container 
{ 
width: 960px; 
margin: 0 auto; 
} 

Perché l'elementi HTML, corpo e involucro si estendono a altezza 100% del browser/porta di visualizzazione in FF13. L'html, il corpo e il wrapper si fermano verticalmente a una certa distanza dal fondo quando guardano in Firebug. Il contenitore div si estende alla massima altezza in quanto l'altezza è determinata dal contenuto.

(1263px X 558px per html, corpo, involucro) e (960 X 880px per contenitore)

Guardando predefinita 100% quanto sopra avviene come prima immagine sotto le esposizioni. Ma quando eseguo lo zoom sull'ultimo ingrandimento possibile, ciò non si verifica come mostra la seconda immagine qui sotto e il corpo, l'involucro, l'involucro si estende fino alla piena altezza.

(4267px X 1860px per HTML, il corpo, involucro) - (960px X 1000px per contenitore)

enter image description here enter image description here

+1

'wrapper' e 'contenitore' non sono elementi HTML validi:/ –

+0

@BillyMoat: è un elemento div non un wrapper.

Jawad

+0

@BillyMoat: modificato come se fosse un errore di battitura. – Jawad

risposta

23

tuo html si estende in realtà esattamente al 100% l'altezza del viewport causa viewport qui è la finestra del browser, non il contenuto interiore.

Considerate questo (jsfiddle):

<div id="div1"> 
    <div id="div2"> 
     <div id="div3"> 
      very much content 
     </div> 
    </div> 
</div> 

#div1 { 
    height:300px; 
    overflow-y:scroll; 
    border: 1px solid black; 
} 
#div2 { 
    height:100%; 
} 
#div3 { 
    height:600px; 
} 

div1 qui ha l'altezza di 300px e viene fatto scorrere. Quando si scorre il contenuto si sposta semplicemente il div interno ma l'altezza rimane inviolata che è 300px. Esattamente lo stesso accade quando si imposta height:100% in html. L'altezza del tuo browser rimane la stessa.

Quando si rimpicciolisce il viewport, non si scorre, quindi l'altezza del contenuto interno è inferiore all'altezza del viewport.

Poco, html {height:100%} riguarda l'altezza del genitore non all'altezza del contenuto interno


UPDATE:

è possibile specificare 3 tipi di valori per l'altezza del blocco-elemento:

  • lunghezza - impostare altezza fissa (ad es. '200px', '50em'). Questo è tutto, non posso dire altro.

  • percentuale - da W3C spec:

La percentuale è calcolata rispetto all'altezza del blocco contenitore del riquadrato generato. Se l'altezza del blocco contenitore non è specificata esplicitamente (cioè dipende dall'altezza del contenuto) e questo elemento non è posizionato in modo assoluto, il valore calcola su 'auto'. Un'altezza percentuale sull'elemento radice è relativa al blocco contenitore iniziale.

  • auto - L'altezza dipende dai valori di altre proprietà. (Generalmente l'altezza del contenuto interno: il testo, altri elementi in linea, elementi di blocco ecc)

Quello che sta accadendo quando il browser mostra la pagina:

  1. ottiene height: 100% per <html>. Ciò significa che l'altezza risultante viene calcolata rispetto all'altezza del blocco contenente la casella (html -elementi in quel caso) della casella generata (initial containing block, ovvero browser window in questo caso). Diciamo 1024px.
  2. quindi ci vuole height: 100% per <body>. Imposta l'altezza di body all'altezza già calcolata dello html, ovvero 1024px.
  3. quindi il browser applica height:auto allo #wrapper e quindi allo #container e allo <p>. Non so come faccia esattamente, ma posso supporre che rimandi l'impostazione di altezza (e rispettivamente tutti gli altri stili che dipendono da quello cioè sfondi, bordi, ecc.) E procede al contenuto interno.
  4. il punto successivo è il contenuto di testo. Il browser prende le proprietà correlate specificate o proprie, ovvero default styles, come famiglia di caratteri, dimensione del carattere e altezza del testo.
  5. dopo di che imposterà l'altezza allo <p> -elementi in modo che lo <p> si allunghi per contenere tutto il contenuto (il testo in quel caso). Lo stesso vale per lo #container e lo #wrapper.

Se accade che l'altezza del #wrapper è maggiore di quello del corpo (1024 px così dire convenuto) che l'overflow deve essere applicato al body. Questo è visible che è l'impostazione predefinita. Quindi lo overflow: visible viene applicato allo html. Quindi il browser mostra scorrere per l'intero window. Onestamente, non so se questo è specificato dalle specifiche del W3C, ma posso supporre che lo sia.

Così, quando si scorre la finestra, gli html e body vengono spostati come tutti gli altri elementi. Questo è lo stesso comportamento è con altri elementi (come in jsfiddle I postato sopra):

scrolled part of the body

Notare che lo sfondo è impostato sull'elemento body, ma si estende a tutta canvas ie molto oltre l'elemento body stesso. Questo è per la tua preoccupazione per l'eventuale necessità di impostare la proprietà bg sul corpo. Ciò è conforme al 100% con la W3C spec che afferma (tagliate):

documenti il ​​cui elemento principale è un elemento ... "html" che ha calcolato i valori di 'trasparente' per 'background-color' e ' none 'for' background-image ', i programmi utente devono invece usare il valore calcolato delle proprietà dello sfondo dal primo elemento ... "body" elemento figlio quando si dipingono gli sfondi per la tela e non si deve dipingere uno sfondo per quello elemento figlio. Tali sfondi devono essere ancorati nello stesso punto in cui sarebbero se fossero dipinti solo per l'elemento radice.

Quando si rimpicciolisce la pagina, il browser ricalcola tutte le dimensioni. Diciamo che ogni Ctrl + - riduce la pagina di clic, ad esempio per il 20%. Quindi tutto il testo è ridotto, poiché la sua altezza dipende dalla dimensione del font, che è influenzata dal clic Ctrl + -, corrispondentemente <p>, #container e #wrapper tutti sono ridotti perché la loro altezza dipende dall'altezza di text. Ma body e html hanno un'altezza che dipende dall'altezza dello window che non è influenzata dal clic Ctrl + -. Ecco perché finalmente si ottiene questo: zoomed out page

Non v'è alcuna differenza qui tra larghezza ed altezza comportamento in quel caso. Non vedi lo stesso problema con la dimensione orizzontale semplicemente perché hai impostato width: 960px; per lo #container che si è rivelato inferiore alla larghezza della finestra del browser, quindi non si verificano overflow. Se la larghezza della #container sono stati superando la larghezza del corpo si vede questo: same issue but with the width

Tutto questo è un comportamento normale e previsto e non c'è nulla da risolvere qui.

+0

Quindi come risolvere questo. Se conferisco un colore di sfondo al div # wrapper (div # 3 nel tuo caso), il colore di sfondo (diciamo rosso) si estende solo alla stessa altezza di html e body (div # 1 e div # 2 nel tuo caso) e questo fa sì che il colore di sfondo NON si estenda completamente e quando si esegue lo zoom indietro solo una parte è rossa e in basso una parte è bianca/trasparente (colore di html e corpo). – Jawad

+0

@Jawad, puoi allegare uno sfondo ad un wrapper del tuo contenuto, quindi si estenderà di conseguenza. Inoltre potresti voler usare il cosiddetto "piè di pagina appiccicoso", in modo che il piè di pagina si trovi nella parte inferiore della finestra se non c'è abbastanza contenuto (come nella tua seconda immagine). Vedi questo http://stackoverflow.com/questions/11606856/background-repeat-with-html-body-height-to-100-with-css-sticky-footer/11606934#11606934 – user907860

+0

So tutto di sticky footer. Controlla il mio profilo. Non lo sto chiedendo. Né voglio che l'html {height: 100%} abbia un'altezza del contenuto interno. Non ha nulla a che fare con il contenuto interno (contenitore div # nel mio caso). Voglio che il wrapper html, body e div # abbia un'altezza del 100% in quanto ha una larghezza del 100%. Se si riferisce all'altezza del genitore, il genitore di div # wrapper è body e il genitore del body è html e il genitore di html è la finestra/il viewport del browser. Dato uno sfondo sul wrapper (colore rosso) e altezza 100% impostato su html, body e div # wrapper causa questo problema. – Jawad

1

Perché non si può mai impostare l'altezza al 100% se l'elemento è relativo alla la finestra del browser. La ragione di ciò è che a causa dello scorrimento, la finestra del browser potrebbe potenzialmente essere infinitamente grande. Dovrai impostare un'altezza fissa, o dovrai solo impostare l'altezza per espandere a qualsiasi cosa ci sia dentro.

Tuttavia width: 100%; è perfettamente valido.

Sarà inoltre necessario utilizzare tag html validi. quello che vorrei fare è, invece di usare il wrapper < > e <container>, farei una classe nel tuo css. I nomi delle classi vengono dichiarati avviandoli con un punto.

.container{ 
width: 100%; 
} 

<div class="container"></div> 

Good Luck,

-Brian

+0

quindi perché funziona quando si ingrandisce? – Jawad

+0

Causa non si scorre quando si esegue lo zoom out, semplicemente – user907860

+0

@caligula: Sì, è molto semplice. Utilizzare @ per fornire commenti. – Jawad

Problemi correlati