Giving background-color to body applying whole page. Why?
The main reason is because the HTML
takes the background-color
of BODY
since:
The background of the root element becomes the background of the
canvas and covers the entire canvas [...]
So since the default background-color
of HTML
is transparent
it will take the one from BODY
. However applying a color to both the HTML
and BODY
elements you will see that the BODY
background doesn't cover the whole page anymore.
html { background-color: blue;}
body { background-color: red;}
<html>
<body> <div>Hello World!</div></body>
</html>
why does background-color property fills the entire screen even body have 0 height?
body tag is always taking the whole document's body, so if you want to give background with limited height then put one DIV inside the body tag and then give specific height, then it will work fine.
so for the solution, please give background color to HTML div as well.
html {
background-color: #ffffff;
}
Background-Color of BODY tag applied to the whole HTML
This is indeed confusing, but it is specified in the CSS 2.1 specification, clause 14.2 Background: if the computed value of background-color
is transparent
and the computed value of background-image
is none
for the html
element (as things are by default), browsers must instead use the computed value of the background properties for the body
element and must not render a background for body
(i.e. make it transparent). That is, body
background magically turns to html
background if html
lacks a background of its own – and this only affects background properties, not the true height of the body
element.
I haven’t seen any rationale for this odd rule, which prescribes a kind of “reverse inheritance”. But it’s clearly specified in CSS 2.1 and applied by browsers.
As explained in other answers, you can make your content have a background of specific height either by setting a background on html
(so that body
background is really applied to body
only) or by using wrapper element inside body
and setting height on it (since the special rule applies to body
only).
Thanks to Anne van Kesteren who pointed to the CSS spec when I asked about this in the WHATWG mailing list. (I thought I knew CSS 2.1 by heart but really didn’t. ☺)
Why does styling the background of the body element affect the entire screen?
Quote from http://www.w3.org/TR/CSS21/colors.html
The background of the root element becomes the background of the canvas and covers the entire canvas, anchored (for 'background-position') at the same point as it would be if it was painted only for the root element itself. The root element does not paint this background again.
The body
element is the root-element, and thus, as required by the CSS rules it loses its background style and the background style is applied to the containing canvas (the webpage area in the browser), therefor the entire screen is blue. The other properties stay with the element (e.g. the border
).
CSS Background color is not full, it does not cover the whole page properly
Make use of viewheight and viewwidth:
html,
body,
#background {
width: 100vw;
min-height: 100vh;
background-color: #9B59B6;
}
Perhaps make it static (without the min- prefix) and add zero padding/margin to fix a white gap.
Changing the background color and width of the body element
You're actually doing it, except when you don't declare a background color for the html
element, it then takes the background color of the body
element. Hence, you're not seeing the difference.
Simply give the html
element a different background color, and also give body
some height
:
html { background-color: red; /* new */}
body { border: 1px solid black; width: 500px; height: 500px; /* new */ margin: 0 auto; background: black;}
How to change whole page background-color in Angular
You can do this from any of your component. For example:
export class AppComponent implements AfterViewInit {
constructor(private elementRef: ElementRef) {}
ngAfterViewInit() {
this.elementRef.nativeElement.ownerDocument
.body.style.backgroundColor = 'yourColor';
}
}
By using this.elementRef.nativeElement.ownerDocument
, you can access the window.document
object without violating any angular convention. Of course, you can directly access the document
object using window.document
but, I think it would be better to access it through ElementRef
.
background-color not working with body
Two possibilities I can think of are:
1) Your style is being overridden by another style. You could try background-color: gray !important;
and see if that works.
2) Your body doesn't actually have any height (i.e. if there are floated items that haven't been cleared) Inspect it in Chrome or Firefox and make sure the body takes up the full height of the page.
Body's background is overflowing
That is weird. That's not what I would have expected, but this seems to indicate it's a known behavior, that if the background color on <html>
isn't set, but the background color on <body>
is, the <body>
background will flood the whole <html>
area.
To quote the spec:
For documents whose root element is an HTML HTML element or an XHTML
html element [HTML]: 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 HTML BODY or XHTML body child
element. The used values of that BODY element’s background properties
are their initial values, and the propagated values are treated as if
they were specified on the root element.
You can also see an example at that spec link that is similar to yours.
UPDATE:
RE: your other question about <html>
element's propagating to the viewport's background, I think that is also answered in a nearby section of the spec, though it is a little less clear to me:
The background of the root element becomes the canvas background and
its background painting area extends to cover the entire canvas.
Note canvas
in this case refers to the infinite surface the page is rendered on, not the HTML5 canvas. This seems to me to describe the behavior you mentioned in a comment where the background of a <html>
with a small width/height is propagated to the viewport, though why they need the additional section I quoted above, I'm not sure about. There is more info at that link if you are curious. There seems to be some overlap between sections AFAICT.
Related Topics
CSS Drop Down Menu Hover Effect
How to Make a Div Take The Full Width of The Page When It Is Inside Another Div That Have 90% Width
How to Get The Parent Url from an Iframe's Content
How to Link to a <Div> on Another Page
Center <Img/> Inside a <Div> with CSS
HTML 5 Input Type="Number" Element for Floating Point Numbers on Chrome
Telephone Numbers and Screen Readers
How to Allow Text to Wrap Inside a Word If Necessary
Export HTML Content to PDF Using Jasperreports
How to Change Style of Radio and Checkbox Input
How to Forcefully Print Background Image in HTML
Flexbox Width Variation with Content, Should Be Fixed Width
Share Style Across Web Components "Of The Same Type"
Is There a Web Service for Converting HTML to Pdf