Q. How do I make my table cells the same width in all browsers? Netscape and IE size my table cells differently.
A. You can take control of your table by using shims to hold cells open. The tutorial below gives a full explanation of how to do this.
Managing Fixed Width Tables
Author: Murray
R. Summers
Author's Site: Great-Web-Sights.com
Taking Control of Your Tables
Above this line, you will see a new table as inserted in DW (I added
the background color!) The table is 1 row and 5 columns and it is
500 pixels wide. I have set cell padding, spacing and borders to zero.
Other than adding the background color, I have done nothing to the
table after inserting it. Notice how the cells all line up nicely
on the 100 pixel marks. Without other information to guide them, all
browsers will uniformly distribute the table's width across each column.
Above this line you can see what happens when I click in the middle
cell and type the single "a" character! It's shocking.
The table is still 500 pixels wide, but the distribution of those
pixels across the columns has changed so that the middle cell is
now about 170 pixels wide. It changed for the following reasons.
Browsers don't like to render empty cells - and Internet Explorer
does it differently than Netscape. To avoid the confusion that this
can create for the person building the page, the wizards at Macromedia
decided to pre-load each cell in a newly inserted table with a non-breaking
space - see for yourself - here is the code right after I inserted
the table on the top of the page (but before I added the background
colors)-
<table width="500" border="0" cellspacing="0" cellpadding="0">
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
See all those " " things? They are non-breaking
spaces and they were automatically put there by Dreamweaver when
I inserted the table. They are there to 'prop' the cells open so
that the entire table doesn't collapse when you view it in the browser.
The character gives each cell dimensionality in both
the horizontal and the vertical.
Now, look at the code for the second table (after I added the single
"a" character) -
<table width="500" border="0" cellspacing="0"
cellpadding="0">
<tr>
<td> </td>
<td> </td>
<td>a</td>
<td> </td>
<td> </td>
</tr>
</table>
Notice that the middle cell has lost its " "
and gained a single, lonely "a". The reason that the cell
changes size is that the browser looks at the default font and the
default character size within that font and it compares the size
of the "a" character to the " " character (that's
a space) and it concludes that the "a" character is wider
than the " " character by about 1.7 fold. Having
done this, the browser now calculates it must approximately double
the width of the cell now containing the "a" character,
because of this size difference. and so the cell goes from exactly
100 pixels to ~170 pixels. Thus, if the middle cell is 170 pixels,
this leaves 330 pixels for the other 4 cells, or ~82 pixels per
cell. Check it out on the ruler above!
|
|
Now look at what happens if I just change the "a" character
to a monospace font by using CSS (or the font field in the Properties
Inspector)- the width of the cell drops from ~170 pixels to nearly
150 pixels. But the table is still 500 pixels wide!
So - what can we conclude from this? Well, it seems clear that
the distribution of the widths of cells across a fixed width table
is entirely dependent on the contents of those cells. It also seems
clear that it is very DANGEROUS to assume that a cell will stay
at a given size if it only contains text (unless there is some other
cell in the same row or column that has a fixed width or height
element in it). What are we to do? I have it! Let's specify a fixed
width for that cell!
Look what happens if I try to fix the width of the middle cell
at 75 pixels and begin to add more text (these are 1 row tables
stacked on top of each other. rather than a single table!) (be ready
for a big shock if you are using Netscape!) -
AARGH!
First of all, if you are looking with Netscape 4x, you will see
that by fixing the width of the middle cell *only* -
<td bgcolor="#CCFFCC"> </td>
<td bgcolor="#FFCCCC"> </td>
<td bgcolor="#CCFFCC" width="75" class="mono">a</td>
<td bgcolor="#FFCCCC"> </td>
<td bgcolor="#CCFFCC"> </td>
I have made the table go completely out of shape. And what's worse
is that Netscape 4x has completely ignored my directive to make
the middle cell 75 pixels wide.
This means that I can't constrain a cell to any given width just
by setting its "W" field in the property inspector - and
that's the truth!
Now look what happened in the next-to-last row - I simply put a
space in the midst of the string of letters so that the characters
would wrap in the cell. Guess what that did? It made the cell double
the height, and hence the rest of the row! But not
in Netscape, where you see about the same rendering as you see in
the Dreamweaver edit window, except for me, in Netscape, the middle
column is so wide that the space doesn't even break the line - even
with the 75 character width specification - Netscape just doesn't
obey this as anything other than a suggested MINIMUM width!
This illustration also points out an interesting difference between
Netscape and Internet Explorer's method of dealing with tables.
Intenet Explorer tries to follow the 75 pixel width specification
until it can no longer do so because of the cell's content at which
point it expands the cell. Netscape, on the other hand, works as
expected until I enter that 75 pixel
cell width, at which point it looks at each of the other cells,
resizes them based on their content (remember the " ")
and gives the remainder of the space to the middle cell -
in spite of the 75 pixel specification!
Now look at the last row. See what happens to the table when I
put a single "a" character in the second cell? It's deja
vu all over again!
Friends, this is why people hate tables and
why they get frustrated trying to drag cell borders and set cell
widths and heights. The bottom line is - just say no to all
of these attempts to control your tables. If you need a cell to
be a certain width, shim it with a transparent GIF. Watch what happens
to the table above when I add a second row and put 100 pixel wide
and 1 pixel tall shims in each cell in this second row -
See how the columns are now evenly spaced again? Also, see how
the second row containing the shims is barely visible (if at all)?
That's because when I put in the shims, DW takes *out* the " "
characters and so the cells collapse around the shims (to make this
second row easily visible, I have made the table's border setting
"1") to make that second row only 1 pixel high. And this
time, it looks the same in both Netscape and Internet Explorer.
By the way, while you are reading this, try resizing your browser
window and note that the tables are unaffected by this - that's
what a fixed width table does.
OK - the message is to shim your tables! Don't depend
on Cell Heights or Widths or text content to hold your Cells at
the right size. If you do, you'll be frustrated by an uncooperative
page and wonky tables!
The Download
A final note - download
this page and look at it in Dreamweaver. You will be able to
see how I did the tables and the fonts, and more importantly, you'll
see that there is no trickery here....
Keep dreamin'!
|