Aplicar un fondo a <html> y/o <body>
$("#toggle").click(function(){
$("html").toggleClass("bg");
});
html.bg {
background: blue;
}
body {
background: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html class="bg">
<head>
</head>
<body>
Test
<br>
<button id="toggle">Toggle HTML background</button>
</body>
</html>
Descubrí que si aplicas un fondo CSS body
, ocupa toda la página (sin importar cuál body
sea la altura o el ancho real).
Sin embargo, si aplica un fondo CSS a ambos html
y body
, el fondo body
no ocupa toda la página .
¿Es esta discrepancia el comportamiento esperado?
¿Cómo haría para superponer dos fondos de pantalla completa (por ejemplo, un color de fondo y una imagen semitransparente?)
Éste es el comportamiento correcto . 1 En el modo estándar , body
, así comohtml
, no ocupan inmediatamente toda la altura de la ventana gráfica, aunque así lo parezca cuando solo se aplica un fondo a esta última. De hecho, el html
elemento tomará el fondo body
si no le das su propio fondo, y html
lo pasará al lienzo:
El fondo del elemento raíz se convierte en el fondo del lienzo y su área de pintura de fondo se extiende para cubrir todo el lienzo, aunque las imágenes tienen un tamaño y una ubicación en relación con el elemento raíz como si estuvieran pintadas solo para ese elemento. (En otras palabras, el área de posicionamiento del fondo se determina como para el elemento raíz). Si el valor de 'color de fondo' de la raíz es 'transparente', el color de fondo del lienzo depende de UA. El elemento raíz no vuelve a pintar este fondo, es decir, el valor utilizado de su fondo es transparente.
Para documentos cuyo elemento raíz es un
HTML
elemento HTML o unhtml
elemento XHTML: si el valor calculado de 'imagen de fondo' en el elemento raíz es 'ninguno' y su 'color de fondo' es 'transparente', los agentes de usuario deben propagar el valores calculados de las propiedades de fondo del primer elemento secundario HTMLBODY
o XHTML de esebody
elemento. Los valores utilizados deBODY
las propiedades de fondo de ese elemento son sus valores iniciales y los valores propagados se tratan como si estuvieran especificados en el elemento raíz. Se recomienda que los autores de documentos HTML especifiquen el fondo del lienzo para elBODY
elemento en lugar delHTML
elemento.
Dicho esto, sin embargo, puedes superponer cualquier imagen de fondo sobre un color de fondo en un solo elemento (ya sea html
o body
), sin tener que depender de dos elementos; simplemente úsalos background-color
o background-image
combínalos en la background
propiedad abreviada:
body {
background: #ddd url(background.png) center top no-repeat;
}
Si desea combinar dos imágenes de fondo , debe confiar en varios fondos. Hay principalmente dos días para hacer esto:
En CSS2, aquí es donde resulta útil diseñar ambos elementos: simplemente establezca una imagen de fondo
html
y otra imagenbody
que desee superponer sobre la primera. Para garantizar que la imagen de fondobody
se muestre a la altura completa de la ventana gráfica, también debe aplicarheight
ymin-height
respectivamente:html { height: 100%; background: #ddd url(background1.png) repeat; } body { min-height: 100%; background: transparent url(background2.png) center top no-repeat; }
Por cierto, la razón por la que debe especificar
height
ymin-height
ahtml
ybody
respectivamente es porque ninguno de los elementos tiene una altura intrínseca. Ambos sonheight: auto
por defecto. Es la ventana gráfica la que tiene 100% de altura, por lo queheight: 100%
se toma de la ventana gráfica y luego se aplicabody
como mínimo para permitir el desplazamiento del contenido.En CSS3, la sintaxis se ha ampliado para que pueda declarar múltiples valores de fondo en una sola propiedad , eliminando la necesidad de aplicar fondos a múltiples elementos (o ajustar
height
/min-height
):body { background: url(background2.png) center top no-repeat, #ddd url(background1.png) repeat; }
La única advertencia es que en un único fondo de varias capas, sólo la capa inferior puede tener un color de fondo. Puede ver en este ejemplo que
transparent
falta el valor en la capa superior.Y no se preocupe: el comportamiento especificado anteriormente con la propagación de valores de fondo funciona exactamente igual incluso si utiliza fondos de varias capas.
Sin embargo, si necesita admitir navegadores más antiguos, deberá utilizar el método CSS2, que es compatible desde IE7.
Mis comentarios en esta otra respuesta explican, con un violín adjunto , cómo body
en realidad se compensan html
los márgenes predeterminados a pesar de que parece que se están completando, nuevamente debido a este fenómeno aparentemente extraño.
1 Esto puede tener su origen en la configuración del HTML background
y bgcolor
los atributos para body
hacer que el atributo de fondo se aplique a toda la ventana gráfica. Más sobre eso aquí .
Sugiera leer esto:
https://css-tricks.com/just-one-of-those-weird-things-about-css-background-on-body/
Esencialmente, en ausencia de un background
elemento html
, body
background
cubrirá la página. Si hay un background
elemento html
, se body
background
comporta como cualquier otro elemento.