公司 | 雇員 | 成立于 |
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
用CSS稍微修飾一下表格,你可以使表頭在圖形化瀏覽器里面更加明顯:
公司 | 雇員 | 成立于 |
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
一個(gè)視力正常的人,很容易并且很快就可以明白表頭和數(shù)據(jù)單元格之間的關(guān)系。從另一方面講,那些使用屏幕閱讀器的人可以聽到如下順序的詞:公司,雇員,成立于,ACME Inc,1000,1947,XYZ Corp,2000,1973
。不是十分容易明白其中的關(guān)系。
第一步——最簡(jiǎn)單的——通過適當(dāng)?shù)臉?biāo)出表頭來使得表格更加有意義。很簡(jiǎn)單:只要使用th>
標(biāo)簽取代表頭的td>
標(biāo)簽即可。
table>
tr>
th>公司/th>
th>雇員/th>
th>成立于/th>
/tr>
tr>
td>ACME Inc/td>
td>1000/td>
td>1947/td>
/tr>
tr>
td>XYZ Corp/td>
td>2000/td>
td>1973/td>
/tr>
/table>
公司 | 雇員 | 成立于 |
---|---|---|
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
這個(gè)例子雖然簡(jiǎn)單,但是已經(jīng)包含了足夠的信息使得屏幕閱讀器能夠讓使用者明白表頭和數(shù)據(jù)單元格之間的關(guān)系。一個(gè)屏幕閱讀器一般會(huì)這么讀:公司: ACME Inc. ,雇員: 1000,成立于: 1947.
, 以此類推。比之前好多了。
表格標(biāo)題, caption>
caption>
標(biāo)簽可以為表格提供一個(gè)簡(jiǎn)短的說明,和圖像的說明比較類似。默認(rèn)情況下,大部分可視化瀏覽器顯示表格標(biāo)題在表格的上方中央。CSS里的caption-side屬性用來控制表格標(biāo)題顯示的地方。大部分瀏覽器只能把表格標(biāo)題顯示在表格的上方或者下方,只有一些瀏覽器支持左邊或者右邊。這個(gè)就留給大家去試試了。
使用的時(shí)候,caption>
標(biāo)簽一定要緊接著開始的table>
標(biāo)簽寫,如下:
table>
caption>Table 1: Company data/caption>
tr>
th>Company/th>
th>Employees/th>
th>Founded/th>
/tr>
tr>
td>ACME Inc/td>
td>1000/td>
td>1947/td>
/tr>
tr>
td>XYZ Corp/td>
td>2000/td>
td>1973/td>
/tr>
/table>
Company | Employees | Founded |
---|---|---|
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
當(dāng)然你也可以用CSS去樣式化表格標(biāo)題。然而,要在不同瀏覽器里獲得同樣的效果還需要一定的技巧,這個(gè)也留給各位去實(shí)踐了。
表格釋義:summary
屬性
一般人可以很容易的決定是否研究一下表格的細(xì)節(jié),只要瞥一眼就可以看出表格有多大、大概有什么內(nèi)容。但是使用屏幕閱讀器的人就不是那么容易了,除非我們給表格加上summary
屬性。這樣可以提供比caption>
標(biāo)簽更詳細(xì)的描述。
sumary屬性的內(nèi)容不會(huì)被可視化瀏覽器顯示,所以可以盡可能的讓描述足夠長(zhǎng),使得那些用“聽”的瀏覽者了解表格的內(nèi)容。當(dāng)然也不要用過頭了,當(dāng)有需要的時(shí)候才加上summary屬性,比如對(duì)于很復(fù)雜的表格,添加一個(gè)summary屬性可以使用屏幕閱讀器人比較簡(jiǎn)單的了解表格的內(nèi)容。
table summary="The number of employees and the foundation year of some imaginary companies.">
caption>Table 1: Company data/caption>
tr>
th>Company/th>
th>Employees/th>
th>Founded/th>
/tr>
tr>
td>ACME Inc/td>
td>1000/td>
td>1947/td>
/tr>
tr>
td>XYZ Corp/td>
td>2000/td>
td>1973/td>
/tr>
/table>
縮寫表頭:abbr
屬性
當(dāng)屏幕閱讀器遇到一個(gè)表格,每一行會(huì)把表頭連每一個(gè)數(shù)據(jù)單元格一起讀出來。如果表頭很長(zhǎng),聽一遍一遍的讀是十分乏味的。通過使用abbr
屬性,可以給那些長(zhǎng)的表頭提供簡(jiǎn)寫形式,取代表頭的內(nèi)容。abbr
屬性是可選的,大部分情況表頭還是(或許是應(yīng)該)比較簡(jiǎn)短的。
稍微修改一下剛才的表格,讓表頭更長(zhǎng)些,abbr
屬性就可以這樣用:
table summary="The number of employees and the foundation year of some imaginary companies.">
caption>Table 1: Company data/caption>
tr>
th abbr="Company">Company Name/th>
th abbr="Employees">Number of Employees/th>
th abbr="Founded">Foundation Year/th>
/tr>
tr>
td>ACME Inc/td>
td>1000/td>
td>1947/td>
/tr>
tr>
td>XYZ Corp/td>
td>2000/td>
td>1973/td>
/tr>
/table>
Company Name | Number of Employees | Foundation Year |
---|---|---|
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
對(duì)于第一行數(shù)據(jù),屏幕閱讀器會(huì)讀表頭的全稱,而從第二行開始即使用簡(jiǎn)稱。
這樣讓數(shù)據(jù)表格適應(yīng)布局是挺困難的,而以下的做法更為常見:即讓表頭盡可能的短,或者簡(jiǎn)寫,使用title
屬性或者abbr>
標(biāo)簽提供一個(gè)更長(zhǎng)的說明。
把表頭和數(shù)據(jù)聯(lián)系起來:scope
,id
,headers
屬性
就我用到現(xiàn)在,很多表格要比上面提供的例子復(fù)雜的多。讓例子復(fù)雜一點(diǎn),我會(huì)移去“Company”表頭,并且把第一列的數(shù)據(jù)移到表頭單元格里:
table summary="The number of employees and the foundation year of some imaginary companies.">
caption>Table 1: Company data/caption>
tr>
td>/td>
th>Employees/th>
th>Founded/th>
/tr>
tr>
th>ACME Inc/th>
td>1000/td>
td>1947/td>
/tr>
tr>
th>XYZ Corp/th>
td>2000/td>
td>1973/td>
/tr>
/table>
Employees | Founded | |
---|---|---|
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
在這個(gè)表格里,每一個(gè)數(shù)據(jù)單元格都有兩個(gè)表頭。最簡(jiǎn)單的方法讓那些非可視的瀏覽器理解這個(gè)表格,就是為每個(gè)表頭添加一個(gè)scope
屬性。
table summary="The number of employees and the foundation year of some imaginary companies.">
caption>Table 1: Company data/caption>
tr>
td>/td>
th scope="col">Employees/th>
th scope="col">Founded/th>
/tr>
tr>
th scope="row">ACME Inc/th>
td>1000/td>
td>1947/td>
/tr>
tr>
th scope="row">XYZ Corp/th>
td>2000/td>
td>1973/td>
/tr>
/table>
Scope屬性同時(shí)定義了行的表頭和列的表頭:
col
: 列表頭
row
: 行表頭 在第一行的
col
的scope
屬性,聲明他們是下面數(shù)據(jù)單元格的表頭。同樣的,給每行的開頭th>
加上值為row
的scope
屬性聲明他們是右邊數(shù)據(jù)單元格的表頭。
Scope
屬性還有兩個(gè)值:
colgroup
: 定義列組(column group)的表頭信息
rowgroup
: 定義行組(row group)的表頭信息 一個(gè)列組是由colgroup>
標(biāo)簽定義的。行組則是由thead>
、tfoot>
和tbody>
定義的。稍后我將會(huì)詳細(xì)介紹它們。
如果你既想要保留“Company”表頭,而又想讓公司名字作為行表頭(row headers)顯示,你會(huì)怎么做?那樣的話,應(yīng)該使得包含公司名字的單元格同時(shí)提供表頭和數(shù)據(jù)信息。也就是說,td>
標(biāo)簽也應(yīng)該加上scope
屬性:
table summary="The number of employees and the foundation year of some imaginary companies.">
caption>Table 1: Company data/caption>
tr>
th scope="col">Company/th>
th scope="col">Employees/th>
th scope="col">Founded/th>
/tr>
tr>
td scope="row">ACME Inc/td>
td>1000/td>
td>1947/td>
/tr>
tr>
td scope="row">XYZ Corp/td>
td>2000/td>
td>1973/td>
/tr>
/table>
這樣的話可視化瀏覽器不會(huì)默認(rèn)的把company name顯示為表頭。所以需要用CSS來修正一下,就剛才那個(gè)例子,我使用了下面的CSS:
td[scope] {
font-weight:bold;
}
要注意上面的規(guī)則使用了屬性選擇符,IE是不支持的。而通過添加一個(gè)class來樣式化表頭是個(gè)不錯(cuò)的辦法。
Company | Employees | Founded |
---|---|---|
ACME Inc | 1000 | 1947 |
XYZ Corp | 2000 | 1973 |
另一個(gè)連接表格數(shù)據(jù)單元格和表頭的方法就是給每一個(gè)表頭添加一個(gè)唯一的ID
。然后為下面的數(shù)據(jù)單元格添加headers
屬性,這個(gè)headers
屬性值包含用空格分開的各個(gè)ID
,這些ID
代表的表頭各自關(guān)聯(lián)到該數(shù)據(jù)單元格上。這樣做很復(fù)雜,只是當(dāng)有超過兩個(gè)表頭的單元格才用。在復(fù)雜的和不規(guī)則的表格中,scope
屬性就力不從心了。
為了演示,我修改了一下表格,加上了公司雇員性別及人數(shù):
table class="extbl" summary="The number of employees and the foundation year of some imaginary companies.">
caption>Table 1: Company data/caption>
tr>
td rowspan="2">/td>
th id="employees" colspan="2">Employees/th>
th id="founded" rowspan="2">Founded/th>
/tr>
tr>
th id="men">Men/th>
th id="women">Women/th>
/tr>
tr>
th id="acme">ACME Inc/th>
td headers="acme employees men">700/td>
td headers="acme employees women">300/td>
td headers="acme founded">1947/td>
/tr>
tr>
th id="xyz">XYZ Corp/th>
td headers="xyz employees men">1200/td>
td headers="xyz employees women">800/td>
td headers="xyz founded">1973/td>
/tr>
/table>
Employees | Founded | ||
---|---|---|---|
Men | Women | ||
ACME Inc | 700 | 300 | 1947 |
XYZ Corp | 1200 | 800 | 1973 |
你可以發(fā)現(xiàn),這種方法真的很麻煩,所以如果可能的話,還是盡量用scope
屬性吧。
跨行和跨列
在以前用表格布局的年代,rowspan
屬性和colspan
屬性常被用來讓單元格跨幾列或跨幾行,來布局那些經(jīng)過整齊切割的圖像。這兩個(gè)屬性現(xiàn)在還在用, 因?yàn)椴]有CSS來控制單元格的跨行和跨列。仔細(xì)想想,其實(shí)是很有道理的:跨行和跨列示表格結(jié)構(gòu)(structure)的一部分,而不是其表現(xiàn)(presentation)。
列和列組:col>
和colgroup>
HTML提供了colgroup>
和col>
標(biāo)簽來為相關(guān)的表格列分組。這樣就可以(在一些瀏覽器中)使用CSS來單獨(dú)的為列樣式化。列組也可以使用scope
屬性來標(biāo)明其表頭信息。
這就是我要說的關(guān)于列和列組的全部。更多信息參考“其他”部分。
行組: thead>
, tfoot>
, 和tbody>
表格的行可以分組為表頭組(thead>
), 表尾(或表注)組(tfoot>
), 然后是一個(gè)或多個(gè)表身(tbody>
) 。每一個(gè)行組必須包含一個(gè)或多個(gè)表格行。
如果一個(gè)表格包含thead>
,那么它必須出現(xiàn)在tfoot>
和tbody>
之前。而tfoot>
則必須出現(xiàn)在tbody>
之前。如果沒有使用thead>
和tfoot>
,那么tbody>
標(biāo)簽也可以不加(也不是非得不加,隨你喜歡了)。一個(gè)有行組的表格結(jié)構(gòu)看起來如下:
table>
thead>
tr>/tr>
… 更多表頭的行
/thead>
tfoot>
tr>/tr>
… 更多表尾的行
/tfoot>
tbody>
tr>/tr>
… 第一個(gè)tbody>的行
/tbody>
tbody>
tr>/tr>
… 第二個(gè)tbody>的行
/tbody>
… 更多的tbody>
/table>
使用行組有以下幾個(gè)原因:
僅為數(shù)據(jù)表格而寫
本文所寫的所有都是關(guān)于使用HTML表格來組織和表現(xiàn)數(shù)據(jù)。如果你還是想用表格來布局,那么上文所述的都沒有意義而且用不到。沒有summary屬性、沒有表頭、沒有caption>
、什么都沒有,沒有格式,陳舊的布局表格除了table>
,tr>
,td>
什么都可以不要。另外還要承擔(dān)風(fēng)險(xiǎn),即如何面對(duì)那些非可視的用戶代理(UA)。
優(yōu)勢(shì)
看來要用HTML做一個(gè)有語義化的數(shù)據(jù)表格有很多工作。對(duì)于復(fù)雜的表格是這樣的。有時(shí)候基本上是不可能手工寫出來的。但是對(duì)于簡(jiǎn)單的表格,那么使用一個(gè)th>
加上scope
屬性就可以了,又快又簡(jiǎn)單。
非常明顯,語義化的表格對(duì)于使用屏幕閱讀器或其他輔助技術(shù)的瀏覽者非常有好處。讓那些巨大而復(fù)雜的表格“聽”起來很有意義是非常困難的,所以盡可能的使表格簡(jiǎn)單。
另外對(duì)于使用可視化瀏覽器的設(shè)計(jì)者和用戶也是有好處的:一個(gè)語義化的表格有大量的接口可以利用CSS來樣式化,好的樣式可以讓表格更加易用。
其他
除了本文,還有更多關(guān)于數(shù)據(jù)表格內(nèi)容。比如這里就沒有提到axis
屬性,并且對(duì)于colgroup>
和col>
的描述也不是很深。對(duì)于格式化和樣式化還有border
模型我也沒有深究,還缺少一個(gè)真正復(fù)雜的表格的例子。
想了解更多信息,可以參考以下文章:
標(biāo)簽:陽(yáng)泉 鹽城 衢州 寧夏 來賓 云南 晉中 北海
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《標(biāo)準(zhǔn)化——表格》,本文關(guān)鍵詞 標(biāo)準(zhǔn)化,表格,標(biāo)準(zhǔn)化,表格,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。