可访问、简单、响应式表格

Avatar of Davide Rizzo
Davide Rizzo 发表

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

没有单一的解决方案可以使任何<table>都恰当地响应式。这就是我喜欢 Davide Rizzo 的这篇文章的原因:它承认这一点,然后继续提供一些解决方案。这是对我们已经探索了一段时间的领域 的补充

内容和对比表格

网站上有许多类型的表格,其中内容可能与用于使其响应式的方法一样千差万别。我发现最令人沮丧的表格是对比表格或普通内容布局表格,实际上没有全面的基于 CSS 的解决方案来使这些类型的表格响应式。

我着手寻找一个灵活且简单的解决方案,无论内容是什么,它都可以用作可重用的 Web 组件。

对比表格示例

表格标记对我们仍然有效吗?

标准表格标记似乎在语义上是有意义的,并且在对齐单元格方面做得相当不错。我的主要担忧之一是可访问性。当然,原生表格标记可以帮助使用屏幕阅读器的用户理解内容的阅读和导航顺序?

我使用一个简单的 最佳实践表格 进行了一些测试。使用一些屏幕阅读器(Chrome VoxVoiceOver),我尝试导航标记

  1. ChromeVox 会告诉你你位于一个表格上,而 VoiceOver 还会告诉你表格有多少列和行(这很有用)。
  2. ChromeVox 和 VoiceOver 都不会告诉你何时位于表格标题上。<thead><th> 甚至 scope="row|col" 似乎都没有任何作用!唯一识别标题的方法是将其包装在 <h#> 标记中。
  3. 阅读器通过行浏览表格,无论您的内容如何排列。VoiceOver 至少允许您使用方向键向任何方向导航,但您仍然无法指示您应该按什么顺序导航。

本质上,标记中的任何内容都不会告诉屏幕阅读器用户内容是否应按行或列读取。最有意义的标记仍然来自非表格语义内容。

响应式表格的方法

让我们考虑一下表格可以如何以响应式方式运行的不同方式

  1. 压缩:如果列的内容很少,它们可能在移动屏幕上水平压缩而没有任何问题,因此不更改布局需要成为一个有效的选项。
  2. 垂直滚动:如果布局和内容是精确且关键的,用户可以向左或向右滚动。这在 CSS 中使用 overflow="auto" 包装器非常简单。
  3. 按行折叠:在小屏幕上将每一行拆分为自己的单列迷你表格。将 display:table 切换为 display:block 将使用普通表格标记导致这种情况。
  4. 按列折叠:事情变得棘手的地方在这里。您不能使用纯 CSS 中的普通表格标记执行此操作,因为代码顺序按行排列,并且 <tr> 包装器将其锁定。我们要么必须更改标记,要么开始使用 JavaScript 进行操作。
这四种可能性的可视化示例。

不建议构建响应式表格的方式

通过反复试验,我放弃了这些方法

  1. 通过 JavaScript 生成第二个较窄的表格,并根据断点交替隐藏/显示。
    原因?内容重复,不比“.m”网站好。将破坏表格内的任何唯一 ID。对于样式指南驱动的组件来说,这是一个糟糕的想法。
  2. 使用普通表格标记和 JavaScript 在断点处将表格重新排列成响应式版本。
    原因?需要针对垂直和水平表格使用不同的标记。将破坏表格内容的任何 JS 初始化。需要大量的 JS 事件侦听器和 DOM 操作。
  3. 保留表格标记,但切换到 display:flex 以垂直对齐表格内容。
    原因?无法使用 <tr> 类型包装器跨行对齐单元格,并且 display: table-cell 会覆盖 flex-item

使用 Flexbox 实现响应式表格

1a) 针对面向行的表格…

  • 按照移动设备或屏幕阅读器应该读取的顺序排列标记,使用语义标题和内容。
  • 放弃所有“行”包装器的概念。
  • 根据列或行的数量将每个单元格的宽度设置为百分比。
    无法自动调整列宽。

查看 CSS-Tricks 的 Pen 响应式表格(按行) (@css-tricks) on CodePen

1b) 针对面向列的表格…

  • 按行设置 flex order 以立即创建垂直表格。这必须是内联的,否则我们需要为每一行使用一个唯一的类。手动执行起来相当容易,或者 CMS 或 JavaScript 应用起来非常容易。

查看 CSS-Tricks 的 Pen 响应式表格(按列) (@css-tricks) on CodePen

2) 样式以帮助建立连接

  • 根据需要以任何模式单独设置单元格样式。
  • 使用负边距修复单元格边框重复。

查看 Davide Rizzo 的 Pen 响应式表格(单元格样式) (@davidelrizzo) on CodePen

3) 在小屏幕上折叠为块

在小屏幕媒体查询中,将所有内容设置为 display: block。这给了我们响应式表格!

查看 CSS-Tricks 的 Pen 响应式表格(折叠) (@css-tricks) on CodePen

3b) 折叠为选项卡或手风琴

  • 选项卡和手风琴标记位于表格中的逻辑位置
  • 根据单元格 order 切换行或列
  • 使用 display: none 为视觉用户和屏幕阅读器切换

查看 CSS-Tricks 的 Pen 响应式表格(选项卡和手风琴) (@css-tricks) on CodePen

其他增强功能

对齐单元格内容
通过偏移单元格宽度来添加列边距
斑马条纹表格
使用手动单元格宽度模拟列跨度
限制:无法在弹性表格上进行行跨度。

您可以对其他类型的标记使用相同的单元格样式

甚至标准表格标记!

查看 CSS-Tricks 的 Pen 响应式表格(备用标记)@css-tricks)在 CodePen 上。

无 Flexbox 的回退方案

IE9 及以下版本不支持 Flexbox。对于旧版浏览器,您可以使用(Modernizer)检测 Flexbox 并显示移动版本,这是一个很好的优雅降级示例。

.no-flexbox .Rtable > .Rtable-cell { 
  display: block; 
}

结论

总的来说,这种方法提供了极大的灵活性,您可以考虑使用这些技术替换所有内容表格。您可以轻松地继续添加不同的主题和样式,并且如果设计人员预先了解响应式表格的功能,他们会更加有效。

其他响应式表格资源


这篇文章最初发表在 CodePen 上。