数据表格在响应式设计中表现不佳。就是这样。
他说的很有道理。数据表格可能非常宽,而且必须如此。为了使数据表格在表格中具有任何意义,需要将单行数据保持在一起。表格可以在宽度上伸缩,但它们只能缩小到一定程度,否则就会开始不舒服地换行单元格内容,或者根本无法缩小。
响应式设计完全是关于调整设计以适应不同尺寸的屏幕。那么,当屏幕比数据表格的最小宽度更窄时会发生什么?您可以缩小以查看整个表格,但文本大小会太小而无法阅读。或者,您可以放大到可读性点,但浏览表格将需要垂直和(悲伤的表情)水平滚动。

所以我们要做的是……
我们将使用“响应式设计”原则(CSS @media 查询)来检测屏幕是否小于表格的最大压缩程度。如果是,我们将重新格式化表格。
我们是优秀的开发者,并且在此处为我们的表格使用了纯语义标记。基本示例
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Job Title</th>
</tr>
</thead>
<tbody>
<tr>
<td>James</td>
<td>Matman</td>
<td>Chief Sandwich Eater</td>
</tr>
<tr>
<td>The</td>
<td>Tick</td>
<td>Crimefighter Sorta</td>
</tr>
</tbody>
</table>
我们的常规 CSS 没什么特别的
/*
Generic Styling, for Desktops/Laptops
*/
table {
width: 100%;
border-collapse: collapse;
}
/* Zebra striping */
tr:nth-of-type(odd) {
background: #eee;
}
th {
background: #333;
color: white;
font-weight: bold;
}
td, th {
padding: 6px;
border: 1px solid #ccc;
text-align: left;
}
现在开始使用小屏幕响应式内容。我们已经确定我们的最小表格宽度约为 760px,因此我们将设置我们的媒体查询,使其在窄于该宽度时生效。此外,我们将针对 iPad,因为它们正好位于该区域。
最大的变化是我们将强制表格不表现得像表格,方法是将每个与表格相关的元素设置为块级元素。然后通过保留我们最初添加的斑马条纹,它有点像每一行表格本身就成为一个表格,但宽度仅为屏幕宽度。不再需要水平滚动!然后对于每个“单元格”,我们将使用 CSS 生成的内容(:before
)来应用标签,以便我们知道每个数据位的含义。
/*
Max width before this PARTICULAR table gets nasty
This query will take effect for any screen smaller than 760px
and also iPads specifically.
*/
@media
only screen and (max-width: 760px),
(min-device-width: 768px) and (max-device-width: 1024px) {
/* Force table to not be like tables anymore */
table, thead, tbody, th, td, tr {
display: block;
}
/* Hide table headers (but not display: none;, for accessibility) */
thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
tr { border: 1px solid #ccc; }
td {
/* Behave like a "row" */
border: none;
border-bottom: 1px solid #eee;
position: relative;
padding-left: 50%;
}
td:before {
/* Now like a table header */
position: absolute;
/* Top/left values mimic padding */
top: 6px;
left: 6px;
width: 45%;
padding-right: 10px;
white-space: nowrap;
}
/*
Label the data
*/
td:nth-of-type(1):before { content: "First Name"; }
td:nth-of-type(2):before { content: "Last Name"; }
td:nth-of-type(3):before { content: "Job Title"; }
td:nth-of-type(4):before { content: "Favorite Color"; }
td:nth-of-type(5):before { content: "Wars of Trek?"; }
td:nth-of-type(6):before { content: "Secret Alias"; }
td:nth-of-type(7):before { content: "Date of Birth"; }
td:nth-of-type(8):before { content: "Dream Vacation City"; }
td:nth-of-type(9):before { content: "GPA"; }
td:nth-of-type(10):before { content: "Arbitrary Data"; }
}
因此,桌面获得常规的表格体验,移动设备(或其他小屏幕)获得重新格式化且更易于浏览的表格

IE 怎么办?
IE 9 及以下版本不喜欢您将表格元素设置为display: block;
它会执行奇怪的操作并且无法正常工作。但 IE 9确实支持媒体查询。因此,到目前为止,我的解决方案只是将媒体查询样式包装在条件注释中。
<!--[if !IE]><!-->
<style>
/* table-related media query stuff only */
</style>
/* Or an external stylesheet or whatever */
<!--<![endif]-->
如果问题仅仅是旧版本的 IE 不支持媒体查询,我们可以使用css3-mediaqueries-js项目(为所有媒体查询提供 polyfill 支持)或Respond(也是 polyfill,更小,但仅执行 min/max-width)。它们都运行良好。但这不是我们在此案例中的问题。
这在 IE 10 中运行良好,并且 IE 10 还会忽略条件注释,因此即使包装在 !IE 条件中,样式也会起作用。
查看
演示有两个页面,一个是响应式表格解决方案,另一个是到非响应式版本的链接,以便您可以来回切换以查看问题。
在演示中,我使用了一些额外的媒体查询来强制移动设备的正文具有特定的宽度,以防止它们变得难以控制。查看源代码以获取。
这并不完美……
这只是针对小屏幕上的数据表格问题的一种潜在解决方案。它并不完美。可能存在一些可访问性问题(也可能没有,我对此真的不确定)。可能有一些花哨的 JavaScript 解决方案可以以不同的方式处理问题,并且也能很好地工作。如果出现此问题的其他解决方案,我将随时更新此页面。
更新:其他想法
Scott Jehl 提出了两个替代方案,它们都非常酷,并且与这个方案大不相同。这突出了一个重要点:选择哪种解决方案完全取决于数据表格的具体上下文。
其中一个根据图表中的数据创建饼图。在较窄的屏幕上,饼图显示,表格隐藏,否则仅显示信息更丰富的表格。可以说,移动版本更有用!

下一个想法(Scott 认为是Todd Parker提出的)是在窄屏幕上将表格转换为表格的迷你图形,而不是显示整个表格。这向用户表明此处有一个要查看的数据表格,但不会过多地干扰内容。单击表格,转到仅查看表格的特殊屏幕,然后单击返回。

移动优先版本由 Derek Pennycuff 创建。
版本以 div 开头,标签由伪元素和 Mobifreaks 的数据属性生成。
仅隐藏非必要内容版本由 Stewart Curry 创建
非常棒。
我发现具有讽刺意味的是,我们现在使用 CSS 来格式化表格,而不是使用表格来格式化整个页面。
一点也不讽刺。
表格/曾经被设计用于将表格数据组织成整齐的行和列。页面的设计并不那么严格,因此表格将严格的布局原则应用于灵活的设计媒介,这是一个糟糕的主意。
CSS 被设计用于设置页面中所有元素的样式,包括表格,因此它非常适合其预期功能。
~M
这符合我对讽刺的定义
非常棒的示例。我最初有点担心它的效果,但看起来很棒。
不过,我有一个问题。我认为 HTML 用于(标记的)内容,而 CSS 用于样式。是否应该担心您现在已将内容(以标签的形式)添加到 CSS 中?
这难道不是像在 HTML 中添加样式一样大的错误吗?
这可能是一个灰色地带……
如果您这样做
这当然是有罪的。
但在这种情况下,标记仍然具有正确的表格标题,因此它与任何其他环境中的任何其他数据表格一样易于访问。我们只是在一个地方隐藏标题,并在另一个地方显示它们,而无需更改标记。
尽管如此,就像我说的,这可能是一个灰色地带,我只是不知道。
明白了,谢谢!
您可以尝试使用“data-”属性,伪元素可以通过内容声明访问该属性
content: attr(data-something);
您还可以为任何表格单元格标题赋予属性,这具有超强的语义性和可访问性,并且可以使用它们代替数据。但有一个小问题——标题包含相应标题 ID 的值。我不确定,在空格分隔的单词中设置这些 ID 是否被认为是一种好的做法(每个单词都是独立的 ID,并且您可能会很快用尽不同的单词的想法,因为 ID 必须是唯一的)。
多么优雅的解决方案!感谢分享。
针对小屏幕上表格难以阅读的问题,这是一个不错的解决方案。感谢分享!
想法来自 @chriseppstein
使用数据属性为单元格设置内容,这样内容就保留在 HTML 中而不是 CSS 中。
然后 CSS 更像是
简洁。有点像微格式。
不错,感谢你对此的后续跟进,克里斯!
我建议使用 axis 属性,因为它应该定义单元格数据属于哪个标题。
这对于多语言网站非常有用!
嗨,我正在将这种响应式样式应用于 Magento,并且希望它能传播到所有地方的所有表格,所以我编写了一段 jQuery 代码来填充 data-heading(我的属性)的相应信息。
需求
1. 为数据表添加类“data-table”。
2. 使用正确的 thead/tbody 结构。
3. 应用如上所述的 data-heading 属性所需的 CSS。
希望这对某些人有所帮助。
干杯
来自 @mathias — 我们可能不需要将“only screen”作为媒体查询的一部分。这些内容也可能适用于其他媒体,尽管我还没有测试过。在我看到这在其他媒体上也能有用之前,我更愿意将其保留为仅屏幕。
不错的解决方案。
非常有用。很棒的技巧,克里斯。
附言:我马上就和我的朋友们分享了。
很好的实现,但解决方案很糟糕。
现在它完全无法作为表格阅读。我认为我宁愿滚动/将我的手机切换到横向模式……
我同意,但这可能取决于表格和用户对其的熟悉程度。
将此与“下一个” “其他”想法(“点击查看”模型)结合起来,我认为它是一个赢家。您拥有可访问的表格信息,这些信息在需要之前不会妨碍布局。
之前在响应式设计中使用过数据表,我知道它们可能很麻烦。
我对这个示例的担忧是,我们只看到了数据表。重新格式化数据以适应窄屏幕在示例上下文中很好,但在整个站点上下文中,它可能会占用大量空间并容易让用户迷失方向。
幸运的是,我们可以对此做一些事情。诚然,这不是最好的解决方案,但如果我们想保持数据表的水平方面,我们可以使用溢出。
对于 iPhone 和 iPad 等多点触控设备,您可以将表格嵌套在 div 中并将 div 溢出设置为自动。当您的灵活站点围绕表格收缩时,溢出属性会生成一个滚动条。您的 iPhone 或 iPad 不会显示滚动条,但您现在可以使用两根手指左右滑动表格以显示所有数据。
对于那些不幸无法享受多点触控的设备,可以使用 Javascript 通过此 div 中的单点触控来左右滑动。再说一遍,这不是 javascript-tricks.com,因此我认为这是一个不完整的解决方案,但它是解决问题的另一个角度。
喜欢这个!!谢谢
两部 iPhone 带有一条评论:“都一样糟糕”。无价之宝:D。我笑完后会认真阅读这篇文章:D。
我的朋友,这真是太棒了!
虽然我同意前面评论者的观点,他们正确地指出,此解决方案可能严重依赖于表格中的信息类型。
这里有一个非常好的例子。关于在 CSS 中添加内容的问题。
以您隐藏元素的方式,您不能添加额外的标记并在标准布局中隐藏它吗?
由于您有重复的数据,这会使您的标记不语义吗?
里奇
最好的解决方案之一。我相信它将来会得到更多增强。
哇!!!一如既往的好。干杯朋友。
哇,这很优雅也很有创意……喜欢它的效果。
哇!这真的太棒了!!
但是,如果我们也能在调整大小的窗口中保留标题背景,那就更好了!!
我不知道我是否同意这是最优雅的解决方案。为了查看少量数据,需要进行大量垂直滚动,并且所有行的视觉关联都消失了。我发现阅读起来非常痛苦。
我最近一直在思考我正在从事的项目中遇到的这个确切难题。我采用的解决方案是设置一个包含 div 并将其溢出设置为滚动。这样,就有一个易于看到的水平滚动条,不会影响页面其余部分,但允许数据保留其格式。
感谢分享!
现在我想尝试找到一个解决方案:)这是一个很好的主题,一个还没有真正被涵盖的主题。我想知道人们会想出哪些其他解决方案。
这是我最近处理过的更困难的事情之一,我不确定是否已经有很好的答案了。
我所做的是将表格包装在一个 div 中并将其设置为 overflow:auto,这样您就可以在小屏幕上获得侧向滚动,然后连接一些触摸检测,以便您可以滑动/滚动表格。
此外,这不是最好的方法,但是,是的,这是一个难题。
另一种不需要 Javascript 也不需要标签(手动或脚本)的方法是在列上使用彩虹条纹,并结合在行上使用不同颜色的斑马条纹。
我编写了一个纯 CSS 示例,如果您有兴趣,可以访问 一个简单的演示。
作为一名非专业从事网络开发,只是喜欢为我的个人网页使用正确 CSS 的人:无论这是否是一个好的解决方案,坦率地说,您只需使用 CSS 就能做到这一点,这真是太棒了。
只是发布一条评论来添加到您的评论图中。;-)
哇,谢谢!我发现它很有创意和帮助。
勺子!这是一种巧妙的方法,可以改变越来越流行的趋势,即必须以多种查看格式查看事物。一旦我所在地区获得足够好的蜂窝信号,它就会变得更加重要。是的,美国仍然有一些地区无法获得 4G。有时间来密歇根北部看看。
干杯,并继续努力。
凯文“Mistfit”米斯特
你说“squishitude”,这是一个伟大的时刻。
感谢克里斯的见解,总是很有用。您的解决方案完全可行,饼状图也同样出色。另一个是什么,啊点击查看表格页面。还可以列出标题,并点击以将相应的数据行带入视图。
一切都好。干杯。
现在正在研究一个类似的解决方案,该解决方案看起来很有希望,它使用了 Chris Eppstein 的 data-label 解决方案以及使用 float:left 的潜在 IE 修复;
通过在媒体查询中调整以下内容,即使对于 IE8 和 IE9,也可以使相同的布局正常工作。
table, thead, tbody, th, td, tr {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
float: left;
clear: left;
}
然后,在媒体查询设置中为每个
td
设置高度,例如:40px
,并使用respond.js
使媒体查询在IE8中也能工作 :)具有讽刺意味的是,使用手动编写的CSS在:before伪元素中指定语义内容,这种方式偶然地不可脚本化,因此无法以过程化的方式复制。
但是,就样式而言,这项技术非常有远见,并在很大程度上表明了表单因素中心的数据标记需要如何实现。最终,这应该是对相关数据进行单独选择视图的结果:将表格转换为单独标记的键值对。可能需要一个结构。
关于这个话题,一位朋友最近问我,作为一名信息设计师和前端开发人员,当他不在工作时,如何设计复杂的自动化测试报告表格,使其在智能手机上显示良好。我给出的答案引用了一种更细粒度的方法:要么通过查询或脚本提供对显示数据范围的手动约束,要么提供一个脚本化的界面,该界面呈现一个非常低分辨率的显示,可以快速扩展以提供特定条目的详细信息。
有时,数据的性质及其有意义的理想形式意味着,小型屏幕显示无法充分呈现它,而不会损害数据:有时,需要额外的用户努力才能使数据保持明显的相关性。
不错!在我们工作的地方,我们努力以编程方式生成打印表格,通常太宽了。类似这样的方法可能适用于我们。极好的灵感。绝对同意格式取决于数据以及您对读者的了解。例如,在许多情况下,跳过“名字”,“姓氏”标签并仅将人类可读的名称放在单元格顶部是可以理解的。将其转换为一种卡片视图。
当同一页面上有两个表格时会发生什么?如何仅将其应用于一个表格?
没关系,上面已经回答了(即数据属性)
很棒的文章。
我们在与你的受众交流吗?我认为女生也会写CSS。
这很公平,我会更改它。
我认为这仅适用于表格占据页面整个宽度的那些情况。
如果表格只是页面的一侧呢?(例如:左侧的div占据40%宽度,我们的表格在右侧占据60%。)
我在上述情况下使用了它。它在低分辨率屏幕上失败了。
如何解决这个问题?
这是一个很棒的例子。但是,如果我们在一个页面上有两个表格怎么办?
td:nth-of-type(1):before { content: “第一个表格第一行的标签”; }
我认为没有类似nth-of-class的东西。所以请回复如何在单个页面中处理多个表格。
如何显示更少的列,并通过水平拖动(左右)切换要显示的列?
(@sufail:为你的不同表格使用id选择器)
嗨,Chris Coyier……我是你的粉丝。L) 这真的很好……我感到非常开心:) 谢谢。
我已将其应用于购物车,“position: absolute”似乎阻止了“数量输入”的更改。例如,购物者选择更大的数量,然后“更新”购物车。
当我删除position: absolute时,产品和标签居中,而我想要左对齐。左对齐不起作用。
任何关于我可以做什么的想法都将不胜感激。
这仅适用于手机,桌面尺寸没问题。
干杯,它拯救了我的周一!
我已经解决了我的问题。
因此,对于任何错过这一点的人,以下是问题所在
table td {
/* 像“行”一样表现 /
border: none;
/ border-bottom: 6px solid green; */
position: relative;
padding-left: 50%;(默认50%,我更改为30%)
}
所以我将td更改为30%,将td:before更改为24%……当我在td:before上设置背景颜色时,它清楚地显示了问题。
只是不断错过一些如此简单的东西。
希望这对其他人有所帮助,我喜欢理解事物是如何运作的,而不是盲目地复制粘贴,所以我很高兴我找到了它。
这对我来说不起作用,我不知道为什么,花了大约14个小时试图让它工作,清除了所有样式并再次尝试,一次又一次。我不确定是什么导致我的表格出现奇怪的问题。
这太棒了!但它在IE中不起作用。
我认为解决方案只是部分实现了。对这个表格有效,但对未来的开发并不那么周到。
我希望看到Derek的表格与Excel中的锁定标题相结合,这样标签就可以保留在页面上,并且一次只显示一个td结果。[或者可能与结果的溢出相结合]
这是一个浮动TH的示例;
http://jsfiddle.net/FyJwZ/7/
是否可以将表格标题放在它们自己的行上,以便内容在小屏幕尺寸上不会重叠?
我没有任何CSS经验,但可以服务于http://cssdesk.com/GRBqd/开始这个受http://jsfiddle.net/DHjVE/启发的项目
是否有办法只对包含内容的单元格显示伪标签?我正在做一个简单的考勤表,我的三列是主持人 | 配偶 | 客人。为了最大程度地减少滚动,如果只有数据时才显示伪标签会很棒。
我对CSS很陌生,但我的理解是,你可以在其中执行很少的条件逻辑。
我在一个页面上有两个不同的图表,它们是相关的。如何为每个图表获得正确的before td?我尝试使用具有不同元素的类,但它总是将第一个td留空。
极好的便捷解决方案,只需最少的努力。
不过,我在jqueryui页面中遇到了一些问题。
单独使用效果很好:此处输入你的链接文本…
但在这里响应不佳:此处输入你的链接文本…
大家有什么想法吗?
我喜欢它如何重新格式化表格。我遇到了一些问题。第一个是使用table标签(我更喜欢div)。第二个是在动态页面中使用它,以便所有表格都像这样格式化。第三个是在CSS中放入字符串对于多语言网站来说简直是糟糕。
有人尝试过使用隐藏元素作为列标题吗?有人尝试过使用div作为结构吗?
IE9支持的解决方法——只需使表格行和单元格浮动
tr, td {
display: block;
float: left;
}
td:before
中的padding-right: 10px;
的原因是什么?据我所知,这没有任何作用。我错过了什么吗?table, thead, tbody, th, td, tr {
display: block;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
float: left;
clear: left;
}
这段代码解决了我的IE9问题(感谢Cristoffer),但每次我尝试将浏览器屏幕恢复到原始大小时,IE9都会崩溃。有人知道为什么吗?
不错的脚本 - 但你知道为什么它在Windows Phone上不起作用吗?
这非常有效,Chris。这是最好的解决方案!
这就像魅力一样有效!!非常感谢!
目前我的网站是用WordPress完成的,我正在手动编写代码。
有没有办法在切换到较小屏幕后保持td中的文本换行?在切换后,我看到长文本超出表格并且出现滚动条。我尝试了各种word-wrap添加,但没有成功。
在您的演示中,当浏览器水平最小化时,“梦想度假城市”和“城市名称”文本会重叠。如何防止这种情况?