制作产品对照表时,常会遇到这样的单元格:数据缺失、尚未确认,或者该规格根本不适用于这件产品。本文介绍一些实用做法,帮助你在标准HTML表格中把这些状态表达清楚,让辅助技术也能正确理解上下文,而不是只依赖视觉提示。

先搭好对照表的结构

以下是一个用于说明的假设场景,并非真实存在的商品目录。一张台灯对照表有三行产品,规格包括灯罩直径、可调光范围、色温和灯泡瓦数。起草者先勾出各列:产品、灯罩直径、调光范围、色温、灯泡瓦数。其中两列会成为问题:调光范围只对可调光的那一款有意义,而灯泡瓦数可能要等供应商回复才能确定。第三列色温在两盏灯上已经确定,第三盏则仍待补。

三个列标题备选可以说明这种关系。备选甲用“调光范围”,并在不可调光的那一行放一个连接号。备选乙把标题写成“调光(如适用)”,让单元格留空。备选丙把该列拆成“调光类型”和“调光范围”两列。备选甲把不适用当作缺失数据来处理;备选乙在表头里做了提示,却让读者对单元格本身仍然只能猜;备选丙把“有没有调光”与“数值范围是多少”分开,代价是多一列、每行更密。这些备选都没有回答:对习惯扫读数值而不是细读表头的读者来说,哪一种更合适。

面对缺失数据,起草者为其中一行的灯泡瓦数单元格写下“待供应商提供”,随后又怀疑这个说法在多行重复时是否过于冗长。用一个简短标记再加一条图例说明可能更清爽,但图例既要解释标记,又要解释标签,还不能让人误以为已经知道某个预期数值。起草者还拟了一条脚注:“n/a:本型号不提供该功能”,并检查它究竟只适用于调光这一列,还是以后也会用于其他列。

尚未解决的取舍在于:共用一个连接号无法区分“没有这项功能”和“未能确认”,而分别使用不同标记又需要读者去查含义。起草者暂不决定列标题的写法和标记方案,也记下第三盏灯的色温单元格仍需要填入数值或待定标签,这张表才能算内部一致。

用空白单元格表示缺失数据

MDN记录了table元素及其数据单元格:在一行里,单元格要么是td元素,要么是th元素。它的示例用另一种方式呈现了“不可调光”这一类情形:对于没有取消日期的会员,在“Canceled”单元格中填入“n/a”;其余各行则放置带有实际日期的time元素。该参考还指出,缺失的单元格会被渲染成仿佛那里有一个匿名的table-cell盒子,并且用户代理会裁剪单元格以适配可用的行和列。1

在无障碍方面,MDN建议:在简单情境中,th表头单元格上的scope是冗余的,因为scope可以被推断出来,不过明确写出来可能会改善辅助技术的行为。对于复杂的表格,它建议把内容拆成更小的相关表格,或者改用id和headers把每个单元格与其表头关联起来。1

你可以拿一张灯罩直径单元格为空的表,在输入任何内容之前先决定那里该放什么。从你的来源清单入手:如果该商品根本没有这项规格,单元格可以留空,并在图例中加一条简短说明;如果你还没核实,考虑用一个不同的标记,比如问号,而不是留白。

作演示时,可以起草一张三行的台灯表:一行没有调光功能,一行缺少已确认的灯泡瓦数,还有一行灯罩尺寸已确认。试着把第一个不可调光的单元格填成“n/a”,把瓦数单元格填成“待确认”,灯罩单元格则保留“30 cm”。然后再修改:你也许可以把“待确认”缩成一个符号,并在表下注释里解释一次。这样能让不可调光和未确认这两种情况在视觉上保持区分,同时减少多行中重复的措辞。

你也可以选择把确实不存在的规格留空,只用一个标记专门表示未核实的数据。如何取舍取决于你有多少行,以及读者是否需要一眼分辨这两种情况。把这一选择记录在草稿旁边,以便后续修改保持一致。

标注尚未核实的规格

你可以从自己的对照表中找出一行,例如灯泡瓦数这样的规格尚未确认,然后决定单元格里显示什么。可以考虑把单元格草拟为“未核实”加简短原因,例如“未核实——尚未收到供应商规格”,而不是留下空白,让读者把空白读成“没有这项规格”。这样单元格同时告诉读者什么未知、为什么未知,而一个光秃秃的连接号做不到这一点。

作一次示意性检查,假设一张三行台灯表里有一行没有调光功能,一行灯泡瓦数未确认,一行灯罩直径已确认。你可以在调光单元格写“不适用——不可调光型号”,在瓦数单元格写“未核实——尚未收到规格”,第三格写已确认的尺寸。然后像读者那样把这一列读一遍:两种标记不应看起来可以互换,已确认的值应当作为唯一确定的值突出出来。如果措辞显得沉重,可以考虑用更短的“未核实”加一条按行对应的脚注;选择取决于有多少个单元格带这类标记。

你还可以权衡:当某项规格对某个商品确实不存在时,留空是否可以接受。如果表里有一条图例或简短说明指出空白表示不适用,留空可以成立,但这种含义取决于读者是否注意到图例。如果表只有几行,在单元格里写出标记可能更清楚;行数很多时,在整列重复同一句一致的说法可能更容易扫读。

在定下措辞之前,记下你自己候选的说法以及每一种为什么合适或不合适。点明原因的说法,例如“未收到”与“未公布”的对比,能帮助读者判断这个缺口是不是暂时的。把这些单元格标为你的工作选择,而不是已核实的事实,并在资料来源到手后重新查看。

处理不适用的属性

遇到不适用的属性,你可以把该单元格当作一次小型写作取舍,而不是一个需要随便填点东西的空缺。假设台灯对照表的某一行完全没有调光功能,两个候选单元格可以是“调光:无”和“调光:不支持”。并在表中阅读时,前者更短,却可能被误认为缺失记录;后者更长,但把关系说清楚了。只有一行不适用时,你也许更愿意用后者;若多行共享同一种“没有”,前者更省空间。

你也可以决定是否让列标题承担部分含义。如果列标题是“调光范围”,单元格写“不适用”显得重复而生硬;如果标题只是“调光”,单元格写“无”读起来自然。把“标题加单元格”的两种搭配都拟出来,然后把整列朗读一遍。选择那种搭配:读者只扫这一列,也能明白该功能是设计上就没有,而不只是没有报告。

一个有用的核对办法是:先在表外写一句话,说明这个单元格想传达什么,再把它缩进单元格。例如,“该型号没有调光控制”可以缩成“无调光控制”,比单独一个连接号清楚。如果你写出的那句话描述的是缺少证据,那么这个单元格应归入“未核实”的写法,而不是“不适用”的写法。你可以保留一条简短的个人备注,记下不适用行采用了哪种措辞、为什么这样选,以便后面的行保持一致。

借助scope属性说清归属关系

对于同时具有简单行表头和简单列表头的表格,W3C的指引要求用表头元素标明表头单元格,并用scope属性声明每个表头的方向。把scope设为row,表示该表头作用于整行;设为col,则表示它作用于整列。2

在指引给出的示例中,一张配送时段表的表头单元格分别位于第一行和第一列。第一行里的表头单元格使用col值,各自与其所在列的数据单元格关联;第一列里的表头单元格使用row值,各自与其所在行关联。来源指出,如果缺少这些信息,有些用户就不容易理解表头单元格与数据单元格之间的关系。2

你可以把scope的思路落到单元格里的具体措辞上,把条件直接写出来,而不是让读者从一个连接号去猜。设想一张台灯对照表,其中一行没有调光功能:不要只放一个连接号,可以拟写“不适用——未装调光器”,并尽量写短。对于只是还没确认的规格,另用“尚未核实”之类的说法,让两种原因保持区分。

你也可以让列标题分担一部分含义。如果表头已经写明“调光范围”,单元格可以写“无调光器”,而不必重复“不适用”;这时“未确认”之类的措辞就只标记真正待定的那一项。把两个版本都读一遍,选那个读者在更少字数内就能明白该单元格为何没有填写数值的版本。

定稿之前,你可以在表格外先写一句话,说明这个单元格要传达什么,再把它压缩进单元格。例如,“本型号没有调光控制”可以缩成“无调光器”,而“我们还没有收到瓦数”可以缩成“尚未核实”。把这两种标记写进表格自己的说明里,就能让各行的写法保持一致。

用标题和摘要补充背景

标题(caption)用来点明整张表的主题,在大多数情况下都有用。摘要(summary)则不同,它在复杂的表格里提供定位或导航提示。两者都与标明表头单元格和数据单元格、并定义二者关系的结构标记一起讨论,目的是让辅助技术能够为使用者提供上下文。3

同一页还指出,表头单元格必须用th元素标记,数据单元格用td元素标记;更复杂的表格可能需要通过scope、id和headers属性做显式关联。该教程覆盖的情形包括只有行表头或列表头的表格、同时有行表头和列表头的表格、不规则表头以及多级表头,并说明本教程不适用于用作布局的表格。3

你可以取一份已经标好结构标记的表格草稿,在表下补一段简短说明,在读者逐行比较之前先解释你的标记各代表什么。假设一行在灯泡瓦数处写“未确认”,另一行在调光范围处写“不适用”;可以拟这样的说明:“连接号表示该功能不存在;‘待定’表示撰写时该数值尚未确认。”再与把同样解释放进备注列的版本比较,保留能减少各行重复措辞的那一种。

你也可以在表后补两句摘要,说明这份比较的完整程度,例如还有多少个单元格未核实、哪些规格是对照过带日期的来源核对的。这属于写作取舍,可以考虑读者是在看各行之前先扫摘要,还是看完各行之后才会读到这里。

作为对照,可以用同一张表的空白单元格版本测试一条说明,看哪一种留下的疑问更少——读者是否还会分不清空白代表“没有”还是“不确定”。只有当这条说明澄清的内容多于它重复的单元格内标记时,才保留它。

常见问题

怎样做一张三行的台灯对照表,用来演示不支持调光、瓦数未确认和灯罩尺寸已确认这三种情况?

作为演示,可以先起草一张三行台灯表:一行没有调光功能,一行灯泡瓦数尚未确认,一行灯罩尺寸已确认。然后试着把第一个不调光的单元格填上“不适用”,把瓦数单元格填上“待确认”,灯罩单元格则保留“30厘米”。

自己对照表的某一行里,像灯泡瓦数这样的规格还没确认时,单元格该怎么起草?

可以挑出自己对照表里某一行尚未确认的规格,比如灯泡瓦数,决定这个单元格该写什么。可以考虑写成“未核实”加简短原因,例如“未核实——尚未收到供应商规格”,而不是留空,以免读者把空白理解成没有这项。

怎样在已标记好的草稿表格下方加一段简短说明,在逐行比较前解释这些标记的含义?

可以拿一张已经做好标记的草稿表,在下方加一小段说明,在比较各行之前交代标记的含义。假设一行在灯泡瓦数处写着“未确认”,另一行在调光范围处写着“不适用”,可以起草这样一段说明:“短横线表示该功能不存在;‘待定’表示写作时该值尚未确认。”