您遇到了样式表的众多怪癖之一。使用普通边框,您可以使用 解决此问题border-collapse: collapse
,但这似乎border-image
在表格单元格上失败了,至少在某些浏览器中是这样。*
如果我是你,我会通过设计一个::after
伪元素而不是<td>
元素本身来解决这个问题。
您可以在下面的代码段中看到它的工作原理,但这里是重要部分:
border-collapse: collapse;
在<table>
<td>
s上所需宽度的透明边框,position: relative;
因此伪元素可以绝对定位在
- 每个都有一个
::after
伪元素,并定位以覆盖其及其边框<td>
position: absolute;
<td>
- 每个伪元素的top 和 left ,每行的最后一个伪元素
border-image
的 right ,底行的伪元素的 bottom 。border-image
border-image
在片段中,我添加了一些:hover
样式来显示伪元素及其边框的位置。
table {
border-collapse: collapse;
width: 200px;
height: 200px;
background-color: #ccc;
text-align: center;
color: white;
}
td {
position: relative;
border: 10px solid transparent;
}
td::after {
content: '';
position: absolute;
top: -10px;
left: -10px;
width: 100%;
height: 100%;
border: 10px solid blue;
border-image-source: url(//mdn.mozillademos.org/files/6009/border-image-2.png);
border-image-slice: 33%;
border-image-repeat: round;
border-image-outset: 0;
}
td:hover::after {
/* for demonstration only */
border-image: none;
background-color: rgba(0,0,255,0.33);
}
td:not(:last-child)::after {
border-right: 0;
}
tr:not(:last-child) td::after {
border-bottom: 0;
}
<table class="box">
<tr>
<td>1</td>
<td>2</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>5</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</table>
*当前border-image
规格说:
'<code>border-image' 属性适用于将 '<code>border-collapse' 设置为 '<code>collapse' 的表格和内联表格的边框。但是,本规范没有定义如何呈现这样的图像边框。特别是,它没有定义图像边框如何与表格边缘的单元格、行和行组的边框交互。
...但是 MDN 说它适用于“所有元素,除了内部表格元素 when border-collapse
is collapse
”,这似乎是 Chrome 和 Firefox 中的当前行为,至少。