在 CSS 中,高亮表格行非常简单。 tr:hover { background: yellow; }
可以很好地实现。 但是,高亮列一直比较棘手,因为没有单个 HTML 元素可以作为列中表格单元格的父元素。 一点点 JavaScript 可以轻松处理,但 Andrew Howe 最近给我发邮件分享了他发现的技巧,在 StackOverflow 上,由 Matt Walton 发布。
这个技巧已经有些年头了,所以我只是想把它整理一下,然后发布到这里。
技巧是使用 <td> 上的巨大伪元素,并通过表格溢出隐藏
您无法从 CSS 中真正了解表格的大小,因此只需将伪元素的高度设置为该高度的一半,并设置一个负的顶部值。
table {
overflow: hidden;
}
tr:hover {
background-color: #ffa;
}
td, th {
position: relative;
}
td:hover::after,
th:hover::after {
content: "";
position: absolute;
background-color: #ffa;
left: 0;
top: -5000px;
height: 10000px;
width: 100%;
z-index: -1;
}
负的 z-index
会将它保留在内容下方。 负的 z-index
是一种有趣的技巧,但要注意,此表格不能嵌套在具有背景的其他元素中,否则高亮会显示在它们下方。
您可以在此处查看实际效果
查看 CodePen 上 Chris Coyier (@chriscoyier) 的 仅用 CSS 实现行和列高亮 示例。
让它在触控设备上也能使用
悬停伪类在触控设备上只能勉强工作。 首先,元素需要可聚焦,而表格单元格默认不可聚焦。 当然,您可以向表格单元格添加点击事件处理程序,并在 JavaScript 中完成所有操作,但这里介绍了一种方法,可以将大部分工作保留在 CSS 中
// Whatever kind of mobile test you wanna do.
if (screen.width < 500) {
// :hover will trigger also once the cells are focusable
// you can use this class to separate things
$("body").addClass("nohover");
// Make all the cells focusable
$("td, th")
.attr("tabindex", "1")
// When they are tapped, focus them
.on("touchstart", function() {
$(this).focus();
});
}
然后,在 CSS 中添加 :focus 样式。
td:focus::after,
th:focus::after {
content: '';
background-color: lightblue;
position: absolute;
left: 0;
height: 10000px;
top: -5000px;
width: 100%;
z-index: -1;
}
td:focus::before {
background-color: lightblue;
content: '';
height: 100%;
top: 0;
left: -5000px;
position: absolute;
width: 10000px;
z-index: -1;
}
在我的最终演示中,我对 CSS 选择器进行了更精细的处理,确保空表格单元格不会触发任何操作,<thead>
中的表格标题只选择列,<tbody>
中的表格标题只选择行。
您可以在 最终演示 中看到这一点。 这里展示了触控功能。

这很棒。 它将帮助我在一些大型表格中实现高亮行和列,这将使阅读表格变得更加容易......代码已保存,以备将来项目使用,感谢您的发布。
我记得读过使用巨大的 div 会导致性能下降,即使通过溢出来隐藏,您是否知道这方面的任何细节? 就像旧的图片替换文本-索引:-99999px; 技巧?
这太棒了。 我将在我的网站上使用它。 谢谢。 继续保持出色的工作。
CSS 4 中即将推出一个新的列选择器,它将允许“原生”地实现此功能:https://grack.com/blog/2015/01/11/css-selectors-4/#column-combinator–and-nth-column
目前浏览器支持度为零,但希望它能尽快推出。
是的,我认为您也可以在 HTML 中使用 colgroup 来实现这一点。
阅读这篇文章后:才意识到 FF 中的 td 内绝对定位错误已修复。 这在将来可以信赖。
真的?! 太棒了,终于来了! :D 这个错误已经存在 15 年了,可以追溯到 Netscape 时代!
我不会使用这个技巧,因为 w3c 明确指出
“`position:relative` 对 `table-row-group`、`table-header-group`、`table-footer-group`、`table-row`、`table-column-group`、`table-column`、`table-cell` 和 `table-caption` 元素的影响是未定义的。”
根据规范,它可能是未定义的,但几乎所有供应商现在都同意,它应该至少将元素定义为偏移父元素。
因此,您可以在单元格内进行绝对定位! 太棒了!
伪元素再次拯救了我们!
下次我需要美化表格时,要记住这一点。
我同意,伪元素非常强大。 我正在用它们创造各种各样的魔法。(这些都是我在这里学到的! 因此感谢您。)
我只是想知道,如果您因为触控设备而添加了一些 js,那么您可以完全使用 js,因为它将成为一行 JS 解决方案,并且不需要 CSS 技巧,类似于
和
难道没有更准确的触控触发器吗?
screen.width < 500
看起来像是一个“肮脏”的检查。我认为这是一个值得思考的有趣问题。 从我听到的情况来看,“无法测试触控”,所以也许这是一个徒劳的尝试? 屏幕宽度对我来说似乎并不糟糕,因为:是否有任何小于该尺寸的屏幕例子是*没有*支持触控的? 在混合设备的情况下,它们没有得到这里的触控功能可能没什么大不了的,因为它们不重要(在这个假设情况下)。
我认为检测触控的最佳方法是监听捕获阶段的触控事件。
对于在用户开始与内容交互之前不需要触控特定逻辑的任何内容,这都能很好地工作。
我认为尝试将触控的处理方式与鼠标或任何其他输入方法区分开来是错误的做法。 支持触控和鼠标的设备怎么办? 在触控笔记本上,我可能会使用鼠标,但要在一个大型表格中指向某些内容(例如,在本例中),我可能会使用手指。 当然,这主要针对 Windows 设备,因为显然 OSX 不支持触控(屏幕)。 但即使在连接了鼠标的 Android 平板电脑上,这也是一个问题。
我想,开始使用 Pointerevents 已经是一件不可能的事了,因为 Google 讨厌它们,但那将是一个使用它们的机会(不确定如何使用,但这并不是我的重点)。
总之,我讨厌在桌面环境下工作但在我的 Surface 上却不能用的东西。 即使是像这个演示这样微不足道但又很实用的东西。
抱歉,但触控技巧让它更让人恼火 :(
您可以使用 Modernirz 测试 -> 触控事件
if (Modernizr.touch) {
alert(‘触控屏’);
} else {
alert(‘非触控屏’);
}
http://modernizr.com/docs/#features-css
在下载页面上,确保选中了触控事件选项。
很棒的文章!
$(this).focus()
→this.focus()
太棒了,这个技巧是否可以应用于现有的 WordPress 表格插件 CSS 文件?
您是否研究过这些非常大的像素大小在顶部和高度上是否会造成任何性能问题? 或者浏览器足够智能,可以计算出数学运算,确定渲染形状,然后继续执行?
很棒的分享。谢谢!!!
如何只突出显示一行?
要仅突出显示一行,请在
tr:hover
上设置背景颜色演示
@Myriam @R. Otten
即使您知道设备支持触摸屏,您也不知道他实际上使用的是触摸屏还是鼠标、键盘、语音或其他任何东西。 所以你必须小心这一点。 我见过很多网站在触摸屏上“工作”,但当我使用同一设备上的鼠标时就会出现故障,这太烦人了
您也可以使用
colgroup
和少量 jQuery 来完成相同的事情(demo)HTML(为每列添加一个
colgroup
)脚本
解决此问题的简单方法是为表格指定一个
z-index
。演示
关于这一点的有趣观点 - 我一直在努力使列伪元素显示出来,直到我删除了 z-index。 之后,当我垂直向上移动悬停,经过列伪元素时,出现另一个问题,即行没有更新(您可以使用与您的位置匹配的行向下移动一列,但当您向上移动一列时,行不会更新)
最终我想到了包含“pointer-events:none”来允许通过元素进行悬停。
(http://codepen.io/joshharrington/pen/gbjyNZ)
然后你只需要修复如何通过列显示内容!
这似乎只对我不起作用,前提是没有指定背景颜色,即使是在页面上。