This is an intermediate level tutorial that discusses one method of multi-column page layout. It assumes the reader has a good knowledge and understanding of HTML and CSS.

Introduction

Once upon a time, web developers used the HTML element <table> to layout content columns. This practice is now recognized as cumbersome and not very semantic.

These days, instead of using <table>, we use the <div> element as a container for content. Once you get the hang of it, using <div> becomes very liberating and greatly reduces the amount of markup needed to layout a page.

Basic Page Structure

For this tutorial, we're targeting a layout that has three columns of content with spaces at the top and bottom for a header and footer. The page will be a fixed width and will also be centered in the browser's display area (Figure 1).

Figure 1 - The intended design.

We'll begin with an XHTML page structure in its most simple form. In the <head> of our document, we'll point to an external CSS file.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>My Website</title>
    <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
 
  <body>
  </body>
</html>

Creating the Containers in the Markup

The first <div> we're going to create within the <body> of this page will contain the entire content area. This allows us to position our layout within the display area wherever we want. We'll give this, and all containers, a unique identity using the "id" attribute of the <div> element.

<body>
  <div id="page_container"></div>
</body>

Now, within our "page_container", we'll add containers for the specific content areas that we mentioned before. Again, we'll identify each uniquely.

<body>
  <div id="page_container">
    <div id="header"></div>
    <div id="left_column"></div>
    <div id="center_column"></div>
    <div id="right_column"></div>
    <div id="footer"></div>
  </div>
</body>

At this point, if we were to render this document, we would not be able to see anything. Let's add some dummy content so that we can see what's happening. We'll use a typical scheme for structuring information including titles, sub-titles, paragraphs and a menu.

<body>
<div id="page_container">
    <div id="header">
        <h1>My Web Site</h1>
    </div>
    <div id="left_column">
        <ul>
            <li><a href="#">Menu 1</a></li>
            <li><a href="#">Menu 2</a></li>
            <li><a href="#">Menu 3</a></li>
        </ul>
    </div>
    <div id="center_column">
        <h2>My Document</h2>
        <p>Vivamus elementum ligula gravida neque. Cras adipiscing ligula non turpis. Sed cursus scelerisque libero. Sed at arcu. Vestibulum metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Phasellus id turpis. Sed purus. Integer eget ligula elementum felis aliquet rhoncus. Morbi augue.</p>
    </div>
    <div id="right_column">
        <h3>Sidebar</h3>
        <p>Vivamus non urna eget nisi placerat vehicula. Vivamus semper molestie lacus. Proin a tellus et massa placerat ultricies. Curabitur viverra convallis felis.</p>
    </div>
    <div id="footer">
        <p>Copyright Information</p>
    </div>
</div>
</body>

Our markup is now complete.

Adding Basic Styles

Let's create a basic set of selectors and definitions in our CSS file for the intrinsic HTML elements and for each of the containers. We want to remove the inherent margining and padding from all elements, remove the bullets from the <ul> that we're using for our menu, and allow for some simple background colors in our content areas for visual clarity.

/* Intrinsic HTML Elements */
body{margin:0;padding:0;}
div{margin:0;padding:0;}
h1{margin:0;padding:0;}
h2{margin:0;padding:0;}
h3{margin:0;padding:0;}
p{margin:0;padding:0;}
ul{margin:0;padding:0;}
li{list-style-type:none;}
 
/* Uniquely Identified Containers */
#page_container{}
#header{background:#999;}
#left_column{background:#CCC;}
#center_column{background:#ECECEC;}
#right_column{background:#CCC;}
#footer{background:#999;}

With the HTML and CSS in place, our page should render as shown in Figure 2. Notice that our document makes sense "semantically", similar to a document printed on paper. The web site has a title, there is a menu/table-of-contents for the site, the page we're viewing within the site has a title, and there is a clear heirarchy/structure for ancillary and tertiary information. The structure of this arrangement should always be based on the needs of the site and/or page that's being created.

Figure 2 - Semantic markup with minimal styling. (Firefox 2.0.0.12)

Adding More Styles - Widths, Floats, and Clear

First, let's define a width and position for our layout by adding definitions to our #page_container selector in our CSS file. Again, nesting all the content in this overall container allows us a great deal of flexibility.

#page_container{width:760px;margin:0 auto;}

Now we get into the crux of creating a "float" scheme. For each <div> that we are going to use as a column, we'll add two definitions in our CSS, a width and a float.

Notice that the sum of the widths of these three elements is equal to the width of the #page_container element.

#left_column{width:180px;float:left;background:#CCC;}
#center_column{width:400px;float:left;background:#ECECEC;}
#right_column{width:180px;float:left;background:#CCC;}

When we added these definitions, we altered the postions and widths of the columnar elements in the render flow. To return to the normal render flow within the parent container, we'll need to "clear" the next element from the effects of the "float".

#footer{clear:both;background:#999;}

Our three columns now line up from left to right and the longest column, in this case the right_column, pushes the footer down the page, within the parent container (Figure 3).

Figure 3 - The final render of the float scheme with minimal styling. (Firefox 2.0.0.12)

That's it! That's how it works. This method will work in all current browsers and should render more or less identically.

Conclusion

Now that we've arranged a system of containers, we're free to start inserting data and fleshing out our styles. We might begin this process by adding some negative space around our textual elements. Because we're relying on a style sheet to define our visual presentation, we can easily achieve this effect by simplifying some of our definitions for intrinsic HTML elements while adding a bit of padding.

h1, h2, h3, p{margin:0;padding:10px;}

One of the first things we notice is that the columns are not all equal in length and therefore there are gaps below the shorter ones. In a real world application of this technique, this visual problem can be overcome easily.

Go To Part 2

Please PM me with any suggestions for improving this tutorial.

Thanks!
dM

This page was published on It was last revised on

Contributing Authors

0

12 Comments

  • Votes
  • Oldest
  • Latest
Commented
Updated

OH DM,

FAB, some tutorials for web design.

Right and left column is navigation and a sidebar or two navigations?

Its late now but I am in a 'bored mood' with my other things so tomoz I will be back to see what I can achieve in DW8 along with this tut.

Many thanks DM

add a comment
0
Commented
Updated

OH DM,

FAB, some tutorials for web design.

Right and left column is navigation and a sidebar or two navigations?

Its late now but I am in a 'bored mood' with my other things so tomoz I will be back to see what I can achieve in DW8 along with this tut.

Many thanks DM

You can use padding tag for left or right align
and in HTML you can use div align tag for it

add a comment
0
Commented
Updated

Nice!
At many places, for similar template, I saw they also used left margin for columns. Like

center_column{left-margin:182px;}

right_column{left-margin:585px;}

add a comment
0
Commented
Updated

Nice!
At many places, for similar template, I saw they also used left margin for columns. Like

center_column{left-margin:182px;}

right_column{left-margin:585px;}

Yes, I've seen that as well. However, I've found it unreliable and not in keeping with the intended use of margins.

There are, of course, many ways to skin the proverbial cat. 🙂

add a comment
0
Commented
Updated

I think that is related with bug is some browser.

add a comment
0
Commented
Updated

Hello,
Thanks Thanks Thanks for your great info and i liked your post. The way of your teaching is mind blowing. In this post you describe each and every step which is very useful for everyone.

Thanks once again. 🙂

add a comment
0
Commented
Updated

that's great post about layout, css with HTML

add a comment
0
Commented
Updated

Nice tutorial..
Want to add a point to this.

We may also change the width of the all the container divs and divide them in percentages. That would convert this layout from fixed layout to fluid layout. 🙂

add a comment
0
Commented
Updated

for a begginer like me , its some thing great its helped a lot.. thanks..

add a comment
0
Commented
Updated

Hey, great tutorial very clear and simple, no complex code, 2 thumbs up.

add a comment
0
Commented
Updated

I love this tutorial. I've been trying to figure out how to build the Troop page without using a table and nothing looks right (even when I use tables). I'll be trying this out as soon as I get home from work.

THANK YOU!!!

add a comment
0
KA
0 0
Commented
Updated

This is one technique...I know floats well, but i never managed to get it right...guess needs more experience...things worked well here and it was very simple to follow problem is there this is a fixed layout even the page container has a fixed width...

fine tutorial...now to part two...

add a comment
0