2012-06-08 8 views
38

http://jsfiddle.net/julien_c/GmAL4/L'applicazione di un fondo per <html> e/o <body>

ho scoperto che se si applica uno sfondo CSS per body, occupa l'intera pagina (non importa quale sia l'altezza effettiva o la larghezza di body è).

Tuttavia, se si applica uno sfondo CSS sia html e body, lo sfondo per bodynon occupa l'intera pagina.

Questa discrepanza è un comportamento previsto?

Come potrei fare per la sovrapposizione di due sfondi a schermo intero (ad esempio, un colore di sfondo e un'immagine semitrasparente?)

+1

possibile duplicato di [Qual è la differenza tra l'applicazione delle regole css in html rispetto al corpo?] (Http: // stackoverflow.it/questions/6739601/what-is-the-difference-between-application-css-rules-to-html-comparison-to-body) –

risposta

51

Questo è correct behavior. body non occupa immediatamente l'intera altezza del viewport, anche se appare così quando si applica solo uno sfondo a quest'ultimo. In realtà, l'elemento html assumerà sullo sfondo di body se non si dà il proprio background e html passerà questo al viewport:

Lo sfondo dell'elemento radice diventa lo sfondo di la tela e la sua area di pittura di sfondo si estendono fino a coprire l'intera tela, sebbene qualsiasi immagine sia dimensionata e posizionata rispetto all'elemento radice come se fossero state dipinte per quell'elemento da solo. (In altre parole, l'area di posizionamento dello sfondo è determinata come per l'elemento radice.) Se il valore 'background-color' della radice è 'trasparente', il colore di sfondo della tela è dipendente da UA. L'elemento radice non dipinge di nuovo questo sfondo, vale a dire, il valore utilizzato del suo sfondo è trasparente.

Per i documenti il ​​cui elemento principale è un elemento HTML HTML o un elemento XHTML html: se il valore calcolato di 'background-image' sull'elemento radice è 'none' e il suo 'background-color' è 'trasparente', i programmi utente devono invece propagare i valori calcolati delle proprietà dello sfondo dal primo elemento HTML BODY o XHTML body elemento di quell'elemento. I valori utilizzati delle proprietà dello sfondo dell'elemento BODY sono i relativi valori iniziali e i valori propagati vengono trattati come se fossero specificati nell'elemento radice. Si consiglia agli autori di documenti HTML di specificare lo sfondo del canvas per l'elemento BODY anziché l'elemento HTML.

Detto questo, però, è possibile sovrapporre qualsiasi immagine di sfondo su un colore di sfondo su un singolo elemento (sia html o body), senza dover fare affidamento su due elementi - è sufficiente utilizzare background-color e background-image o combinarli in background proprietà stenografica:

body { 
    background: #ddd url(background.png) center top no-repeat; 
} 

Se si desidera combinare due immagini di sfondo, è necessario fare affidamento su più ambiti di provenienza.Ci sono principalmente due giorni per farlo:

  • Nei CSS2, questo è dove lo styling entrambi gli elementi viene in aiuto: è sufficiente impostare un'immagine di sfondo per html e un'altra immagine di body cui si desidera sovrapporre rispetto al primo. Per garantire l'immagine di sfondo su body display a tutta altezza finestra, è necessario applicare height e min-height rispettivamente così:

    html { 
        height: 100%; 
        background: #ddd url(background1.png) repeat; 
    } 
    
    body { 
        min-height: 100%; 
        background: transparent url(background2.png) center top no-repeat; 
    } 
    

    Per inciso, il motivo per cui è necessario specificare height e min-height a html e body rispettivamente è perché nessuno dei due elementi ha un'altezza intrinseca. Entrambi sono height: auto per impostazione predefinita. È il viewport che ha il 100% di altezza, quindi height: 100% viene prelevato dal viewport, quindi applicato a body come minimo per consentire lo scorrimento del contenuto.

  • in CSS3, la sintassi è stato esteso in modo da poter declare multiple background values in a single property, eliminando la necessità di applicare sfondi a più elementi (o regolare height/min-height):

    body { 
        background: url(background2.png) center top no-repeat, 
           #ddd url(background1.png) repeat; 
    } 
    

    L'unica avvertenza è che in un solo sfondo a più livelli, solo il livello più in basso può avere un colore di sfondo. In questo esempio è possibile vedere che il valore transparent non è presente nel livello superiore.

    E non preoccuparti: il comportamento sopra specificato con valori di propagazione dello sfondo funziona esattamente allo stesso modo anche se utilizzi sfondi a più livelli.

Se è necessario supportare i browser più vecchi, però, avrete bisogno di andare con il metodo CSS2, che è sostenuto tutta la strada fino a IE7.

I miei commenti sotto this other answer spiegano, con un accompagnamento fiddle, come body è in realtà compensata da html da margini di default, anche se sembra che sia in corso riempito fuori invece, ancora una volta a causa di questo apparentemente strano fenomeno.


questo può avere le sue radici nella impostazione del HTML background e bgcolor attributi body causando sfondo attribuiscono da applicare a tutta la finestra. Maggiori informazioni su questo here.

+2

Puoi fornire un riferimento alle specifiche W3C relativo a questo, quindi la tua risposta diventa un fatto e non una speculazione? –

+7

@Robert Koritnik: Heh, mi dispiace per quello. Le correzioni successive rapide sono come rotolo. Dovrebbe essere più completo ora. – BoltClock

+0

Grazie per il riferimento. Non ho ricevuto la tua ultima osservazione (il trucco di sovrapposizione). Come potresti sovrapporre due sfondi a schermo intero? –