You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome中border-collapse与position:relative共存时box-shadow失效问题求助

问题:Chrome中带border-collapse和position:relative的无法显示box-shadow

我有一个包含数据的<table>,出于样式需求设置了border-collapse: collapse,其中的<td>元素设置了position: relative,用于通过子元素<div>(设position: absolute)实现tooltip功能。但在Chrome浏览器中,<td>的box-shadow无法生效,移除border-collapse或position: relative则恢复正常,而该效果在Firefox中可正常显示。需要在保留这两个属性的前提下解决此问题。

示例代码1:基础复现

table {
  border-collapse: collapse;
}

td {
  position: relative;
  box-shadow: 0 0 10px black;
}
<table>
  <tr>
    <td>This has a shadow in Firefox but not in Chrome</td>
  </tr>
</table>

示例代码2:tooltip功能依赖position:relative

移除position: relative会破坏tooltip的定位:

table {
  border-collapse: collapse;
}

td {
  position: relative;
  box-shadow: 0 0 10px black;
  border: 1px solid black;
}

div {
  visibility: hidden;
  position: absolute;
  background-color: #ff5555;
  z-index: 1000;
  right: 0;
  top: 100%;
  padding: 5px;
  border: 1px solid black;
}

td:hover>div {
  visibility: visible;
}
<table>
  <tr>
    <td>Hover your mouse cursor here
      <div>tooltip</div>
    </td>
  </tr>
  <tr>
    <td>Shadow is missing in Chrome</td>
  </tr>
</table>

解决方案

方法1:用伪元素承载阴影

利用伪元素脱离表格布局限制,既保留border-collapse和position: relative,又能显示阴影:

table {
  border-collapse: collapse;
}

td {
  position: relative;
  border: 1px solid black;
  padding: 8px; /* 保持原有的内边距 */
}

/* 伪元素实现阴影,放在td内容下方 */
td::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  box-shadow: 0 0 10px black;
  z-index: -1;
}

/* tooltip样式保持不变 */
div {
  visibility: hidden;
  position: absolute;
  background-color: #ff5555;
  z-index: 1000;
  right: 0;
  top: 100%;
  padding: 5px;
  border: 1px solid black;
}

td:hover>div {
  visibility: visible;
}

方法2:用border-spacing模拟border-collapse

如果可以接受用border-spacing替代border-collapse,也能解决问题,同时保留tooltip功能:

table {
  border-collapse: separate; /* 切换为separate模式 */
  border-spacing: 0; /* 模拟边框合并效果 */
}

td {
  position: relative;
  box-shadow: 0 0 10px black;
  border: 1px solid black;
  /* 去掉重复边框 */
  border-right: none;
  border-bottom: none;
  padding: 8px;
}

/* 补全最后一列和最后一行的边框 */
td:last-child {
  border-right: 1px solid black;
}

tr:last-child td {
  border-bottom: 1px solid black;
}

/* tooltip样式不变 */
div {
  visibility: hidden;
  position: absolute;
  background-color: #ff5555;
  z-index: 1000;
  right: 0;
  top: 100%;
  padding: 5px;
  border: 1px solid black;
}

td:hover>div {
  visibility: visible;
}

方法3:给内部套容器元素

把td的内容放到内部容器中,让容器承载阴影,td保持position: relative用于tooltip定位:

table {
  border-collapse: collapse;
}

td {
  position: relative;
  padding: 0; /* 内边距移到内部容器 */
  border: 1px solid black;
}

/* 内部容器承载阴影和内边距 */
td .content {
  box-shadow: 0 0 10px black;
  padding: 8px;
}

/* tooltip样式不变,注意类名区分 */
div.tooltip {
  visibility: hidden;
  position: absolute;
  background-color: #ff5555;
  z-index: 1000;
  right: 0;
  top: 100%;
  padding: 5px;
  border: 1px solid black;
}

td:hover>.tooltip {
  visibility: visible;
}

对应的HTML修改为:

<table>
  <tr>
    <td>
      <div class="content">Hover your mouse cursor here</div>
      <div class="tooltip">tooltip</div>
    </td>
  </tr>
  <tr>
    <td>
      <div class="content">Shadow now shows in Chrome</div>
    </td>
  </tr>
</table>

内容的提问来源于stack exchange,提问作者root

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:05:18