该 border-collapse
属性非常适合使<table>
单元格周围的所有边框保持一致。它创造了一种干净的外观,我个人更喜欢这种外观。
但是,某些情况可能会导致浏览器绘制单元格及其相应边框的方式出现问题。 每个单元格在绘制时都放置在前面一个单元格的下方。这意味着如果表格具有不同颜色的边框,则某些边的边框会被隐藏。
问题
在下面的代码示例中,将鼠标悬停在单元格上以查看边框如何相互隐藏。
查看 CodePen 上 Daniel (@gooseofmusic) 编写的 Pen 表格边框折叠步骤 1。
由于z-index
不适用于<table>
内部的单元格,因此我们必须使用单元格内部的内容。
解决方案
步骤 1
友情提示:此解决方案将使用负边距。对于那些不喜欢负边距的人,请回避。
首先,我们在单元格内部的内容周围放置一个包装器。将边框、填充等移动到内部内容以进行匹配。
查看 CodePen 上 Daniel (@gooseofmusic) 编写的 Pen 表格边框折叠步骤 2。
仅此一项实际上就会反转问题:底部和右侧的边框会显示在顶部。
步骤 2
从那里,我们还必须将z-index
添加到:hover
状态,以便它堆叠在其他元素之上。因为我们正在对表格单元格内部的内容进行 z 索引,而不是<td>
本身,所以它可以正常工作。
查看 CodePen 上 Daniel (@gooseofmusic) 编写的 Pen 表格边框折叠步骤 3。
确保z-index
未包含在任何transition
中,否则您将看到以前隐藏的边框“滑动”到视图中,而不是淡入。
快速悬停时不起作用。
淡出效果存在一个小故障,不太美观,更好的方法是使用伪元素,从而无需在每个表格单元格中使用 div,并解决该故障
http://codepen.io/gibatronic/pen/OXzEoQ
我在这里看到的问题是,单元格内部的任何元素(例如锚点)都无法接收指针事件,因为伪元素覆盖了它们。
指针事件可以解决此问题,但目前支持度不高。
您可以通过为 td 设置 z-index 并为伪元素设置负 z-index 来解决指针事件问题(将其放在 td 后面但表格前面)。我没有跨浏览器测试过。
http://codepen.io/jproffitt71/pen/JKrBmO/
是的……在锚点或按钮的情况下,需要将样式移动到它们,从而解决了伪元素阻塞的问题。
使用盒阴影作为替代方案。没有人会注意到区别,也没有什么魔术。
http://codepen.io/Nargus/pen/XKVozE/
不错!看起来是迄今为止最好的解决方案。
我更经常使用盒阴影来创建边框。它比常规边框/轮廓给了我更多的控制权。Vitali 说得对!
为什么不直接使用 outline 属性以及 outline offset 呢?
因为当您需要圆角时,outline 不支持圆角。