It seems to be the general opinion that tables should not be used for layout in HTML.


I have never (or rarely to be honest) seen good arguments for this. The usual answers are:

  • It's good to separate content from layout
    But this is a fallacious argument; Cliche Thinking. I guess it's true that using the table element for layout has little to do with tabular data. So what? Does my boss care? Do my users care?

    Perhaps me or my fellow developers who have to maintain a web page care... Is a table less maintainable? I think using a table is easier than using divs and CSS.

    By the way... why is using a div or a span good separation of content from layout and a table not? Getting a good layout with only divs often requires a lot of nested divs.

  • Readability of the code
    I think it's the other way around. Most people understand HTML, few understand CSS.

  • It's better for SEO not to use tables
    Why? Can anybody show some evidence that it is? Or a statement from Google that tables are discouraged from an SEO perspective?

  • Tables are slower.
    An extra tbody element has to be inserted. This is peanuts for modern web browsers. Show me some benchmarks where the use of a table significantly slows down a page.

  • A layout overhaul is easier without tables, see css Zen Garden.
    Most web sites that need an upgrade need new content (HTML) as well. Scenarios where a new version of a web site only needs a new CSS file are not very likely. Zen Garden is a nice web site, but a bit theoretical. Not to mention its misuse of CSS.

I am really interested in good arguments to use divs + CSS instead of tables.

+1  A: 

Tables are good for HTML that you're throwing together for something simple or temporary. If you're building a large-scale website, you should go with divs and CSS, since it will be easier to maintain over time as your website changes.

Adam Rosenfield
+11  A: 

According to 508 compliance (for screen readers for visually impared), tables should only be used to hold data and not for layout as it causes the screen readers to freak out. Or so I've been told.

If you assign names to each of the divs, you can skin them all together using CSS as well. They're just a bit more of a pain to get to sit the way you need them to.

+32  A: 

This isn't the definitive argument, by any means, but with CSS you can take the same markup and change the layout depending on medium, which is a nice advantage. For a print page you can quietly suppress navigation without having to create a printer-friendly page, for example.

Good point, though you can use css to hide cells in a table based layout, to supress navigation in a printable version for instance, a CSS layout gives you much more flexibility behind merely hiding data.
Cory House
+9  A: 

I guess it's true that using the table element for layout has little to do with tabular data. So what? Does my boss care? Do my users care?

Google and other automated systems do care, and they're just as important in many situations. Semantic code is easier for a non-intelligent system to parse and process.

Yeah, for example for blogs the engine separate the comments from the blog post. Imagine the layout was styled with tables..
Omar Abid
+44  A: 

See this duplicate question.

One item you're forgetting there is accessibility. Table-based layouts don't translate as well if you need to use a screen reader, for example. And if you do work for the government, supporting accessible browsers like screen readers may be required.

I also think you underestimate the impact of some of the things you mentioned in the question. For example, if you are both the designer and the programmer, you may not have a full appreciation of how well it separates presentation from content. But once you get into a shop where they are two distinct roles the advantages start to become clearer.

If you know what you're doing and have good tools, CSS really does have significant advantages over tables for layout. And while each item by itself may not justify abandoning tables, taken together it's generally worth it.

Joel Coehoorn
Yes... indeed. I see that's duplicate. I missed it. Any action required besides promising I will be more careful next time :-) ?
Don't worry. This will be more and more common as the number of questions goes up. I didn't even downvote. We just want to be sure that as much as possible they eventually all point to a common source.
Joel Coehoorn
I really like this answer. Using semantically meaningful tags isn't just a matter of tradition, it allows those obscure non-browsers (screen readers, screen scrapers, various parsers) to correctly categorize the various objects on your page.
Phantom Watson
I was hoping someone would mention this. Accessibility should be a top priority!
+1  A: 

I think tables are great and very useful. I tried to investigate this same issue a while ago and even went to talk to our lead UI guy at work. All I found was that it seems to be a style preference for people.

+7  A: 

Having had to work with a website that involved 6 layers of nested tables generated by some application, and having had it generate invalid HTML, it was in fact a 3 hour job to rectify it breaking for a minor change.

This is of course the edge case, but table based design is unmaintainable. If you use css, you separate the style out so when fixing the HTML you have less to worry about breaking.

Also, try this with JavaScript. Move a single table cell from one place to another place in another table. Rather complicated to perform where div/span would just work copy-paste-wise.

"Does my boss care"

If I were your boss. You would care. ;) If you value your life.

Kent Fredric
+10  A: 

I'd like to add that div-based layouts are easer to mantain, evolve, and refactor. Just some changes in the CSS to reorder elements and it is done. From my experience, redesign a layout that uses tables is a nightmare (more if there are nested tables).

Your code also has a meaning from a semantic point of view.

My dream is having a graphic designer which takes the objects/data I provide and put them in a page without I having to care about CSS, DIV, TABLE... :)
Manrico Corazzi
I second that Manrico - a visual designer that would allow you to construct a layout and define fixed and percentage dimensions and then generate minimal HTML and CSS would be exceedingly useful!
Richard Ev
The problem I have with the semantic web concept is that in HTML 4 the vocabulary is very limited and designed for primarily technical documents. Many sites with commercial/marketing goals may have elements which do not fit neatly into this vocabulary. HTML 5 fixes some of this with tags like nav, header, footer but for now we are stuck using tags like span which actually say very little about how the content should be interpreted.
+1  A: 

The seperation between content and layout makes it also easier to generate printer-friendly layouts or just different skins (styles) for your site, without having to create different html-files. Some browser (like Firefox) even support selecting a stylesheet from the view-menu.

An I do think it's easier to maintain a tableless layout. You don't have to worry about rowspans, colspans, etc. You just create some container-divs and place the content where you need to. And that said I think it also more readable (<div id="sidebar"> vs <tr><td>...</td><td>...<td>sidebar</td></tr>).

It's just a little 'trick' you have to learn (and once you mastered the trick, I think it's easier and makes more sense)

Grad van Horck
+5  A: 

Also, don't forget, tables don't quite render well on mobile browsers. Sure, the iPhone has a kick-ass browser but everyone doesn't have an iPhone. Table rendering can be peanuts for modern browsers, but it's a bunch of watermelons for mobile browsers.

I have personally found that many people use too many <div> tags, but in moderation, it can be extremely clean and easy to read. You mention that folks have a harder time reading CSS than tables; in terms of 'code' that maybe true; but in terms of reading content (view > source) it is a heck of a lot easier to understand the structure with stylesheets than with tables.

Good point you have there; but IMHO the UI for mobile devices should be completely different taking into account the input limitations.
Manrico Corazzi
True; which is why I've started using a different approach at times. In the MVC model, have my view pop-out just XML raw data i.e. content. Then begin with another MVC model where the xml raw data = model; view = html/css; controller = xsl. The XSL stylesheet purges unnecessary data for mobile.

To respond to the "tables are slower" argument - you're thinking rendering time, which is the wrong metric. Very often, developers will write out a huge table to do the entire layout for a page - which adds significantly to the size of the page to be downloaded. Like it or not, there's still a ton of dialup users out there.

See also: overusing ViewState

Greg Hurlman
+4  A: 

Looks like you are just used to tables and that's it. Putting layout in a table limits you for just that layout. With CSS you can move bits around, take a look at And no, layout does not usally require a lot of nested divs.

With no tables for layout and proper semantics HTML is much cleaner, hence easier to read. Why should someone who cannot understand CSS try to read it? And if someone considers himself to be webdeveloper then the good grasp of CSS is a must.

SEO benefits come from the ability to have most important content higher up the page and having better content-to-markup ratio.

+63  A: 

Obvious answer: See CSS Zen Garden. If you tell me that you can easily do the same with a table-based layout (remember - the HTML isn't changing) then by all means use tables for layout.

Two other important things are accessibility and SEO.

Both care about in what order information is presented. You cannot easily present your navigation at the top of the page if your table-based layout puts it in the 3rd cell of the 2nd row of the 2nd nested table on the page.

So your answers are maintainability, accessibility and SEO.

Don't be lazy. Do things the right and proper way even if they are a bit harder to learn.

An often used trick in Zen Garden is replacing text by images, and define that in the CSS, thus making it invisible from HTML. Very, very wrong.
I'm sorry but that's not right. The text is still in the HTML - that's one of the requirements of a CSSZG design. The HTML has to remain unchanged.
I agree that is bad! :-(
Sorry, there's absolutely no evidence div layouts are better for SEO. Also, Google themselves have stated that HTML validation doesn't matter to them - a slightly different issue but one aimed towards tables because they rarely validate.
+9  A: 

CSS layouts are generally much better for accessibility, provided the content comes in a natural order and makes sense without a stylesheet. And it's not just screen readers that struggle with table-based layouts: they also make it much harder for mobile browsers to render a page properly.

Also, with a div-based layout you can very easily do cool things with a print stylesheet such as excluding headers, footers and navigation from printed pages - I think it would be impossible, or at least much more difficult, to do that with a table-based layout.

If you're doubting that separation of content from layout is easier with divs than with tables, take a look at the div-based HTML at CSS Zen Garden, see how changing the stylesheets can drastically change the layout, and think about whether you could achieve the same variety of layouts if the HTML was table based... If you're doing a table-based layout, you're unlikely to be using CSS to control all the spacing and padding in the cells (if you were, you'd almost certainly find it easier to use floating divs etc. in the first place). Without using CSS to control all that, and because of the fact that tables specify the left-to-right and top-to bottom order of things in the HTML, tables tend to mean that your layout becomes very much fixed in the HTML.

Realistically I think it's very hard to completely change the layout of a div-and-CSS-based design without changing the divs a bit. However, with a div-and-CSS-based layout it's much easier to tweak things like the spacing between various blocks, and their relative sizes.

+23  A: 

t's good to separate content from layout
But this is a fallacious argument; Cliche Thinking

It's a fallacious argument because HTML tables are layout! The content is the data in the table, the presentation is the table itself. This is why separating CSS from HTML can be very difficult at times. You're not separating content from presentation, you're separating presentation from presentation! A pile of nested divs is no different than a table - it's just a different set of tags.

The other problem with separating the HTML from the CSS is that they need intimate knowledge of one another - you really can't separate them fully. The tag layout in the HTML is tightly coupled with the CSS file no matter what you do.

I think tables vs divs comes down to the needs of your application.

In the application we develop at work, we needed a page layout where the pieces would dynamically size themselves to their content. I spent days trying to get this to work cross-browser with CSS and DIVs and it was a complete nightmare. We switched to tables and it all just worked.

However, we have a very closed audience for our product (we sell a piece of hardware with a web interface) and accessibility issues are not a concern for us. I don't know why screen readers can't deal with tables well, but I guess if that's the way it is then developers have to handle it.

17 of 26
screenreaders deals with tables ok.. It's the way that tables don't deal with screenreaders that's the problem. A table-based layout is prone to present the information in an inaccessible manner. Think about how a right-side navigation would look like. It would be pretty far down the page.
Ok, that makes sense then - thanks!
17 of 26
Separation of content from presentation only occurs when the markup is semantic. Most people don't know how to write really semantic mark up, and they also can't present that markup properly with css. That is a failure of the dev, not the technology. I can do it, it's not that hard.
Pete Michaud
Just because <table> or <div> have a *default* presentation in most screen agents, doesn't equate them to being presentation elements instead of semantic elements.
Mark Brackett
I'm not talking about HTML specifically, I'm talking about conceptually in basic UI design. A table dictates how things are laid out on the screen, i.e. how they are presented to the user. That is presentation.
17 of 26
@erlando: true, but then most designs using divs would float columns left and therefore have the navigation later in the HTML. I've yet to see a design where the navigation is the *very first thing* in the HTML.
"I spent days trying to get this to work" - if something I'm trying to figure out ever takes more than a couple of hours, I put it to the StackOverflow community. Not knowing how to do something correctly is no excuse for not doing it correctly. Especially when we have all the answers at our fingertips.
+8  A: 

No arguments in DIVs favour from me.

I'd say : If the shoe fits, wear it.

It's worth noting that it's difficult if not impossible to find a good DIV+CSS method of rendering contents in two or three columns, that is consistent on all browsers, and still looks just the way I intended.

This tips the balance a bit towards tables in most of my layouts, and altough I feel guilty of using them (dunny why, people just say it's bad so I try to listen to them), in the end , the pragmatic view is it's just easier and faster for me to use TABLEs. I'm not being payed by the hour, so tables are cheaper for me.

if you want to create a two or three column website with divs+css that works in all browsers, you should by all means do not start from scratch. There are many barebone templates available from the web which you can use as a base. Those are usually optimized to displya correctly in all browsers ie6+
+174  A: 

Here's my programmer's answer from a simliar thread

Semantics 101

First take a look at this code and think about what's wrong here...

class car {
    int wheels = 4;
    string engine;

car mybike = new car();
mybike.wheels = 2;
mybike.engine = null;

The problem, of course, is that a bike is not a car. The car class is an inappropriate class for the bike instance. The code is error-free, but is semantically incorrect. It reflects poorly on the programmer.

Semantics 102

Now apply this to document markup. If your document needs to present tabular data, then the appropriate tag would be <table>. If you place navigation into a table however, then you're misusing the intended purpose of the <table> element. In the second case, you're not presenting tabular data -- you're (mis)using the <table> element to achieve a presentational goal.


Will visitors notice? No. Does your boss care? Maybe. Do we sometimes cut corners as programmers? Sure. But should we? No. Who benefits if you use semantic markup? You -- and your professional reputation. Now go and do the right thing.

Carl Camera
Sorry, that doesn't hold water. You don't use car for mybike because you would define a "bike" class instead. You can't define something else for "<table>" because it is more than a simple semantic tag -- it tells the browser how to render its content as well.
Exactly. You would use a bike class instead. That was the point. You should use what's appropriate. You wouldn't use the car class for mybike just because its Render() method formatted things nicely. You'd make the bike class render how you want it to.
I think the point is also that loose coupling is desirable in a system. Using tables instead of DIVs+CSS to define the layout is equivalent of a tightly coupled system. More on loose coupling here:
Charles Roper
Nice way of illustration.
Vijesh VP
Nice analogy, and great conclusion. Why should anyone have to be forced by one's boss and/or users into doing the right thing? Doesn't anyone take pride in their own work any more?
Sherm Pendley
I think this is quite an arrogant post which doesn't explain anything but just repeats the same claims again without answering the question. I don't understand why it got so many upvotes????
I agree with tharkum. This response is rather subjective, and does not actually answer the question posed. While I agree that DIVs should be used for page layout, I cannot imagine that any web designer would be confused by a table-based layout.
Richard Ev
"I cannot imagine that any web designer would be confused by a table-based layout"Without Firebug I would never understand a nested table layout.
I have been through nested table layout hell so many times by this point that Richard E's comment there makes my brain hurt.
Vinko Vrsalovic
I'm also surprised that this answer is rated so highly, as it doesn't even answer the question.
Your conclusion summed it up very well! :)
I'm afraid this is the kind of fallacious reasoning I hoped to avoid. "You -- and your professional reputation. Now go and do the right thing." This is begging the question. (It assumes that a professional attitude is using CSS, while that is the thing to be proved.)
I don't think it's fair to attack my conclusion as fallacious reasoning when it is no reason at all -- it is a conclusion. My reason is in the preceding paragraph: "You're misusing the table element to achieve a presentational goal" - using the table element for something it was never intended for.
Carl Camera
@Carl Camera: That sentence doesn't show what the negative consequences are of using the table element for presentational goals. To state that it 'reflects poorly on a programmer' and questioning a 'professional' attitude, is the 'begging' part in this answer.
@bno Yes, you must accept my premise that tool misuse reflects poorly on the craftsman to accept my conclusion that proper tool use reflects positively on the craftsman. If not, then using ul for indentation or blockquote for side margins would not bother you either.
Carl Camera
+1 for using a *car* analogy.
@Carl Camera's last comment: you can't use ul for indentation or blockquote for side margins after you've used a CSS reset... hehe.
+36  A: 

Unfortunately, CSS Zen Garden can no longer be used as an example of good HTML/CSS design. Virtually all of their recent designs use graphics for section heading. These graphic files are specified in the CSS.

Hence, a website whose purpose is to show the advantage of keeping design out of content, now regularly commits the UNSPEAKABLE SIN of putting content into design. (If the section heading in the HTML file were to change, the section heading displayed would not).

Which only goes to show that even those advocate the strict DIV & CSS religion, can't follow their own rules. You may use that as a guideline in how closely you follow them.

James Curran
But it can still demonstrate the key arguments in favor of a CSS-based design, namely the redesignability, the SEO and the accessibility. Of course putting headers into graphics specified in the CSS is a no-go.
BTW the headers are still there. The HTML has to remain unchanged.
Additionally, the image header solution is only one of several -- there are options like sifr ( ) as well.
Pete Michaud
You mean they're doing `<h1>Some Text</h1>` and then in their css: `h1 { background-image('foo.jpg'); text-indent:-3000px }`? This is the *correct* way of doing it because you're retaining maximum semantic information in the style-less html. Or maybe I misunderstood you.
@Karen, if, in your example, foo.jpg shows "Some Text" in a stylized font, yes, that's what I mean. It's an unspeakable sin, because if you were to change the HTML to '<h1>Some other Text</h1>" the browser will still display "Some Text"
James Curran
In practice many sites are dynamic, so you can programatically ensure that things are changed together. For example, in a CMS system the article's headline/title would be stored in the DB along with the graphical representation (generated/uploaded). The point of CSS-ZG is to prove the concept.
Mr. Shiny and New
Karen's right, you're wrong, James. Your example is a straw man. To forget to change the image when you changed the semantic HTML would be stupid. So is leaving your laptop on a bus. What's your point?
James Curran
James Curran
@James: Content and style can't always be handled by different people. When the content is stylized, collaboration must occur. How is `<h1><img src="something.png"></h1>` any more maintainable than `<h1 class="something image">Something</h1>`? In either example something.png needs to be updated. But the second example is far more accessible.
@Josh: I disagree. The whole point of CSS is to have a clean break between the two.
James Curran
And in my example there is a clean break: The CSS simply states that the style of the content is to use an image. However the *content of the image* must be changed by a graphic professional regardless of whether CSS is used. This example makes a case against using graphics for headings rather than a case for/against CSS.
+4  A: 
  • 508 Compliance - the ability for a screenreader to make sense of your markup.
  • Waiting for render - tables don't render in the browser until it gets to the end of the </table> element.
Rick Glos
+5  A: 

One of the less obvious points. A table can only be rendered after being fully parsed by the browser, leading to slowdowns in page loading.

some browsers do make an attempt to render tables before they are fully downloaded which is why pages seem to change shape as more data is downloaded.
Toby Mills
I do not think that this post is correct. The browser will attempt to display the page while the it is still downloading. Tables delay the point in time at which this can take place, but will not slow down overall page load.
Richard Ev
Opera is excellent at progressive loading of pages with tables.
IE waits, FF doesn't

div's and css positioning allow a more flexible design, leading to easier modification and templating of your web pages.

That said, if you aren't interested in the flexibility then using a table rather than some divs that are morphed into a table by css is definitly a lot easier and quicker to knock up. I tend to use tables when knocking up a design just to get it looking right that bit quicker.

+4  A: 

The whole idea around semantic markup is the separation of markup and presentation, which includes layout.

Div's aren't replacing tables, they have their own use in separating content into blocks of related content (, ). When you don't have the skills and are relying on tables, you'll often have to separate your content in to cells in order to get the desired layout, but you wont need to touch the markup to achieve presentation when using semantic markup. This is really important when the markup is being generated rather than static pages.

Developers need to stop providing markup that implies layout so that those of us who do have the skills to present content can get on with our jobs, and developers don't have to come back to their code to make changes when presentation needs change.

Steve Perks
+3  A: 

Tools that use table layouts can become extraordinarily heavy due to the amount of code required to create the layout. SAP's Netweaver Portal by default uses TABLE to layout their pages.

The production SAP portal at my current gig has a home page whose HTML weighs over 60K and goes seven tables deep, three times within the page. Add in the Javascript, the misuse of 16 iframes with similar table issues inside of them, overly heavy CSS etc, and the page weighs over 5MB.

Taking the time to lower the page weight so you can use your bandwidth to do engaging activities with users is worth the effort.

Mike Cornell
+6  A: 

Layout flexibility
Imagine you're making a page with a large number of thumbnails.
If you put each thumbnail in a DIV, floated left, maybe 10 of them fit on a row. Make the window narrower, and BAM - it's 6 on a row, or 2, or however many fit.
You have to explicitly say how many cells are in a row. If the window is too narrow, the user has to scroll horizontally.

Same situation as above. Now you want to add three thumbnails to the third row.
Add them in. The layout will automatically adjust.
TABLE: Paste the new cells into the third row. Oops! Now there are too many items there. Cut some from that row and put them on the fourth row. Now there are too many items there. Cut some from that row... (etc)
(Of course, if you're generating the rows and cells with server-side scripting, this probably won't be an issue.)

Nathan Long

I once learned that a table loads at once, in other words when a connection is slow, the space where the table comes remains blank until the entire table is loaded, a div on the other hand loads top to bottom as fast as the data comes and regardless if it is allready complete or not.

That would have been about 15 years ago?
Tom Hawtin - tackline
@Tom Hawtin - tackline:In my country we still have the +1.
+1  A: 

If you're supporting the table angle on this find a site with tables and then get yourself a screenreader - set off the screen reader and turn off your monitor.

Then try it with a nice semantically correct div layout site.

You'll see the difference.

Tables aren't evil if the data in them is tabular not to layout the page.

Allen Hardy
+2  A: 

It's worth figuring out CSS and divs so the central content column loads and renders before the sidebar in a page layout. But if you are struggling to use floating divs to vertically align a logo with some sponsorship text, just use the table and move on with life. The Zen garden religion just doesn't give much bang for the buck.

The idea of separating content from presentation is to partition the application so different kinds of work affect different blocks of code. This is actually about change management. But coding standards can only examine the present state of code in a superficial manner.

The change log for an application that depends on coding standards to "separate content from presentation" will show a pattern of parallel changes across vertical silos. If a change to "content" is always accompanied by a change to "presentation", how successful is the partitioning?

If you really want to partition your code productively, use Subversion and review your change logs. Then use the simplest coding techniques -- divs, tables, JavaScript, includes, functions, objects, continuations, whatever -- to structure the application so that the changes fit in a simple and comfortable manner.

+26  A: 

One table for layout wouldn't be that bad. But you can't get the layout you need with just one table most of the time. Pretty soon you have 2 or three nested tables. This becomes very cumbersome.

  • It IS a LOT harder to read. That's not up to opinion. There's just more nested tags with no identifying marks on them.

  • Separating content from presentation is a good thing because it allows you to focus on what you're doing. Mixing the two leads to bloated pages that are hard to read.

  • CSS for styles allows your browser to cache the files and subsequent requests are much faster. This is HUGE.

  • Tables lock you into a design. Sure, not everyone needs the flexibility of CSS Zen Garden, but I've never worked on a site where I didn't need to change the design a little bit here and there. It's much easier with CSS.

  • Tables are hard to style. You don't have very much flexibility with them (i.e. you still need to add HTML attributes to fully control a table's styles)

I haven't used tables for non-tabular data in probably 4 years. I haven't looked back.

I'd really like to suggest reading CSS Mastery by Andy Budd. It's fantastic.

Image at

Ben Scheirman
I can highly recommen this book
Jacob T. Nielsen
Contains good examples for box model, selectors, and positioning.
+1  A: 

A huge issue for me is that tables, especially nested tables, take much longer to render than a properly layed out css implementation. (You can make css just as slow).

All browsers render the css faster because each div is a seperate element, so a screen can be loading as the user is reading. (For huge data sets, etc). I've used css instead of tables in that instance not even dealing with layout.

A nested table (tables inside of cells, etc) will not render to the browser window until the last "/table" is found. Even worse - a poorly defined table will somtimes not even render! Or when it does, things misbehave. (not colspanning properly with "TD"'s etc.)

I use tables for most things, but when it comes to large data and the desire to have a screen render quickly for an end-user - I try my best to utilize what CSS has to offer.

+7  A: 

I think that boat has sailed. If you look at the direction the industry has taken you will notice that CSS and Open Standards are the winners of that discussion. Which in turn means for most html work, with the exception of forms, the designers will use divs instead of tables. I have a hard time with that because I am not a CSS guru but thats the way it is.

Thomas Wagner
+1  A: 

Tables are for tabular data, not design.

+1  A: 

I do believe this is an issue connected to a general problem. When HTML was born no one could foresee its widespread use. Another technology which almost collapsed under the weight of its own success. When HTML pages were written in vi on a green text terminal a TABLE was all that was needed to present data to the visitors of the page, and it mostly was data that made sense in a tabular form.

We all know how things evolved. TABLEs went out of fashion comparatively recently, but there are lots of reasons to prefer DIVs and CSS based layouts (accessibility not the last of them). Of course I can't write a CSS to save my life :-) and I think a graphical design expert should always be at hand.

That said... there are lots of data that should be presented in a table even in a modern web site.

Manrico Corazzi
+1  A: 

Use tables when you need to ensure that elements need to remain in a specific physical relationship in the layout. For data, the table is generally the best layout element to use because you do not want your columns to wrap in an uxexpected ways and confuse the associations.

One could also argue that non-data elements that must remain in a specific relationship should also be rendered in a table.

Flexible css layouts are great for content that is suitable for mobile devices and large screens and printing and other display types, but sometimes, the content just has to be displayed in a very specific way and if that requires that screen readers cannot easily access it, it could very well be justified.

”One could also argue that non-data elements that must remain in a specific relationship should also be rendered in a table.” Such data simply has no place in HTML. You need to understand your medium.
Konrad Rudolph

I have found that even with the best planning divs come up short in several respects. For instance. there is no way with divs to have a bottom bar that always sits at the bottom of the browser, even when the rest of the content does not go to the bottom of the browser. Also, you cannot elegantly do anything better than three columns, and you cannot have columns that grow and shrink according the the width of their content. In the end, we try to use divs first. However, we will not limit our html designs based on some religious content vs layout ideal.

Take the time to learn CSS properly and you will not limit your html designs with these things called tables.
You can have a bottom bar that always is at the bottom. Google 'footer stick'
look at facebook...its got it...
All of these things are difficult, and sometimes you *do* have to make compromises to make these all work together; particularly in liquid width designs
+232  A: 

I'm going to go through your arguments one after another and try to show the errors in them.

It's good to separate content from layout But this is a fallacious argument; Cliché Thinking.

It's not fallacious at all because HTML was designed intentionally. Misuse of an element might not be completely out of question (after all, new idioms have developed in other languages, as well) but possible negative implications have to be counterbalanced. Additionally, even if there were no arguments against misusing the <table> element today, there might be tomorrow because of the way browser vendors apply special treatment to the element. After all, they know that “<table> elements are for tabular data only” and might use this fact to improve the rendering engine, in the process subtly changing how <table>s behave, and thus breaking cases where it was previously misused.

So what? Does my boss care? Do my users care?

Depends. Is your boss pointy-haired? Then he might not care. If she's competent, then she will care, because the users will.

Perhaps me or my fellow developers who have to maintain a web page care... Is a table less maintainable? I think using a table is easier than using divs and css.

The majority of professional web developers seem to oppose you[citation needed]. That tables are in fact less maintainable should be obvious. Using tables for layout means that changing the corporate layout will in fact mean changing every single page. This can be very expensive. On the other hand, judicious use of semantically meaningful HTML combined with CSS might confine such changes to the CSS and the pictures used.

By the way... why is using a div or a span good separation of content from layout and a table not? Getting a good layout with only divs often requires a lot of nested divs.

Deeply nested <div>s are an anti-pattern just as table layouts. Good web designers don't need many of them. On the other hand, even such deep-nested divs don't have many of the problems of table layouts. In fact, they can even contribute to a semantic structure by logically dividing the content in parts.

Readability of the code I think it's the other way around. Most people understand html, little understand css. It's simpler.

“Most people” don't matter. Professionals matter. For professionals, table layouts create many more problems than HTML + CSS. This is like saying I shouldn't use GVim or Emacs because Notepad is simpler for most people. Or that I shouldn't use LaTeX because MS Word is simpler for most people.

It's better for SEO not to use tables

I don't know if this is true and wouldn't use this as an argument but it would be logical. Search engines search for relevant data. While tabular data could of course be relevant, it's rarely what users search for. Users search for terms used in the page title or similarly prominent positions. It would therefore be logical to exclude tabular content from filtering and thus cutting the processing time (and costs!) by a large factor.

Tables are slower. An extra tbody element has to be inserted. This is peanuts for modern web browsers.

The extra element has got nothing to do with tables being slower. On the other hand, the layout algorithm for tables is much harder, the browser often has to wait for the whole table to load before it can begin to layout the content. Additionally, caching of the layout won't work (CSS can easily be cached). All this has been mentioned before.

Show me some benchmarks where the use of a table significantly slows down a page.

Unfortunately, I don't have any benchmark data. I would be interested in it myself because it's right that this argument lacks a certain scientific rigour.

Most web sites that need an upgrade need new content (html) as well. Scenarios where a new version of a web site only needs a new css file are not very likely.

Not at all. I've worked on several cases where changing the design was simplified by a separation of content and design. It's often still necessary to change some HTML code but the changes will always be much more confined. Additionally, design changes must on occasion be made dynamically. Consider template engines such as the one used by the WordPress blogging system. Table layouts would literally kill this system. I've worked on a similar case for a commercial software. Being able to change the design without changing the HTML code was one of the business requirements.

Another thing. Table layout makes automated parsing of websites (screen scraping) much harder. This might sound trivial because, after all, who does it? I was surprised myself. Screen scraping can help a lot if the service in question doesn't offer a WebService alternative to access its data. I'm working in bioinformatics where this is a sad reality. Modern web techniques and WebServices have not reached most developers and often, screen scraping is the only way to automate the process of getting data. No wonder that many biologists still perform such tasks manually. For thousands of data sets.

Konrad Rudolph
"changing the corporate layout will in fact mean changing every single page" - Do people still actually duplicate the corporate layout on every page? It's so easy to resolve with master pages or user controls in .net, include files in php or classic asp, etc ... Anybody who copies the company layout like this deserves an a** kicking! ;-)
John MacIntyre
@John MacIntyre: I entirely agree. Template as much as possible and only vary where necessary. It's simple laws of management.
John: true, that argument doesn't really apply on a well-structured site. However, even with master pages I see that at least *some* style elements will be duplicated, simply because there won't be just *one* master page. Redundancies will always exist, even when using both templates and proper CSS. Both techniques help reducing them, though.
Konrad Rudolph
Sorry but this is really "pie int he sky" wishful thinking. Users care? No. Noone cares except a small number of misguided revisionists. HTML (including tables) is far older than the relatively new notion of "semantics vs layout". Oh and source please for "the majority of professional web developers oppose you".
Konrad Rudolph
… with every revision of the standards. The advantages of the separation pile up. My biggest problem with the use of tables for layout in big sites is that this directly prevents standards folks and implementors from making important changes, for fear of breaking compatibility. Moronic use of tables for layout directly hinders progress. Sorry for the strong language but that's just the way it is.
Konrad Rudolph
Typo above: semantics were implied *from* the beginning. <table> in HTML was always only meant for tabular data, never for layouting (back in the early years you couldn't change the table looks anyway, thus preventing its use as a layout anchor). In fact, early drafts of HTML had no notion of layout at all, and HTML was never meant for layout, but for structuring text. Even more: the very first proposal of HTML repeatedly warns against abusing tags to influence the layout, and cautions to use logical over physical markup.
Konrad Rudolph
Get a screen reader and have it read a page with a table layout. that is all.
"Search engines search for relevant data. While tabular data could of course be relevant, it's rarely what users search for." Except that if everybody and their dog uses tables for building layouts, search engines should (and indeed do) treat contents of tables accordingly, otherwise they won't be relevant. I agree with the rest of your post, though.
David Parunakian
@Sergio: please do not edit out relevant information. This *is* an unsourced dubious claim I’m using there and I want to make that quite clear. Your edit put a claim in my mouth that I can’t back up, effectively making me a liar if this turns out to be false.
Konrad Rudolph

Tables used as pure layout does pose some problems for accessability (that I've heard). But I understand what is being asked here that somehow you're crippling the web by using a table to ensure correct alignment of something on your page.

I've heard people argue before that FORM labels and inputs are, in fact, data and that they should be allowed into tables.

The argument that using a table to make sure a few elements line up correctly causes this massive increase in code tend to include examples of how a single DIV can meet all their needs. They don't always include the 10 lines of CSS and special browser hacks they had to write for IE5,IE5.5,IE6,IE7...

I think it remains about using balance in your design. Tables are in the toolbox, just remember what they are for...

+1  A: 

I try to avoid TABLEs as much as possible, but when we are designing complex forms that mix multiple control types and different caption positions with pretty strict controls on grouping, using DIVs is unreliable or often near impossible.

Now, I will not argue that these forms could not be redesigned to better accommodate a DIV based layout, but for some of them our customer is adamant about not changing the existing layouts from the previous version (written in classic ASP) because it parallels a paper form that their users are familiar with.

Because the presentation of the forms is dynamic (where the display of some sections is based on the state of the case or the permissions of the user), we use sets of stacked DIVs, each containing a TABLE of logically grouped form elements. Each column of the TABLE is classed so that they can be controlled by CSS. That way we can turn off different sections of the form without the problem of not being table to wrap rows in DIVs.

+1  A: 

From past experience, I'd have to go for DIV's. Even in OOP, the main aim is to reduce the coupling between objects, so this concept can be applied to DIVS and tables. Tables are used for holding data, not for arranging it around a page. A DIV is specifically designed to arrange items around a page, so the design should use DIV's, tables should be used to store data.

Also, editting websites made with tables is just plain hard (in my opinion)

+18  A: 

I wonder who's done a "view source" on stackoverflow's pages~~

Scott Evernden
I did. I frequently do this if i enter a new site. Just to be curious how they did it.
Yeah, it's interesting...or shocking...
Dimitri Wetzel
OMG . . . . . .
Camilo Martin
+3  A: 

This isn't really about whether 'divs are better than tables for layout'. Someone who understands CSS can duplicate any design using 'layout tables' pretty straightforwardly. The real win is using HTML elements for what they are there for. The reason you would not use tables for non-tablular data is the same reason you don't store integers as character strings - technology works much more easily when you use it for the purpose for which it is desgined. If it was ever necessary to use tables for layout (because of browser shortcomings in the early 1990s) it certainly isn't now.


Surely the OP was a bit of a wind up, the arguments seem so week and easily countered.

Web pages are the domain of web developers, and if they say div & CSS is better than tables that's good enough for me.

If a layout is achieved by tables generated by a server app, then a new layout means changes to the app, a rebuild and redelpoy of the application, as apposed to just changes to a css file.

Plus, accessibility. Tables used for layout make a website inaccessible, so don't use them. It's a no brainer, not to mention illegal.


I am really interested in good arguments to use tables instead of divs + CSS.


This is a POV question if I've ever seen one.

Lots of near religious wars have been fought over this topic and the standard practice shows that divs have won by a fair margin. They are easier to manage and restyle without destroying and rebuilding the entire site in the process..

Roland Tepp

I think nobody cares how a website was designed/implemented when it behaves great and it works fast.

I use both "table" and "div"/"span" tags in HTML markup.

Let me give you few arguments why I am choosing divs:

  1. for a table you have to write at least 3 tags (table, tr, td, thead, tbody), for a nice design, sometimes you have a lot of nested tables

  2. I like to have components on the page. I don't know how to explain exactly but will try. Suppose you need a logo and this have to be placed, just a small piece of it, over the next page content. Using tables you have to cut 2 images and put this into 2 different TDs. Using DIVs you can have a simple CSS to arange it as you want. Which solution do you like best?

  3. when more then 3 nested tables for doing something I am thinking to redesign it using DIVs

BUT I am still using tables for:

  1. tabular data

  2. content that is expanding self

  3. fast solutions (prototypes), because DIVs box model is different on each browser, because many generators are using tables, etc


Using DIV, you can easily switch things. For example, you could make this :

Menu | Content

Content | Menu


It's easy to change it in CSS, not in HTML. You can also provide several styles (right handed, left handed, special for little screen).

In CSS, you can also hide the menu in a special stylesheet used for printing.

Another good thing, is that your content is always in the same order in the code (the menu first, the content after) even if visually it's presented otherwise.

+1  A: 

Tables are not in general easier or more maintanable than CSS, However there are a few specific layout-problems where tables are indeed the simplest and most flexible solution.

CSS is clearly preferable in cases where presentational markup and CSS supports the same kind of design, No-one in their right mind would argue that font-tags are better than specifying typography in CSS, since CSS gives you the same power than font-tags, but in a much cleaner way.

The issue with tables, however, is basically that the table-layout model in CSS is not supported in Microsoft Internet Explorer. Tables and CSS are therefore not equivalent in power. The missing part is the grid-like behavior of tables, where the edges of cells align both vertically and horizontally, while cells still expand to contain their content. This behavior is not easy to achieve in pure CSS without hardcoding some dimensions, which makes the design rigid and brittle (as long as we have to support IE - in other browsers this is easliy achieved by using display:table-cell).

So its not really a question of whether tables or CSS is preferable, but it is a question of recognizing the specific cases where use of tables may make the layout more flexible.

The most important reason for not using tables is accessibility. The Web Content Accessibility Guidelines advice againt using tables for layout. If you are concered about accessibility (and in some cases you may be legelly obliged to), you should use CSS even if tables are simpler. Note that you can always create the same layout with CSS as with tables, it might just require more work.

+8  A: 

Here's a section of html from a recent project:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ""&gt;
<html xmlns="" xml:lang="en" lang="en">
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <link rel="stylesheet" type="text/css" href="./styles/base.css" />
    <div id="header">
        <h1><!-- Page title --></h1>
        <ol id="navigation">
            <!-- Navigation items -->
        <div class="clearfix"></div>
    <div id="sidebar">
        <!-- Sidebar content -->
    <!-- Page content -->
    <p id="footer"><!-- Footer content --></p>

And here's that same code as a table based layout.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ""&gt;
<html xmlns="" xml:lang="en" lang="en">
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <link rel="stylesheet" type="text/css" href="./styles/base.css" />
    <table cellspacing="0">
            <td><!-- Page Title --></td>

            <td><!-- Page content --></td>
            <td><!-- Sidebar content --></td>
            <td colspan="2">Footer</td>

The only cleanliness I see in that table based layout is the fact that I'm overzealous with my indentation. I'm sure that the content section would have a further two embedded tables.

Another thing to think about: filesizes. I've found that table-based layouts are twice the size of their CSS counterparts usually. On our hig-speed broadband that isn't a huge issue but it is on those with dial up modems.

speed isn't the only thing that is hurt by larger files: many companies pay for bandwidth. If you can cut your client's bandwidth bills in half simply by coding well, that's a great advantage.
Mr. Shiny and New
Yeah but don't forget that while the HTML might be twice as large in a CSS-less layout, using a DIV+CSS layout will result in (at least) an extra HTTP Request for the CSS file, plus the bandwidth usage for the file itself.
But the css file need only be downloaded once, where as the whole table structure is resent on each page request.
You've picked a design well-suited to div+css and shown that it's more verbose in a table-based design? So what: It would be just as easy to create a design that was well-suited to table-based layout and show the hoops you'd have to jump through to replicate it in CSS.

WYSIWYG!!! I can't for the life of me get our designers to stop using nested DIVS and styled by elementID css in templates that are supposed to be used by clients in CMS projects. That's the whole point of a WYSIWYG online editor. You are controlling both the content and the layout at the same time! There is no separation at all in the first place in this scenario. Positioned and styled Divs in some external stylesheet are anathema to the whole idea of WYSIWYG editing. Tables can be seen, rows inserted, cells combined and so on. Good luck trying this with divs in a way that doesn't frustrate users.


Super short answer: designing maintainable websites is difficult with tables, and simple with the standard way to do it.

A website isn't a table, it's a collection of components that interact with each other. Describing it as a table doesn't make sense.

Rich Bradshaw

One example: you want to center the main content area of a page, but in order to contain the floats inside it, it needs to be floated. There is no "float: center" in CSS.

That is not the only way to "contain the floats" inside a centred element. So, not a good argument at all!

In a way, it's a false premise, the "divs vs tables" thing.

Quick-and-dirty division of a page into three columns? Tables are easier, to be honest. But no professional uses them any more for layout, because they lock the positioning of page elements into the page.

The real argument is "positioning done by CSS (hopefully in a remote file)" as opposed to "positioning done by HTML in the page". Surely everyone can see the benefits of the former as opposed to the latter?

  1. Size -- if your page layout is in the HTML, in the pages, it can't be cached, and it has to be repeated on every page. You will save enormous amounts of bandwidth if your layout is in a cached CSS file, not in the page.
  2. Multiple developers can work on the same page at the same time -- I work on the HTML, other guy works on the CSS. No repository needed, no problems with over-writing, file locking etc.
  3. Making changes is easier -- there will be problems with layout in different browsers, but you only have to fix one file, the CSS file, to sort them out.
  4. Accessibility, as mentioned a lot previously. Tables assume a two-dimensional layout works for everyone. That's not how some users view your content and it's not how Google views your content.

Consider this:

[ picture ] [ picture ] [ picture ]
[ caption ] [ caption ] [ caption ]

which represents two rows of a table with 6 cells. Someone who can see the 2-D table layout will see a caption under each picture. But using speech synthesis, or a PDA, and for a search engine spider, that's

picture picture picture caption caption caption

and the relationship, which is obvious with the table in place, disappears.

Are DIVs and CSS better for the task of simply laying out rectangles on an HTML page to achieve a given design in the shortest possible time? No, they're probably not. But I'm not in the business of quickly laying out rectangles to achieve a given design. I'm thinking of a much bigger picture.

+1  A: 

When I design my layout using CSS, I generally give every major section its own root (body level) div, and use relative/absolute positioning to get it into its proper place. This is a bit more flexible than tables, as I'm not limited to an arrangement that I can represent using rows and columns.

Furthermore, if I decide that I want to rearrange the layout (say I want the navigation bar to be on the right now) I can simply go and alter the position for the elements in one place (the CSS file) and the HTML doesn't have to change. If I were doing that with tables, I would have to go in and find the information and do a lot of attribute modding and copying and pasting to get the same effect.

In fact, using CSS, I can even have my users select how they want their layout to work. So long as the general size of the content areas doesn't change, I'm perfectly OK with using a bit of PHP scripting to output my CSS based on user preferences, and allowing them to rearrange the site to their own liking. Once again, possible with tables, but much much harder to maintain.

Finally, CSS allows one MAJOR benefit that tables will never provide: the ability to reformat content based on the display device. CSS allows me to use a completely different style set (including position, formatting, etc) for a printer than the one I use for the monitor. This can be extended to other media as well, an excellent example is Opera Show, which allows a cleverly designed (and very standard) CSS enhanced page to be viewed as a slide show.

So in the end, flexibility and management are the real winners. Generally, CSS allows you to do more with the layout. There's nothing technically nonstandard about a table based layout, but why would you want to limit yourself?


Nicholas Flynt
+1  A: 

In the past, screen readers and other accessibility software had a difficult time handling tables in an efficient fashion. To some extent, this became handled in screen readers by the reader switching between a "table" mode and a "layout" mode based on what it saw inside the table. This was often wrong, and so the users had to manually switch the mode when navigating through tables. In any case, the large, often highly nested tables were, and to a large extent, are still very difficult to navigate through using a screen reader.

The same is true when divs or other block-level elements are used to recreate tables and are highly nested. The purpose of divs is to be used as a fomating and layout element, and as such, are intended used to hold similar information, and lay it out on the screen for visual users. When a screen reader encounters a page, it often ignores any layout information, both CSS based, as well as html attribute based(This isn't true for all screen readers, but for the most popular ones, like JAWS, Windows Eyes, and Orca for Linux it is).

To this end, tabular data, that is to say data that makes logical sense to be ordered in two or more dimensions, with some sort of headers, is best placed in tables, and use divs to manage the layout of content on the page. (another way to think of what "tabular data" is is to try to draw it in graph form...if you can't, it likely is not best represented in a table)

Finally, with a table-based layout, in order to achieve a fine-grained control of the position of elements on the page, highly nested tables are often used. This has two effects: 1.) Increased code size for each page - Since navigation and common structure is often done with the tables, the same code is sent over the network for each request, whereas a div/css based layout pulls the css file over once, and then uses less wordy divs. 2.) Highly nested tables take much longer for the client's browser to render, leading to slightly slower load times.

In both cases, the increase in "last mile" bandwidth, as well as much faster personal computers mitigates these factors, but none-the-less, they still are existing issues for many sites.

With all of this in mind, as others have said, tables are easier, because they are more grid-oriented, allowing for less thought. If the site in question is not expected to be around long, or will not be maintained, it might make sense to do what is easiest, because it might be the most cost effective. However, if the anticipated userbase might include a substantial portion of handicapped individuals, or if the site will be maintained by others for a long time, spending the time up front to do things in a concise, accessible way may payoff more in the end.

+2  A: 

I've had to do sites in both of those ways, plus a third, the dreaded "hybrid" layout with tables, divs and styles: Divs/CSS wins, handily.

You'd have to nest divs three deep to match the code weight of just one table cell, right off the bat. That effect scales with nested tables.

I'd also prefer to make one layout change, vs one change for every page in my site.

I have full control over every aspect of presentation with divs/css. Tables mess that up in hideous ways, especially in IE, a browser which I have never yet had the option not to support.

My time for maintenance or redesign of a divs/css website is a fraction of what it would be in tables.

Finally, I can innovate multiple, switchable layouts with CSS and virtually any scripting language. That would be impossible for me with tables.

Good luck with your ROI as you make that decision.

John Dunagan
Sounds like you just don't know CSS that well. The table tag's purpose is for tabular data, and not layouts.
+1  A: 

It's probably a bit late to make any points on this discussion that haven't already been made other then it just disturbs me a little bit that the benefits of of a non table layout can't be seen and semantics have seemingly been ignored in a markup language that is all about semantics. It would be like building an OO application and using no classes.

It's wrong and quite clearly wrong.

Belt drive turntables work. Would you buy one?

Nick Allen - Tungle139

Personally, I find it very hard to keep track of tables in my HTML pages. If you want to really design a page, you need to start at the drawing board... literally. Using Photoshop or The GIMP, start structurising a page, add lines, set pixel distances between paragraphs, list-items and so on. Then you can do the HMTL with DIV and everything will be underneath the next thing. Then use CSS to position everything correctly and then maybe JavaScript if you want to add some dynamic stuff.

The nice thing about div's and span's is that it's easier to keep track of where you are, since the ID or class is different. With a table, you get loads of elements that all look the same and good luck getting your entire web page on one text editor page on your screen.


Once Internet Explorer 8 has overthrown Internet Explorer7 and Internet Explorer 6 (this could be a while off), tables will be obsolete for layout.

The new 'table-cell' and its similar values for 'display' in CSS will allow you to get any of the 'advantages' (equal height columns, etc.) of table based layouts in CSS.

I also think that is is pretty unprofessional to put up a page that's laid out with tables. If you're going to call yourself a web developer you may as well try at least to do the job right. Just my personal opinion.


In terms of site maintenance and design overhauls while maintaining content (which happen all the time, especially in eCommerce):

Content and design mashed up together via tables = updating both content and design.

Content separate from design = updating design and maybe a little content.

If I had it my way, I'd keep my content in PHP generating XML, converted to markup in XSLT and designed with CSS and Javascript for the interaction. For the Java side of things, JSP to JSTL to generate the markup.


It doesn't have to be a war. Harmony is possible

Use one table for the overall layout and divs inside it.

<tr><td colspan="3"><div>Top content</div></td></tr>

<td><div>Left navigation</div></td>
<td><div>Main content</div></td>
<td><div>Right navigation</div></td>

<tr><td colspan="3"><div>Bottom content</div></td></tr>


Look ma - no nested tables.

I have ready so many articles on how to achieve this with DIVs but have never found anything that works every time with no issues.

DIVs are great once you have the overall structure but quite frankly, fluid header/footer and three fluid columns is a total pain in DIVs. DIVS weren't designed for fluidity so why use them?

Note that this approach will give you 100% CSS compliance at link text

You say look ma no nested tables, but remember you also haven't added the complexity of your left navigation, or main content, once you add complexity in , then you'll have to start nesting tables, but who cares, there is nothing wrong with nesting tables.
Michael L
Once I have the overall table structure which works effortlessly - unlike the ridiculously complicated divs you need to work in all browsers (see, I use divs inside the cells. There are no more tables.
+9  A: 



100% Agree, I use tables and I've been hearin this argument not to use tables well for about 6 years now. In these past 6 years the face of HTML has changed very little, and guess what, tables are still around.

In my opinion there was nothing wrong with tables in the first place, only a few IT glory boys started reading XHTML articles, they never really understood, and just started thinking divs and spans somehow were designed to replace tables.

Lets be very clear about one thing, tables are here to stay, and have been included in the HTML 5 specification, don't feel bad about using them.

Another thing that I don't get, is that some people think XHTML is cleaner, but then I ask them if they know XSL or XLST and they say no - thats too complex, but this is one of the best things about XHTML.

Another point worth noting is that XHTML was never designed to replace HTML 4. HTML 5 replaces 4, while XHTML has its own uses, and is ideal for use in CMS systems.

Michael L
You can hardly agree with a question, can you?

1: Yes, your users do care. If they use a screen reader, it will be lost. If I use any other tool which tries to extract information from the page, encountering tables that aren't used to represent tabular data is misleading.

A div or span is acceptable for separating content because that is precisely the meaning of those elements. When I, a search engine, a screen reader or anything else, encounter a table element, we expect that this means "the following is tabular data, represented in a table". When we encounter a div, we expect "this is an element used to divide my content into separate parts or areas.

2: Readability: Wrong. If all the presentation code is in css, I can read the html and I'll understand the content of the page. Or I can read the css and understand the presentation. If everything is jumbled together in the html, I have to mentally strike out all the presentation-related bits before I can even see what is content and what isn't. Moreover, I'd be scared to meet a web developer who didn't understand css, so I really don't think that is an issue.

3: Tables are slower: Yes, they are. The reason is simple: Tables have to be parsed completely, including their contents before they can be rendered. A div can be rendered when it is encountered, even before its contents have been parsed. That means divs will show up before the page has finished loading.

And then there's the bonus, that tables are much more fragile, and won't always be rendered the same in different browsers, with different fonts and font sizes and all the other factors that can cause layout to vary. Tables are an excellent way to ensure that your site will be off by a pixel or two in certain browsers, won't scale well when the user changes his font size, or changes his settings in any other way.

Of course #1 is the big one. A lot of tools and applications depend on the semantic meaning of a webpage. The usual example is screen-readers for visually impaired users. If you're a web developer, you'll find that many large companies who may otherwise hire you to work on a site, require that the site is accessible even in this case. Which means you have to think about the semantic meaning of your html. With the semantic web, or more relevantly, microformats, rss readers and other tools, your page content is no longer viewed exclusively through a browser.

+1  A: 

I'm sorry for my English but here's another reason :

I worked in some governmental organization and the number one reason to not use TABLE, is for disabled peoples. They use machines to "translate" web pages.

The problem is this "translation machine" can't read the website if it's done by TABLE. Why ? Because TABLE are for DATAS.

in fact, if you use TABLES, for each CELLS you have to specify some informations to let disabled people to know where they are in the TABLE. Imagine you have a big table and have to zoom to see only 1 cell in the screen : you have to know in which line/col you are.

So, DIV are used, and the disabled can simply read text, and don't get some weird informations about lines/cols when they don't have to be there.

I also prefer TABLE to make quick and easy templates, but I'm now used to CSS... it's powerful, but you really have to know what you are doing... :)

+1  A: 

I researched the issue of screen readers and tables a few years ago and came up with information that contradicts what most developers believe:

"You will probably hear some accessibility advocates say that layout tables are a bad idea, and that CSS layout techniques ought to be used instead. There is truth in what they say, but, to be honest, using tables for layout is not the worst thing that you could do in terms of accessibility. People with all kinds of disabilities can easily access tables, as long as the tables are designed with accessibility in mind. "


XHTML should describe the content. Accessibility is also a concern. You will want screen readers to understand what your XHTML is describing.

Brian David Berman

Div content does force a better understanding of CSS but it is much cleaner and concise

+1  A: 

Here is a reality check: Everything Old is New Again.

+8  A: 

Try making a page with 3 columns, a header and a footer with div's which has the property that ALL of the three columns should be of equal height where the total height of these columns should be depending of the (longest) content in just one of them. You will end up with a lot of (nested) div's and a complicated stylesheet full of tricks.

Using a simple 3-row/3-column table (with merge for the header and footer) for the main layout is a lot easier. Div's are not the holy grail at all. Google for websites trying to invent a decent and easy CSS with div's for above mentioned layout....

Tables are definitely cleaner to use than css for such layouts - even the google's sites use them extensively...

It's a fallacy that you can't design complicated layouts with DIVs.
Check this out, it has CSS code as well -

+2  A: 

From the guy who's credited as being the first to use tables for layout: The Web is Ruined and I Ruined It


Data: use tables. Layout: use styles. Tables can render fastest with a very lean browser, that is, Links 2 or Lynx with no styling, just plain markup.

+7  A: 

I love this question because it exposes something that is true in any debate.

Absolute statements are always typically wrong.

I hear the repetitive mantra of the echo chamber chanting "Never use tables for layout, use CSS, it is semantic" blah blah blah.

The truth is

  1. In most cases, use CSS for layout.
  2. In rare cases, use tables for layout.
  3. Learn HTML/CSS, get experience, then you will be able to discern the right and wrong cases.

I get so frustrated when I hear developers repeat things they read without thinking for themselves.

Christopher Altman
4. The cases in 2 are in the "wrong cases" bag, but in the "not worth avoiding tables" bag as well.
+1  A: 

I think colspan is bad enough for wanting me want to drop tables for layout altogether.

+6  A: 

The fact that this is a hotly debated question is a testament to the failure of the W3C to anticipate the diversity of layout designs which would be attempted. Using divs+css for semantically-friendly layout is a great concept, but the details of implementation are so flawed that they actually limit creative freedom.

I attempted to switch one of our company's sites from tables to divs, and it was such a headache that I totally scrapped the hours of work I had poured into it and went back to tables. Trying to wrestle with my divs in order to gain control of vertical alignment has cursed me with major psychological issues that I will never shake as long as this debate rages on.

The fact that people must frequently come up with complex and ugly workarounds to accomplish simple design goals (such as vertical alignment) strongly suggests that the rules are not nearly flexible enough. If the specs ARE sufficient, then why do high-profile sites (like SO) find it necessary to bend the rules using tables and other workarounds?


Google gives very low priority to text content contained inside a table. I was giving some SEO advice to a local charity. In examining their website it was using tables to layout the site. Looking at each page, no matter what words - or combination of words - from their pages I used in the Google search box the pages would not come up in any of the top search pages. (However, by specifying the site in the search the page was returned.) One page was well copy written by normal standards to produce a good result in a search but still it didn't appear in any of the first pages of search results returned. (Note this text was within a table.) I then spotted a section of text on the pages which was in a div rather than a table. We put a few of the words from that div in the search engine. Result? It came in at No.2 in the search result.

Simon Measures

The advantages are clear... But coding DIVs is so much more unpleasant than building nice tables :) I will try to code as many pages as possible with DIV tags, hopefully they will run faster!

Patrick Swanson
Using too many `<div />` tags is also an anti-pattern. Try to use more meaningful tags to structure your document. Also, I'd recommend using an HTML5 shim so you can use more semantic tags.
Dan Herbert