我实现了一个填字游戏生成器.它生成一个带有每行单词和每单元格字母的填字游戏,并且关键字标有更宽的边框和灰色背景,如图中所示:

为此,我生成的代码大致如下:
#crossword {
border-spacing: 0px;
border-collapse:collapse;
}
.word {
vertical-align: middle;
align-items: center;
text-align: center;
justify-content: center;
margin: 0;
padding: 0;
}
.cell {
width: 30px;
height: 30px;
margin: 0;
padding: 0;
}
.letter {
border: 1px solid black;
}
.keyword {
border-width: 2px;
background-color: gray;
}Run Code Online (Sandbox Code Playgroud)
<table id="crossword">
<tr class="word">
<td class="cell letter">W</td>
<td class="cell letter keyword">C</td>
<td class="cell letter">A</td>
</tr>
</table>Run Code Online (Sandbox Code Playgroud)
我的问题是图像中的红色椭圆标记 - 关键字的边框,比其余部分宽1px,打破了填字游戏的顶部和底部线条.我尝试删除border-collapse属性,但这导致每个行连接上出现双边框.
目前我使用table,tr并且td用于生成,但如果有使用divs 的解决方案,我将很乐意切换.
所以我的问题是:假设我能够唯一地处理每个单元格(包括向它们添加特殊类等),如何使顶部和底部边框出现在关键字单元格内而不是外部?
我找到了一个使用的解决方案box-shadow,但它并不是真正的跨浏览器,并且涉及很多魔法,所以如果可能的话我宁愿避免使用它.
使用以下命令保持表格的最外边框与表格的默认边框相匹配
table#crossword tr:first-child td {
border-top: 1px solid black;
}
table#crossword tr:last-child td {
border-bottom: 1px solid black;
}
table#crossword tr td:first-child {
border-left: 1px solid black;
}
table#crossword tr td:last-child {
border-right: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
它看起来有点低,但是除了这个之外你没有其他选择来使最外层边框均匀对齐
演示
table#crossword tr:first-child td {
border-top: 1px solid black;
}
table#crossword tr:last-child td {
border-bottom: 1px solid black;
}
table#crossword tr td:first-child {
border-left: 1px solid black;
}
table#crossword tr td:last-child {
border-right: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
#crossword {
border-spacing: 0px;
border-collapse:collapse;
}
.word {
vertical-align: middle;
align-items: center;
text-align: center;
justify-content: center;
margin: 0;
padding: 0;
}
.cell {
width: 30px;
height: 30px;
margin: 0;
padding: 0;
}
.letter {
border: 1px solid black;
}
.keyword {
border-width: 2px;
background-color: gray;
}
table#crossword tr:first-child td {
border-top: 1px solid black;
}
table#crossword tr:last-child td {
border-bottom: 1px solid black;
}
table#crossword tr td:first-child {
border-left: 1px solid black;
}Run Code Online (Sandbox Code Playgroud)