Why I like absolute positioning
Introduction
I wrote an article some time ago, on how to get absolute positioning to work with IE6. However, a large part of that article ended up being an explanation as to why anyone might want to use absolute positioning. So, I've decided to split the original article in two. This part deals with what absolute positioning is and why you might want to use it.
If after you have read this, you think you might still want to use absolute positioning, and even worse, you insist on getting it to work on IE6, then you might like to read the other half of the article - fudging absolute positioning in IE6.
So what is absolute positioning?
You can position the content of your web page in a number of different ways.
Strictly speaking, this isn't anything to do with HTML it's part of the CSS2
specification. CSS2 includes a position style and this may have
one of 4 values (or inherit):
position: static | relative | absolute | fixed | inherit;
position:static is the default option and is the one most often used. It
was also the only way pages could be styled under CSS1. Blocks of text (or other
pieces of content) are set out in rows one below another.
The text uses up the full width of whatever space is available. The block of text grows downwards so as to be big enough to hold all the text. This is not dissimilar to the way type was 'set' by print workers, in the days before computers. This is referred to in the W3C recommendations as the 'normal flow'.
It is possible to take some items out of this 'normal flow' using the
float:left or float:right options. However, this only
allows for a limited range of effects.
position:relative position takes the block out of the 'normal flow'.
Although space is still kept in the main body of the document - that it would have
occupied. It appears 'on top' of the main text and offset by specified
amounts from the position it would have occupied. The location of the element in the HTML
acts as an anchor point and the block is displayed relative to this point.
This mode can be used, to create simple popups. It can also be used, to get a block of text to overlay another.
In position:absolute mode, the box is again taken out of
the 'normal flow'. It gets positioned 'on-top' of the
normal flow and is anchored to it's absolute parent. The absolute parent is the
block above it that is also absolutely positioned (other blocks are ignored). If
there is no absolute position parent, then it gets anchored to the containing
window. You can position the block relative to the edges of it's parent using
the left,top,right,bottom
styles.
position: fixed is similar to absolute. However,
a fixed box is fixed to the browser window and not to a containing
block. If a page is short enough, to not have scrollbars then fixed
and absolute would look the same.
Example 1
shows a page containing both static and absolute
positioned text. To understand what is happening resize the browser window.
Grab a corner of the browser window and drag it around. Note, how some boxes
stay fixed in size, others grow/shrink as you resize.
Of course, if you are using IE6 this won't work properly, try
a different browser, or have a look at Example 2.
These examples don't look very pretty. In a real world web project, you
probably wouldn't want to combine static and
absolute in this way.
Carpets or wooden flooring?
If all that seems rather confusing try my flooring analogy!
static mode is similar to the way you might lay wooden
floorboards. You start in the top-left corner of the room. You lay one plank,
then you lay the next, extending over to the right. If a plank is longer than
the available space, you cut it to fit. The offcut can be used to start the
next row. (Things gets slightly more complicated if the planks are of different
thicknesses.)
absolute mode is different. absolute mode is like
putting down carpets. You can have a block with specified width and height
(like a rug). You can then position it relative to left, right, top or bottom
edges of the window/room. You can position additional 'rugs' beside,
separate from or overlapping the first one.
As well as fixed size rugs, you can also put down 'made-to-measure' or 'cut-to-size' carpet. The carpet then covers the entire area, up to, whatever, margins you specify around the edges.
What's so great about that?
Well I like it! However not that many web-sites use it, so perhaps I'm just odd. Or perhaps it's because I am a software developer rather than a web designer. Anyone who has used any of the graphical programming tools like Visual Studio or Borland's Delphi, has had this kind of control over their program's layout for well over a decade. Compared to that, the web seems rather limited.
For simple static web pages the advantages of absolute mode
are probably fairly small. In fact, one could argue that it breaks the web page
metaphor and so should be avoided unless it adds something useful to the way
the user experiences the site.
On the other hand, people wanted this sort of facility very early on. Which is
why frames were invented. position:absolute allows you to do everything
that could be done in frames - but without any of the down-side. In these days of
Web 2.0 and Ajax, where web sites are becoming more like software
applications, position:absolute is going to be much more useful.
So why isn't everyone using it?
Short Answer :- Microsoft.
OK slightly longer answer. This technique only works in browsers that
fully support position:absolute. And that doesn't include IE6. IE6
half supports absolute positioning. You can set the top-left corner and the
width and the height but, you can't reliably set the bottom-right corner.
Hence the short answer. However, with IE7, Microsft have provided full
support for both absolute and fixed modes. The problem
is what to do about the trailing edge of IE6 users.
Another issue, is access from mobile devices. position:absolute might
not be supported. Even if it is, the small screen of a mobile device might suggest
a different solution. Fortunately, because this is a CSS technique, it may be
possible to cater for mobile devices by simply switching the style-sheet.
More CSS
If you start to use absolute positioning then you will
probably want to make extensive use of some other CSS styles.
top, left, width and
height will be familiar.
position: absolute; left: 12px; top: 12px; width: 250px; height: 250px;
Now you can also position a block from the bottom or from
the right. Typically you will set top
and bottom and leave height unset.
Alternatively, set height and then set only one of top
and bottom.
div#top {
// top area entire screen except for fixed bottom area - with 12px border
position: absolute;
overflow: auto;
left: 12px;
right: 12px;
top: 12px;
bottom: 212px;
}
div#bottom {
// bottom area fixed;
position: absolute;
overflow: hidden;
left: 0px;
right: 0px;
bottom: 0px;
height: 200px;
background-color: #CCC;
}
Similarly for left, right and width.
You only need to set two out of three.
overflow: visible | hidden | scroll | auto;
overflow determines what happens if the content requires
more space than it's defined size. This matters once you start fixing
the sizes of blocks. Content that renders outside of the block
can be visible or it can be hidden. Alternatively,
scrollbars can be shown permanently using scroll or only when
required with auto.
Other styles than now come into play are clip and z-index
Combining static and absolute modes
The examples given earlier looked pretty awful. They simply combined
static and absolute modes without any real thought.
Real web pages will probably need to combine both modes but rather more
carefully.
Most people will probably want to use absolute positioning in
one of two ways. First option is to have a page that is predominantly
static with just one or two blocks positioned differently. The
second option would be to create an overall page structure using
absolute positioned blocks. These blocks would then contain
the main content of the page using static positioning.
The first way might be used to have certain blocks moved from their
position in the article to become sidebars; or using some Javascript to become
popups. absolute mode is only one possible way of doing this. For
some uses, fixed or relative might work better.
You can also use more traditional techniques, using float
and clear to move blocks to either left or right.
Example 3
uses absolute position to move two paragraphs from the main text
and into the margin at the right.
The second approach might typically be used where your web page was more like an application than a simple text document. The top-level blocks in the document would divide the browser window up into sections. You could then place content or controls on these blocks. In the past, this would be done using frames (deprecated) or forcing tables to work.
Example 4 illustrates this by dividing the page up into toolbars at top and bottom, an area for a treeview to the left and a scrollable content area filling the main part of the window. This example puts borders round each block to make it look a bit like a windows application. But this isn't compulsory. You could use any formatting supported by CSS for these blocks.
Summary
Absolute positioning probably isn't a good idea for everyone. People
have become used to the way web pages tend to work, i.e. position:static.
On a simple static web-site, it might be better t ostick with what people have
grown used to
However, for any situation, where in the past, designers might have
considered frames, or for a situation where a web-site is working in a similar way to
a desktop application, position:absolute just might be a better option.