$("#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>
I found that if you apply a CSS background to body
, it takes up the whole page (no matter what the actual height or width of body
is).
However, if you apply a CSS background to both html
and body
, the background for body
does not take up the whole page.
Is this discrepancy expected behavior?
How would I go about superimposing two fullscreen backgrounds (say, a background color and a semi-transparent image?)
The most common & simple way to add background image is using the background image attribute inside the <body> tag. The background attribute which we specified in the <body> tag is not supported in HTML5.
The HTML <body> background Attribute is used to specify the background-image for the document. Note: It is not supported by HTML5 Instead of using this attribute we use CSS background property.
Answer. When we have both a background-color and background-image property applied to the same element, whichever property that is physically lower in the CSS file will be applied.
The background color of the table is given by the bgcolor="color" attribute. When applied to the <table> tag, the color fills the background. Cell background colors are set by applying the bgcolor attribute to a <tr> tag (to color the row) or to a <td> tag (to color the cell).
This is correct behavior.1In standards mode, body
, as well as html
, doesn't immediately take up the entire height of the viewport, even though it appears so when you only apply a background to the latter. In fact, the html
element will take on the background of body
if you don't give it its own background, and html
will pass this on to the canvas:
The background of the root element becomes the background of the canvas and its background painting area extends to cover the entire canvas, although any images are sized and positioned relative to the root element as if they were painted for that element alone. (In other words, the background positioning area is determined as for the root element.) If the root's ‘background-color’ value is ‘transparent’, the canvas's background color is UA dependent. The root element does not paint this background again, i.e., the used value of its background is transparent.
For documents whose root element is an HTML
HTML
element or an XHTMLhtml
element: if the computed value of ‘background-image’ on the root element is ‘none’ and its ‘background-color’ is ‘transparent’, user agents must instead propagate the computed values of the background properties from that element's first HTMLBODY
or XHTMLbody
child element. The used values of thatBODY
element's background properties are their initial values, and the propagated values are treated as if they were specified on the root element. It is recommended that authors of HTML documents specify the canvas background for theBODY
element rather than theHTML
element.
That said, however, you can superimpose any background image over a background color on a single element (either html
or body
), without having to rely on two elements — simply use background-color
and background-image
or combine them in the background
shorthand property:
body { background: #ddd url(background.png) center top no-repeat; }
If you wish to combine two background images, you need to rely on multiple backgrounds. There are chiefly two days to do this:
In CSS2, this is where styling both elements comes in handy: simply set a background image to html
and another image to body
which you wish to superimpose over the first. To ensure the background image on body
displays at full viewport height, you need to apply height
and min-height
respectively as well:
html { height: 100%; background: #ddd url(background1.png) repeat; } body { min-height: 100%; background: transparent url(background2.png) center top no-repeat; }
Incidentally, the reason why you have to specify height
and min-height
to html
and body
respectively is because neither element has any intrinsic height. Both are height: auto
by default. It is the viewport that has 100% height, so height: 100%
is taken from the viewport, then applied to body
as a minimum to allow for scrolling of content.
In CSS3, the syntax has been extended so you can declare multiple background values in a single property, eliminating the need to apply backgrounds to multiple elements (or adjust height
/min-height
):
body { background: url(background2.png) center top no-repeat, #ddd url(background1.png) repeat; }
The only caveat is that in a single multi-layered background, only the bottommost layer may have a background color. You can see in this example that the transparent
value is missing from the upper layer.
And don't worry — the behavior specified above with propagating background values works exactly the same even if you use multi-layered backgrounds.
If you need to support older browsers, though, you'll need to go with the CSS2 method, which is supported all the way back to IE7.
My comments under this other answer explain, with an accompanying fiddle, how body
is actually offset from html
by default margins even though it looks like it's being padded out instead, again owing to this seemingly strange phenomenon.
1This may have its roots in setting the HTML background
and bgcolor
attributes of body
causing the background attribute to apply to the entire viewport. More on that here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With