用 布局填字游戏最稳,因其天然支持行列对齐、跨格与单元格独立样式;需设 border-collapse: collapse、黑格固定尺寸、编号绝对定位、contenteditable 替代 input,并基于坐标结构管理线索与校验。

用 <table> 布局格子最稳,别碰 CSS Grid 做交点对齐
<p>填字游戏核心是「字母格 + 黑格 + 编号 + 交叉约束」,<code><table> 天然支持行列对齐、跨格(<code>rowspan/colspan)、单元格独立样式,比纯 CSS Grid 或 Flex 容易控制交点逻辑。很多教程强行用 Grid,结果编号位置飘、黑格宽高不一致、打印时错位——本质是没处理好单元格 box-sizing 和 border-collapse。
实操建议:
- 用
<table class="crossword"> 包裹,<code>border-collapse: collapse必加,避免默认间距破坏网格对齐 - 每个格子用
<td>,黑格设 <code>background-color: #000+width: 1.5em; height: 1.5em(固定尺寸,禁用百分比) - 编号写在格子左上角:用
<div class="number">5</div>绝对定位,父<td> 设 <code>position: relative - 不要给
<td> 设 <code>padding,改用line-height控制输入框垂直居中contenteditable比<input>更适合单格输入填字游戏要支持方向切换(横/竖)、光标跳格、退格跨格、粘贴多字母——
<input type="text">在单格里会卡死这些交互;contenteditable="true"配合<td> 可自然继承焦点流和原生编辑行为。 <p>常见错误现象:</p> <ul> <li>按方向键光标出格后无法自动进下一格(没监听 <code>keydown的ArrowRight等事件) - 粘贴字符串(如 "HELLO")只塞进第一个格(没手动切分并分发到后续空格)
- 退格删空当前格后,焦点没回退到前一格(尤其横竖交叉处逻辑混乱)
关键处理点:
- 所有可编辑
<td> 统一加 <code>contenteditable="true"和spellcheck="false" - 监听
keydown:捕获Backspace/Delete后,用document.execCommand('deleteContentBackward')或手动清空 + 移动焦点 - 粘贴时阻止默认行为,取
event.clipboardData.getData('text'),按当前方向逐字符填入后续格子(需提前算好有效格序列)
横/竖线索数据结构必须带「起始坐标 + 方向 + 长度」,别只存文字
渲染线索列表只是表象,真正影响交互的是:用户点击线索时,要高亮对应格子;输入时要校验是否在当前方向连续;交点格要同步更新横竖两个答案。如果线索数据只有 { id: 3, text: "一种编程语言" },根本没法定位和联动。
正确结构示例:
{
"across": [
{
"id": 1,
"text": "前端框架(缩写)",
"start": [0, 0],
"direction": "across",
"length": 3
}
],
"down": [
{
"id": 2,
"text": "HTML 标签名",
"start": [0, 0],
"direction": "down",
"length": 4
}
]
}
使用场景:
- 点击线索 1 → 遍历从
[0,0]开始向右 3 格,加class="highlight" - 当前焦点在
[0,1],按Tab切方向 → 查找包含该坐标的down条目,跳转到其start并沿列向下走 - 填完
[0,0],它同时属于 across-1 和 down-2 → 触发两个线索的实时校验(比如比对答案数组)
校验逻辑放在「失焦」和「提交」两处,别用实时 input 事件
填字游戏校验不是拼写检查,而是比对预设答案与用户填写内容是否完全匹配(含大小写、空格)。如果每敲一个字母就跑一次全量比对,尤其格子多时(20×20),UI 会明显卡顿,且用户还没输完就报错,体验极差。
性能 / 兼容性影响:
-
input事件在 iOS Safari 上有延迟,且触发频繁(中文输入法组合过程也会触发) - Chrome 对长表格中大量
contenteditable元素的input事件响应变慢 - 失焦(
blur)更符合用户意图:填完一词再确认
实操建议:
- 每个可编辑
<td> 监听 <code>blur:取出本格及同线索后续格的值,拼成字符串,与answers.across[id]比较 - 提交按钮点击时,遍历所有线索,批量校验并高亮错误格(用
classList.add("error")) - 答案数组用二维字符数组存储(
answerGrid[y][x]),比查 JSON 更快定位交点字符
交点格的同步更新和方向切换时的焦点计算,是多数人卡住的地方——它们依赖坐标映射的准确性,而不是 DOM 操作技巧。写死格子数或硬编码线索顺序,后面换题库就全得重写。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











