full-screen div is shifted down when contains h1 element only - html

I have trouble to create a page with full screen div with h1 element.
Following page is rendered correctly by IE and Chrome as expected: Contains Red full-screen div, no scroll-bars:
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>title</title>
<style>
html {
background-color: purple;
}
body {
background-color: blue;
height: 100%;
margin: 0;
}
#main {
background-color: red;
min-height: 100%;
}
</style>
</head>
<body>
<div id="main">
<h1>
some text
</h1>
</div>
</body>
</html>
But, for the Firefox (27.0.1) I found:
show purple line at the top of the page
and vertical scroll-bar
if I add some text directly to #main div before h1 element, then page renders as expected.
What I should do to render it correctly in FireFox with text in h1 only ?

Following page is rendered correctly by IE and Chrome as expected: Contains Red full-screen div
If that’s what you get, then that can only be in Quirks Mode, I suppose – because you forgot to set height:100% for html as well, and without that the percentage height for body is not supposed to work that way.
And with a correct Doctype set (and height for html), you get the same result in all standards conform browser – the one you think is wrong: http://jsfiddle.net/q6g8Q/1/
It’s actually correct though, because of adjoining margins – the default margin-top from the browser stylesheet for the h1 adjoins the margin-top of the div – and therefor it gets pushed down accordingly.
So set the margin-top of the h1 to zero, and the “problem” is gone – http://jsfiddle.net/q6g8Q/2/

You have to reset the css of your browser. Just add this to the top of your css :
* {
margin: 0;
padding: 0;
}
// #main h1 { margin:0; } // this snippet will be enough for your case, but with the other you remove every margin and padding made by the browser.
demo JsFiddle
If you want more info about this tricks, read this article by Chris Coyier.
If you want a full css reset, you should consider the Reset Reloaded.

change the line-height or margin padding. That should do the trick. play around with some big numbers ;)

Related

Two same sized elements displaying different width

I'm laying out a website design and I have run into an error...
The html element is assigned a fixed width of 800px, the body element ID 'page' will not take up 100% width no matter what I try?
Heres the code...
<html>
<body id="page" >
/ content /
</body>
</html>
html {
width: 800px;
margin:0;
padding:0;
}
#page {
}
I have tried setting the #page to 'width:800px', 'width:100%', 'margin:0', 'margin:0 auto', etc. but no matter what there is always a 1px gap on the right side of #page. I've even tried setting 'width:801px' which didn't work, as well as setting the relative position left 1px in case it was overflowing left for some reason, but it's not...
Am I missing something stupid, is the program I am using buggy, or is it something else? Where I am from, 800px is the same as 800px so what's going on?
Thanks guys....
EDIT:
So, going back through previous projects I discovered what works for me. Whether it be the program I am using(free), or just something I'm missing this is what works for me and so resolves my issue.
<html>
<body>
/ content /
</body>
</html>
html {
width: 800px;
}
body {
margin: 0;
}
There's probably some extra css sneaking in somewhere. Check for any border property on your #page element.
Run this snippet, and there shouldn't be a single pixel gap.
html {
width: 800px;
background: lightgrey;
}
#page {
margin: 0;
border: none;
background: yellow;
}
<html>
<body id="page">
/ content /
</body>
</html>
it appears you are running into an inconsistency problem in the way browsers inject scrollbars into the page, see here:
Styling the `<html>` element in CSS?
I would start by using a css reset like normalize.css to get cross-browser consistency in behaviour then use your custom styles from there. Personally I never style the html element and work from the body down. Working like that I dont encounter these kinds of problems becuase they are dealt with by normalize.css.

Div background color cuts off at viewport with doctype

I have an HTML document with a div, meant to be colored in the background under some text or an image (I have both happening on different websites right now). A minimal case:
<!doctype html>
<html lang="en">
<head>
<title>Test</title>
<meta charset="utf-8">
</head>
<body>
<header>
<div style="min-width: 400; background-color: black">
<div style="font-size: x-large; color: red">
A_Fairly_Long_Word_Or_Image
</div>
</div>
</header>
</body>
</html>
The problem I find is this: If the browser window (tested in both Firefox 47 and IE 11) is made very narrow, and then we scroll to the right, the div background color does not fill all the way to the end of the text or image (whether the min-width specifier is there or not). As shown below:
On the other hand, if the DOCTYPE specifier is removed, then it actually does work as expected:
<html lang="en">
<head>
<title>Test</title>
<meta charset="utf-8">
</head>
<body>
<header>
<div style="min-width: 400; background-color: black">
<div style="font-size: x-large; color: red">
A_Fairly_Long_Word_Or_Image
</div>
</div>
</header>
</body>
</html>
The code on top does pass an online validator when I test it. How can this be fixed (and explained)?
The reason why the background doesn't go all the way to the right is:
By default a block element like <div> occupies the entire width of the parent, given there is no blank space in the text sample - A_Fairly_Long_Word_Or_Image, which means it renders as a single word, and won't wrap, so the the text overflows in a smaller viewport, but not for the background that sets on the div.
However, under quirks mode (without a doctype), it behaves differently, according to this article:
Overflow is treated by expanding a box. When the content of an element does not fit into the dimensions specified for it (explicitly or implicitly), then overflow: visible (the default) means that the content overflows while the box dimensions are as specified. In Quirks Mode, the dimensions change; this can easily been seen e.g. if the box has a back­ground color or a border.
How to fix that within standard mode?
Please use the standard HTML5 <!doctype html> it is highly recommended. You can set the container div to display: inline-block; + min-width: 100%;, As the size of an inline block depends on the content inside, and the min width will make it to expand even if the viewport is larger, check out the jsFiddle, resize the output frame and see.
.container {
background-color: black;
font-size: x-large;
color: red;
display: inline-block;
min-width: 100%;
}
<div class="container">A_Fairly_Long_Word_Or_Image</div>
Well, if you do want the text to wrap, simply apply word-break: break-all; - jsFiddle.
.container {
background-color: black;
font-size: x-large;
color: red;
word-break: break-all;
}
On first glance, your min-width declaration is missing the unit type for the value.
400 what? Pixels, percent, ems, viewport widths?
On testing, if you simply adjust it to min-width: 400px, the background issue is resolved.
With regard to the document type declaration (doctype), when you remove it, the browser switches to quirks mode. This enables the browser to parse very old web pages – pages authored before the advent of web standards.
Rendering modern web pages in quirks mode, however, can be unpredictable and unreliable. Although you may get the layout you want now, it's not stable. You should never publish web pages without the proper doctype.
For a more comprehensive explanation see: Why does my div height 100% work only when DOCTYPE is removed?

Separation of head and body

I'm having some trouble with an area of space between the top of the browser window and my 'head' element, and the 'head' element and my 'body'.
Thus far, adding the following class has not resulted in any improvement:
.header{ <=== I have also attempted .head with no effect
position: absolute;
top: o;
}
I have also experimented with padding and margins, but simply cannot get the head content to "kiss" both the top of the screen and body content.
You can see a rundown of my HTML and CSS here: https://jsfiddle.net/2w3vzstf/
How do I overcome this?
body {
margin: 0;
}
The lower spacing you dont like is the #menu having a margin-top of 10px
Should sort out the spacing above the page.
Try, commenting out the top margin in the menu CSS definition.
#menu {
/* margin-top: 10px; */
Is this what you wanted?
JsFiddle
Your fiddle shows some markup problems.
<head> is not the place for any page content, even the "header". That should all go in the <body> tag.
I have modified your fiddle to show how the css can be modified to get the effect you want:
https://jsfiddle.net/1kn4tnjz/
Basically you set
margin: 0;
for the <body> and <div id="menu"> elements

Why does IE display a vertical scrollbar with this 100% height content?

I have a Silverlight video player that I want to display in a "100% browser width/height" mode (i.e. not fullscreen, but filling up the entire browser display area).
Regular player: http://play.nimbushd.com/lfu53b5
Fullscreen version: http://play.nimbushd.com/lfu53b5/fullscreen
I have tried nearly every node in the DOM and set width/height to 100%, with margin: 0px, padding: 0px. Seems to work great in Firefox. Why, then, does IE display a vertical scrollbar with a little whitespace at the bottom?
Edit: Since this issue is fixed, the short explanation: A 100% height/width Silverlight control within an ASP.NET <form> tag spills over just a bit in IE because of the form tag.
This behavior is caused by inline elements within the <form> - inline elements always render a line-height worth of pixels. Any of the following CSS rules will fix it:
form { font-size: 0; }
or
form * { display: block; }
Alternatively, you could try to get rid of all inline descendants of <form> (this includes text nodes) - but I'm not sure it would actually work (not tested). Plus it would render your markup hard to maintain (you'd need to strip all newlines and such... could be done during deployment, but I think this is taking it too far).
You need this this styling in you html:
<style type="text/css">
html, body {
height: 100%;
overflow: hidden;
}
body {margin: 0px}
</style>
Note that this applies a style to both html and body to enforce the height of html element to the viewport height and therefore also the body.

Footer background should extend to bottom of browser

I have a problem with fixing the footer to the bottom of the browser .. The problem is when resolution changes or windows resizes the footer content overlaps the content of the website, here is the current css for footer div
div.footer {
position:absolute;
bottom:0px;
}
Does anybody knows how can I fix this? Thank you
UPDATE:
This is what I need exactly but for some reason it doesn't work for my web page, it does work when I cut paste code to the blank page, but since my page is full with content and everything, what are the important elements to include? Hereis the url.
The above trick works only if my website has filled content if I have some lets say few lines the above trick doesn't work.
UPDATE II
My website has dynamic content so I think can't use this sort of CSS Sticky footers because sometimes the website will just have few lines sometimes be packed with content. Thats why the footer is not sticking to the bottom of the webpage.. its not problem to stick the footer if there is plenty content on the website the problem is without.
What you have here is a common problem for which there is no common answer, but what I would try if I were you since all these above suggestions apparently aren't working, I'd try to set my page container background to any color let say white (#FFFFFF) and I'd set background color of body to any other then white let say grey (#CCCCCC). And finaly set footer position to relative and of course it must be placed after everything if you want it alway to be at the bottom. This way you'll get what you need 100 % sure if you follow step by step instructions.
Checkout CSS Sticky Footer for an excellent cross-browser compatible method.
What that site essentially does is make the footer stick BENEATH the browser edge, and gives it a negative margin that has the same value as the footer's height. This way, the footer is sure to stick to the bottom.
You can add a push div to the last element before the footer in order to always assure that the footer doesn't overlap the content.
Given this example:
<html>
<body>
<div class="header" />
<div class="content" />
<div class="footer_push" />
<div class="footer" />
</body>
</html>
If <div class="footer" /> is always 75px high, use the following CSS:
html, body { height: 100%; } /* Take all available vertical space */
/* Push the bottom of the page 75px.
This will not make scrollbars appear
if the content fits already. */
.footer_push { height: 75px; }
/* Position the footer */
.footer { position: absolute; bottom: 0; height: 75px; }
Basically you need to give the footer a fixed height and to push the footer with another div of the same height to the bottom. There's however more browser specific stuff which you need to take into account:
The html and body must besides having a height of 100% no (default) margin to avoid the footer being pushed further to below that amount of margin.
The p and div elements throughout the page must have no margin-top to avoid the footer being pushed further to below that amount of top-margins in under each Firefox.
The "container" div must use min-height of 100% instead of height to avoid the footer to overlap the remaining of the content. IE6 which doesn't know min-height just works fine with height, so you'll need to add a * html hack for this.
All with all, here's an SSCCE, just copy'n'paste'n'run it:
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
<title>SO question 1900813</title>
<style>
html, body {
margin: 0;
height: 100%;
}
p, div {
margin-top: 0; /* Fix margin collapsing behaviour in FF. Use padding-top if necessary. */
}
#container {
position: relative;
min-height: 100%;
}
* html #container {
height: 100%; /* This is actually "min-height" for IE6 and older. */
}
#pushfooter {
height: 50px; /* Must be the same as footer height. */
}
#footer {
position: absolute;
bottom: 0;
height: 50px;
}
</style>
</head>
<body>
<div id="container">
<p>Some content</p>
<div id="pushfooter"></div>
<div id="footer">Footer</div>
</div>
</body>
</html>
Edit: after more testing I realized that this indeed does not work in IE8 (I still consider it as a beta so I didn't really use/test it, sorry about that), unless you let it render in IE7 compatibility modus (insert sad smilie here) by adding the following meta tag to the <head> (which I already added to the SSCCE here above):
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
or to let it render in quirks mode by using a "wrong" doctype (either remove the <!doctype> or pick one of the doctypes associated with painfully red Q boxes in IE here). But I wouldn't do that, that has more negative side-effects as well.
And, surprisingly, the http://www.cssstickyfooter.com site as someone else here mentioned here which used an entirely different approach also did not work in IE8 here (try to resize browser window in y-axis, the footer won't move along it as opposed to other browsers, including IE6/7). That browser keeps astonishing me. Really.
Try setting the footers Position to relative and playing around with a negative top margin to get it how you want it.
What you're looking for is a Sticky Footer, you can find a lot of resources like this one: http://ryanfait.com/resources/footer-stick-to-bottom-of-page/
try this:
#wpr{
display: table;
height: 100%;
width: 100%;
}
.dsp-tr{
display: table-row;
}
.dsp-tc{
display: table-cell;
}
#ftr-cnr{
text-align: center;
vertical-align: middle;
}
#ftr{
background-color: red;
padding: 10px 0px;
font-size: 24px;
}
<div id="wpr">
<div class="dsp-tr">
<div class="dsp-tc">
body
</div>
</div>
<div class="dsp-tr">
<div class="dsp-tc" id="ftr-cnr">
<div id="ftr">
footer
</div>
</div>
</div>
</div>
display: table does not make it a table, a <div> is still a <div>, it just tells the browser to display it as table.
i tested it in chrome and firefox
let me know if it works for you.
We had this problem a few times. We could not find any cross browser CSS only solution. We finally resorted to JQuery. We wrote our own (i can't publish) but this one http://www.hardcode.nl/archives_139/article_244-jquery-sticky-footer.htm looks promising:
$(function(){
positionFooter();
function positionFooter(){
if($(document.body).height() < $(window).height()){
$("#pageFooterOuter").css({position: "absolute",top:($(window).scrollTop()+$(window).height()-$("#pageFooterOuter").height())+"px"})
}
}
$(window)
.scroll(positionFooter)
.resize(positionFooter)
});
Do you have a DOCTYPE declaration in the top of your HTML?
If so, there is a good chance I have a solution for you.
I was trying to do a height:100% table or div (assuming this is a basic cornerstone to the expanding footer feature)
No matter what I did, the 100% height didn't work! the elements just didn't stretch...
I narrowed it down to a very basic HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test1</title>
</head>
<body>
<div style="border: 2px solid red; height: 100%">Hello
World</div>
</body>
</html>
but the DIV didn't stretch all the way down (the 100% was ignored). This was true also for tables with plain height="100%" attribute.
As a desperate last result guess, I removed the DOCTYPE row, resulting in this code
<html>
<head>
<title>Test1</title>
</head>
<body>
<div style="border: 2px solid red; height: 100%">Hello
World</div>
</body>
</html>
And it worked!
I'm sure there is a good explanation, but I really didn't care since it solved the problem
Update
See related question (asked by me)
Depends on what you want to do. I you want it to be always visible on the bottom of your screen, you should use
div.footer{
position: fixed;
bottom: 0;
}
Be sure to get some padding on the bottom of your body (or container, so that people can actually scroll to the bottom of the text). The main problem here is that when resizing everything it will overlap.
If you just want to have a footer that has a background-image / colour that stretches all the way till the end (for pages that are not fullpage height) you could try to use a faux column principle or even try to give your body the background colour of your footer and fix the header / content background.
Today I stumbled across this page:
http://www.xs4all.nl/~peterned/examples/csslayout1.html
Could be helpfull
I came up with a fairly simple solution that doesn't use any CSS height hacks or any of that.
You just set your <body> with the background you want the footer to have, and then put everything besides the footer in a <div> with the properties you would normally give to the body tag.
This gets the footer to "extend" its color to the bottom of the page when there is short dynamic content without expanding it needlessly when there is a lot of dynamic content. The "virtual body" div can still have a gradient followed by a solid color, and the footer's background is hiding in the body tag, only showing up on short pages. (Works great if you need a solid color to continue after your footer gradient ends, or if you just need the background to match the footer color)
CSS
body {background-color: #000; }
#primary_container { background: #FFF url('/images/bgvert.png'); background-repeat: repeat-x; }
#footer { background: #000; }
HTML
<body>
<div id="primary_container">
<!-- most content, can be short or long -->
</div>
<div id="footer">
<!-- if primary content + footer is less than browser height, body background color
displays below this. If it is more, you get normal scroll behavior to the end
of footer and body background color is never seen -->
</div>
</body>