17 Tablesw3 version
|
contents |
properties |
index
| | |||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
table‑layout property
empty-cells property
speak-header property
Tables represent relationships between data. Authors specify these relationships in the document language and specify their presentation in CSS, in two ways: visually and aurally.
Authors may specify the visual formatting of a table as a rectangular grid of cells. Rows and columns of cells may be organized into row groups and column groups. Rows, columns, row groups, row columns, and cells may have borders drawn around them Data may be aligedn vertically or horizontally within a cell and align data in all cells of a row or column.
Authors may also specify the aural rendering of a table; how headers and data will be spoken. In the document language, authors may label cells and groups of cells so that when rendered aurally, cell headers are spoken before cell data. In effect, this "serializes" the table: users browsing the table aurally hear a sequence of headers followed by data.
Here is a simple three-row, three-column table :
<TABLE border=1 bgcolor=linen style=border-style:dashed> <CAPTION>This is a simple 3x3 table with a caption <TR id=first> <TH>Header 1 <TD>Cell 1 <TD>Cell 2 <TR id=row2> <TH>Header 2 <TD>Cell 3 <TD>Cell 4 <TR id=row3> <TH>-x-Header 3 -x-<TD>C 5 <TD>x<br>C 6<br> </TABLE>This code creates
|
|
The header text is centered horizontally and bold :
TH { text-align: center; font-weight: bold }
The next rules align the text header cells on their baseline
and vertically aligns the text in the center of each data cell:
TH { vertical-align: baseline }
TD { vertical-align: middle }
The next rules specify that the top row will be surrounded by a 5px
solid blue border and each of the other rows will have
various borders:
TR#first { border-bottom: 5px solid blue }
TR#row2 { border: 2px dotted red }
TR#row3 { border-bottom: 1px dashed black }
The borders around the rows overlap where the rows meet.
What color (black or blue) and thickness (1px or 3px) will
the border between row1 and row2 be?
See border conflict resolution.
The following rule puts the table caption above the table:
CAPTION { caption-side: top }
The following rule specifies that, when rendered aurally,
each row of data is to be spoken as a "Header, Data, Data":
TH { speak-header: once }
For instance, the first row would be spoken "Header1 Cell1 Cell2".
On the other hand, with the following rule:
TH { speak-header: always }
it would be spoken "Header1 Cell1 Header1 Cell2".
We discuss the various table elements in the following section. In this specification, the term table element refers to any element involved in the creation of a table. An |table element::internal">"internal" table element is one that produces a row, row group, column, column group, or cell.
The structure of a table closely parallels the visual layout.
A table consists of an optional caption and rows of cells and is "row primary"
since authors specify rows, not columns, explicitly.
Columns are derived once all the rows have been specified.
The first cell of each row belongs to the first column, the second to
the second column, etc.).
Rows and columns may be grouped structurally
and this grouping reflected in presentation (e.g., a border may be drawn around a group of rows).
Table model : captions, rows, row groups, columns, column groups, and cells.
TABLE
TR
Specifies that an element is a row of cells.
THEAD
displayed before all other rows and rowgroups
and after any top captions.
Print user agents may repeat footer rows on each page spanned by a table.
TFOOT
always displayed after all other rows and rowgroups and before any
bottom captions.
Print user agents may repeat footer rows on each page spanned by a table.
COL
Specifies that an element describes a column of cells.
COLGROUP
Specifies that an element groups one or more columns.
TD, TH
Specify that an element represents a table cell.
CAPTION
Specifies a caption for the table.
Elements with display set
to table‑column or table‑column-group are not rendered (as
if they had display: none), but they are useful, because they may
have attributes which induce a certain style for the columns they represent.
The default style sheet for HTML 4.0 in the appendix illustrates the use of these values for HTML 4.0:
TABLE { display: table }
TR { display: table‑row }
THEAD { display: table‑header-group }
TBODY { display: table‑row‑group }
TFOOT { display: table‑footer-group }
COL { display: table‑column }
COLGROUP { display: table‑column-group }
TD, TH { display: table‑cell }
CAPTION { display: table‑caption }
User agents may ignore these display property values for HTML
documents, since authors should not alter an elements expected behavior.
HTML user agents are not required to create anonymous
Table cells may belong to two contexts: rows and columns.
In the source document cells are descendants of rows, never of columns.
A very few aspects of cells can be influenced by setting properties on columns.
ONLY the following properties apply to column and column-group elements:
border
border-collapse is set to
collapse on the table element. In that case, borders set on columns and
column groups are input to the conflict resolution algorithm
that selects the border styles at every cell edge.
background
width
visibility
collapse, none of the cells in the column are rendered, cells that span into other
columns are clipped; the width of the table is diminished
by the width the column would have taken up. See Dynamic effects. visibility have no effect.
COL { border-style: none solid }
TABLE { border-style: hidden }
This rule makes <col class=totals> column blue,
COL.totals { background: lightblue }
These rules shows how to make a column a fixed size
using the fixed layout algorithm.
TABLE { table‑layout: fixed }
COL.totals { width: 50em }
<table border=1 cellpadding=2 cellspacing=0> <col class=quan ><col class=desc><col class=each><col class=totals><col class=bo> <tr><td>quan <td>description <td>each <td>extension <td>back ordered(only the extension column should be 10em wide)
quan description each extension
1234567890back ordered 1 screws $1 $1 0 1 nails $2 1
In terms of the visual formatting model, a table may behave like a block-level or replaced inline-level element. Tables have content, padding, borders, and margins.
In both cases, the table element generates an anonymous box that contains the table box itself and the captions box (if present). The table and caption boxes retain their own content, padding, margin, and border areas, and the dimensions of the rectangular anonymous box are the smallest required to contain both. Vertical margins collapse where the table box and caption box touch. Any repositioning of the table must move the entire anonymous box, not just the table box, so that the caption follows the table.
Diagram of a table with a caption above it; the bottom margin of the caption is collapsed with the top margin of the table.
caption-side
| Value: | top | bottom | left | right | inheritInitial: top
Applies to: table‑caption elements; Inherited
|
specifies the position of the caption box with respect to the table box.
top Positions the caption box above the table box.
bottom below
left
right
Captions above or below a table element are formatted as
if they were a block element before or after the table, except that they
run-in element that may precede the table.
A caption that is above or below a table box also behaves like a block box for width calculations; the width is computed with respect to the width of the table boxs containing block.
For a caption that is on the left or right side of a table box, on
the other hand, a value other than auto for width sets the width explicitly, but
auto tells the user agent to chose a "reasonable width". This may
vary between "the narrowest possible box" to "a single line", so we
recommend that users do not specify auto for left and right caption
widths.
To align caption content horizontally within the caption box, use
the text-align
property. For vertical alignment of a left or right caption box with
respect to the table box, use the vertical-align property. The
only meaningful values in this case are top, middle, and
bottom. All other values are treated the same as top.
In this example, the caption-side property places
captions below tables. The caption will be as wide as the parent of
the table, and caption text will be left-justified.
CAPTION { caption-side: bottom; width: auto; text-align: left }
The following example shows how to put a caption in the left
margin. The table itself is centered, by setting its left and right
margins to auto, and the whole box with table and caption is shifted
into the left margin by the same amount as the width of the caption.
BODY { margin-left: 8em }
TABLE { margin-left: auto; margin-right: auto }
CAPTION { caption-side: left; margin-left: -8em; width: 8em; text-align: right; vertical-align: bottom }
Assuming the width of the table is less than the available width, the formatting will be similar to this:
Diagram
showing a centered table with the caption extending into the left
margin, as a result of a negative margin-left property.
Like other elements of the document language, internal table elements generate rectangular boxes with content, padding, and borders. They do not have margins, however.
The visual layout of these boxes is governed by a rectangular, irregular grid of rows and columns. Each box occupies a whole number of grid cells, determined according to the following rules. These rules do not apply to HTML 4.0 or earlier HTML versions; HTML imposes its own limitations on row and column spans.
direction
property of the table.
direction property of
the table is ltr; if the direction is rtl, interchange
"left" and "right" in the previous sentence.)
Note.
Table cells may be relatively and absolutely positioned, but
this is not recommended: positioning and floating remove a box
from the flow, affecting table alignment.
Here are two examples. The first is assumed to occur in an HTML document:
<TABLE> <TR><TD>1 <TD rowspan="2">2 <TD>3 <TD>4 <TR><TD colspan="2">5 </TABLE>
<TABLE> <ROW><CELL>1 <CELL rowspan="2">2 <CELL>3 <CELL>4 <ROW><CELL colspan="2">5 </TABLE>
The second table is formatted as in the figure on the right. However, the HTML tables rendering is explicitly undefined by HTML, and CSS doesnt try to define it. User agents are free to render it, e.g., as in the figure on the left.
On the left, one possible rendering of an erroneous HTML 4.0 table; on the right, the only possible formatting of a similar, non-HTML table.
Schema of table layers.
The lowest layer is a single plane, representing the table box itself. Like all boxes, it may be transparent.
The next layer contains the column groups. The columns groups are as tall as the table, but they need not cover the whole table horizontally.
On top of the column groups are the areas representing the column boxes. Like column groups, columns are as tall as the table, but need not cover the whole table horizontally.
The next to last layer contains the rows. The rows also cover the whole table.
The topmost layer contains the cells themselves. As the figure shows, although all rows contain the same number of cells, not every cell may have specified content. These "empty" cells are transparent, letting lower layers shine through.
In the following example, the first row contains four cells, but the second row contains no cells, and thus the table background shines through, except where a cell from the first row spans into this row. The following HTML code and style rules
<STYLE type="text/css">
TABLE { background: yellow; border-collapse: collapse }
TD { background: red; border: double black }
</STYLE>
<TABLE>
<TR><TD> 1 <TD rowspan=2> 2 <TD> 3 <TD> 4 </TR>
<TR><TD></TD></TR>
</TABLE>
|
|
Table with three empty cells in the bottom row.
table-layout propertytable-layout property controls the algorithm used to lay out the table cells, rows, and columns.
table-layout:
auto | fixed | inheritauto;
Applies to: table and inline-table elements; NOT Inherited;
Media: visual
The tables width may be specified explicitly with the
width property,
auto (for both display: table and display: inline-table) means use the automatic table layout algorithm.
In the fixed table layout algorithm, the width of each column is determined as follows:
auto for the
width property sets the width
for that column.
auto
for the width property sets the
width for that column. If the cell spans more than one column, the
width is divided over the columns.
The width of the table is then the greater of the
value of the width property
for the table element and the sum of the column widths (plus
cell spacing or borders). If the table is wider than the columns,
the extra space should be distributed over the columns.
The user agent can begin to lay out the table once
the entire first row has been received. Cells in subsequent rows do
not affect column widths. Any cell that has content that overflows
uses the overflow property to
determine whether to clip the overflow content.
table‑layout is auto; they
can use any other algorithm.
Column widths are determined as follows:
width (W) of the cell
is greater than MCW, W is the minimum cell width. A value
of auto means that MCW is the minimum cell width.
Also, calculate the "maximum" cell width of each cell: formatting then content without breaking lines other than where explicit line breaks occur.
width, whichever is larger). The
maximum is that required by the cell with the largest maximum cell
width (or the column width,
whichever is larger).
This gives a maximum and minimum width for each column. Column widths influence the final table width as follows:
table or inline-table elements width property has a specified value (W)
other than auto, the propertys computed value is the greater of W
and the minimum width required by all the columns plus cell
spacing or borders (MIN). If W is greater than MIN, the extra width should be
distributed over the columns.
table or inline-table element has width: auto, the
computed table width is the greater of the tables containing block
width and MIN. However, if the maximum width required by the columns
plus cell spacing or borders (MAX)
is less than that of the containing block, use MAX.
A percentage value for a column width is relative to the table
width. If the table has width: auto, a percentage represents a
constraint on the columns width, which a UA should try to
satisfy. (Obviously, this is not always possible: if the columns
width is 110%, the constraint cannot be satisfied.)
Note. In this algorithm, rows (and row
groups) and columns (and column groups) both constrain and are
constrained by the dimensions of the cells they contain. Setting the
width of a column may indirectly influence the height of a row, and
vice versa.
height property for the table or
inline-table element. A value of auto means that the height is the
sum of the row heights plus any cell spacing or borders. Any other
value specifies the height explicitly; the table may thus be taller or
shorter than the height of its rows. CSS2 does not specify rendering
when the specified table height differs from the content height, in
particular whether content height should override specified height; if
it doesnt, how extra space should be distributed among rows that add
up to less than the specified table height; or, if the content height
exceeds the specified table height, whether the UA should provide a
scrolling mechanism. Note. Future versions of CSS
may specify this further.
The height of a table‑row elements box is calculated once the
user agent has all the cells in the row available: it is the maximum
of the rows specified height
and the minimum height (MIN) required by the cells. A height value of auto for a
table‑row means the computed row height is MIN. MIN depends on cell
box heights and cell box alignment (much like the calculation of a line box height). CSS2 does not
define what percentage values of height refer to when specified for
table rows and row groups.
In CSS2, the height of a cell box is the maximum of the table
cells height property and the
minimum height required by the content (MIN). A value of auto for
height implies a computed value
of MIN. CSS2 does not define what percentage values of height refer to when specified for
table cells.
CSS2 does not specify how cells that span more than row affect row height calculations except that the sum of the row heights involved must be great enough to encompass the cell spanning the rows.
The vertical-align
property of each table cell determines its alignment within the row.
Each cells content has a baseline, a top, a middle, and a bottom, as
does the row itself. In the context of tables, values for vertical-align have the
following meanings:
baselinetopbottommiddlesub, super, text-top, text-bottomThe baseline of a cell is the baseline of the first line box in the cell. If there is no text, the baseline is the baseline of whatever object is displayed in the cell, or, if it has none, the bottom of the cell box. The maximum distance between the top of the cell box and the baseline over all cells that have vertical-align: baseline is used to set the baseline of the row. Here is an example:
Diagram showing the effect of
various values of vertical-align on table cells.
Cell boxes 1 and 2 are aligned at their baselines. Cell box 2 has the largest height above the baseline, so that determines the baseline of the row. Note that if there is no cell box aligned at its baseline, the row will not have (nor need) a baseline.
To avoid ambiguous situations, the alignment of cells proceeds in the following order:
vertical-align: top are positioned.
Cell boxes that are smaller than the height of the row receive extra top or bottom padding.
text-align property.
When the text-align
property for more than one cell in a column is set to a <string> value, the
content of those cells is aligned along a vertical axis. The beginning
of the string touches this axis. Character directionality determines
whether the string lies to the left or right of the axis.
Aligning text in this way is only useful if the text fits on one line. The result is undefined if the cell content spans more than one line.
If value of text-align
for a table cell is a string but the string doesnt occur in the cell
content, the end of the cells content touches the vertical axis of
alignment.
Note that the strings do not have to be the same for each cell, although they usually are.
CSS does not provide a way specify the offset of the vertical alignment axis with respect to the edge of a column box.
The following style sheet will cause the column of dollar figures in the following HTML table to align along the decimal point. we have used the :before pseudo-element to insert a dollar sign before each figure.
TD { text-align: "." }
TD:before { content: "$" }
<TABLE border=1> <COL width="200"> <TR> <TH>Long distance calls <TR> <TD> 1.30 <TR> <TD> 2.50 <TR> <TD> 10.80 <TR> <TD> 111.01 <TR> <TD> 85. <TR> <TD> 90 <TR> <TD> .05 <TR> <TD> .06 </TABLE> |
generated via code shown
|
generated using <PRE> and EXPLICIT $
|
visibility property
takes the value collapse for row, row group, column, and column
group elements. This value causes the entire row or column to be
removed from the display, and the space normally taken up by the row
or column to be made available for other content. The suppression of
the row or column, however, does not otherwise affect the layout of
the table. This allows dynamic effects to remove table rows or columns
without forcing a re-layout of the table in order to account for the
potential change in column constraints.
border-collapse:
collapse | separate | inherit
Initial:collapse; Applies to: table and inline-table elements;
Inherited;
Media:visual
Borders are centered on the grid lines between the cells.
The width of the table, the widths of the borders, the padding, and the cell width interact. Their relation is holds for every row of the table:
row-width =
(0.5 * border-width0) + padding-left1 + width1 + padding-right1 + border-width1 + padding-left2 +...+ padding-rightn + (0.5 * border-widthn)
n is the number of cells in the row, and border-widthi refers to the border
between cells i and i + 1.
only half of the two exterior borders are counted in the table width;
the other half of these two borders lies in the margin area.
Schema showing the widths of cells and borders and the padding of cells.
in collapsing border, the width of the table includes half the table border and
the table doesnt have padding (but does have margins).
The following rules determine which border style "wins" in case of a conflict:
border-style of hidden
take precedence over all other conflicting borders. Any border
with this value suppresses all borders at this location.
none have the lowest priority. Only if
the border properties of all the elements meeting at this edge are
none will the border be omitted (none is the default value for the border style.)
hidden and at least one of them is not
none, then narrow borders are discarded in favor of wider ones. If
several have the same
border-width than styles are
preferred in this order: double, solid, dashed, dotted,
ridge, outset, groove, and the lowest: inset.
The following example illustrates the application of these precedence rules. This style sheet:
TABLE { border-collapse: collapse;
border: 5px solid yellow; }
*#col1 { border: 3px solid black; }
TD { border: 1px solid red; padding: 1em; }
TD.solid-blue { border: 5px dashed blue; }
TD.solid-green { border: 5px solid green; }
with this HTML source:
<TABLE>
<COL id="col1"><COL id="col2"><COL id="col3">
<TR id="row1"> <TD> 1 <TD> 2 <TD> 3
<TR id="row2"> <TD> 4
<TD class="solid-blue"> 5
<TD class="solid-green"> 6
<TR id="row3"> <TD> 7 <TD> 8 <TD> 9
<TR id="row4"> <TD> 10 <TD> 11 <TD> 12
<TR id="row5"> <TD> 13 <TD> 14 <TD> 15
</TABLE>
|
would produce something like this: |
|
An example of a table with collapsed borders.
The next example shows a table with horizontal rules between the
rows. The top border of the table is set to hidden to suppress the
top border of the first row. This implements the "rules"
attribute of HTML 4.0 (rules="rows").
TABLE[rules=rows] TR { border-top: solid }
TABLE[rules=rows] { border-collapse: collapse;
border-top: hidden }
Table with horizontal rules between the rows.
In this case the same effect can also be achieved without setting a hidden border on TABLE, by addressing the first row separately. Which method is preferred is a matter of taste.
TR:first-child { border-top: none }
TR { border-top: solid }
Here is another example of hidden collapsing borders:
Table with two omitted internal borders.
HTML source:
<TABLE style="border-collapse: collapse; border: solid;">
<TR><TD style="border-right: hidden; border-bottom: hidden">foo</TD>
<TD style="border: solid">bar</TD></TR>
<TR><TD style="border: none">foo</TD>
<TD style="border: solid">bar</TD></TR>
</TABLE>
border-spacing:
<length>
<vlength>?
|
inherit0
Applies to: distance that separates adjacent cell borders.
If one length is specified, it gives both the horizontal and vertical spacing.
If two are specified, the first gives the horizontal spacing and the second the vertical spacing.
Lengths may not be negative.
In this model, each cell has an individual border. The
border-spacing property
specifies the distance between the borders of adjacent cells. This
space is filled with the background of the table element. Rows,
columns, row groups, and column groups cannot have borders (i.e., user
agents must ignore the border properties for
those elements).
TABLE.bo { border: outset 10pt; border-collapse: separate; border-spacing: 15pt ;border-color:blue}
TD.bo { border: inset 5pt }
TD.bospecial { border: inset 10pt ; border-color:pink} /* The top-left cell */
<table class=bo>
<tr><td class=bospecial> 1,1 <td class=bo> 1,2 <td class=bo> 1,3
<tr><td class=bo> 2,1 <td class=bo> 2,2 <td class=bo> 2,3
</table>
generated |
imagewithout color specdifications andwithout cell row,col numbering |
A table with border-spacing set to a length value.
Each cell has its own border, and the table has a separate border as well.
empty-cells: show | hide | inheritIn the separated borders model, this property controls the
rendering of borders around cells that have no visible content. Empty
cells and cells with the visibility property set to
hidden are considered to have no visible content.
Visible content includes " " (x'A0') and other whitespace
?
except: ASCII CR (x'0D'), LF (x'0A'), tab (x'09'), and space (x'20').
show : borders are drawn around empty cells (like normal cells).
hide : no borders are drawn around empty cells.
If all the cells in a row have a value of hide and have no visible content, the entire
row behaves as if it had display: none.
TABLE { empty-cells: show } should cause borders to be drawn around all cells:
show
| hide
|
|---|
border-style have
different meanings in tables than for other elements. In the list
below they are marked with an asterisk.
none
| No border. |
*hidden
| Same as none, but in the collapsing
border model, also inhibits any other border
(see border conflicts).
|
dotted
| dots |
dashed
| short lines |
solid
| single line |
double
| two solid lines. The sum of the width of the lines and the
space between is the value of border-width.
|
groove
| looks as though it were carved into the canvas. |
ridge
| looks as though it were coming out of the canvas. |
*inset
| In the separated borders model,
the border makes the entire box look as though
it were embedded in the canvas. In the collapsing border model, same as groove.
|
*outset
| In the separated borders model,
the border makes the entire box look as though
it were coming out of the canvas. In the collapsing border model, same as ridge.
|
When a table is spoken by a speech generator, the relation between the data cells and the header cells must be expressed in a different way than by horizontal and vertical alignment. Some speech browsers may allow a user to move around in the 2-dimensional space, thus giving them the opportunity to map out the spatially represented relations. When that is not possible, the style sheet must specify at which points the headers are spoken.
speak-header propertyspeak-header
| Value: | once | always | inherit Initial:once; Applies to:elements that have table header information Inherited; Media:aural |
This property specifies whether table headers are spoken before every cell, or only before a cell when that cell is associated with a different header than the previous cell. Values have the following meanings:
once
always
Each document language may have different mechanisms that allow authors to specify headers. For example, in HTML 4.0 ([HTML40]), it is possible to specify header information with three different attributes ("headers", "scope", and "axis"), and the specification gives an algorithm for determining header information when these attributes have not been specified.
>
Image of a table with header cells ("San Jose" and "Seattle") that are not in the same column or row as the data they apply to.
This HTML example presents the money spent on meals, hotels and transport in two locations (San Jose and Seattle) for successive days. Conceptually, you can think of the table in terms of a n-dimensional space. The headers of this space are: location, day, category and subtotal. Some cells define marks along an axis while others give money spent at points within this space. The markup for this table is:
<TABLE> <CAPTION>Travel Expense Report</CAPTION>
| <TR> <TH> <TH> | Meals <TH>Hotels <TH>Transport <TH> | subtotal | |||||||||||||||
| <TR> <TH id="san-jose" axis="san-jose"> | San Jose
| <TR> <TH headers="san-jose"> | 25-Aug-97 <TD>37.74 <TD>112.00 <TD>45.00 <TD>
| <TR> <TH headers="san-jose"> | 26-Aug-97 <TD>27.28 <TD>112.00 <TD>45.00 <TD>
| <TR> <TH headers="san-jose"> | subtotal <TD>65.02 <TD>224.00 <TD>90.00 <TD>379.02
| <TR> <TH id="seattle" axis="seattle"> | Seattle
| <TR> <TH headers="seattle"> | 27-Aug-97 <TD>96.25 <TD>109.00 <TD>36.00 <TD>
| <TR> <TH headers="seattle"> | 28-Aug-97 <TD>35.00 <TD>109.00 <TD>36.00 <TD>
| <TR> <TH headers="seattle"> | subtotal <TD>131.25 <TD>218.00 <TD>72.00 <TD>421.25
| <TR> <TH> | Totals <TD>196.27 <TD>442.00 <TD>162.00 <TD>800.27
| |
By providing the data model in this way, authors make it possible for speech enabled-browsers to explore the table in rich ways, e.g., each cell could be spoken as a list, repeating the applicable headers before each data cell:
San Jose, 25-Aug-97, Meals: 37.74 San Jose, 25-Aug-97, Hotels: 112.00 San Jose, 25-Aug-97, Transport: 45.00 ...
The browser could also speak the headers only when they change:
San Jose, 25-Aug-97, Meals: 37.74 Hotels: 112.00 Transport: 45.00 26-Aug-97, Meals: 27.28 Hotels: 112.00 ...