vue实现滑动拼图
Vue 实现滑动拼图的方法
核心思路
滑动拼图的核心逻辑是通过拖动拼图块到空白位置完成交换,最终实现图片的完整拼接。Vue 的响应式特性可以简化状态管理和 DOM 更新。
实现步骤
1. 初始化拼图数据
使用 Vue 的 data 或 ref 存储拼图状态,包括拼图块的二维数组和空白块的位置:
const puzzle = ref([
[1, 2, 3],
[4, 5, 6],
[7, 8, null] // null 表示空白块
]);
const emptyPos = { row: 2, col: 2 };
2. 渲染拼图界面
通过 v-for 循环生成拼图网格,并为每个拼图块绑定点击或拖拽事件:

<div class="puzzle-container">
<div
v-for="(row, rowIndex) in puzzle"
:key="rowIndex"
class="puzzle-row"
>
<div
v-for="(tile, colIndex) in row"
:key="colIndex"
class="puzzle-tile"
@click="handleTileClick(rowIndex, colIndex)"
>
{{ tile }}
</div>
</div>
</div>
3. 处理拼图块点击事件 检查点击的拼图块是否与空白块相邻,如果是则交换位置:
function handleTileClick(row, col) {
const isAdjacent =
(Math.abs(row - emptyPos.row) === 1 && col === emptyPos.col) ||
(Math.abs(col - emptyPos.col) === 1 && row === emptyPos.row);
if (isAdjacent) {
// 交换拼图块与空白块
puzzle.value[emptyPos.row][emptyPos.col] = puzzle.value[row][col];
puzzle.value[row][col] = null;
emptyPos.row = row;
emptyPos.col = col;
}
}
4. 添加拖拽功能(可选) 通过 HTML5 的拖拽 API 实现更自然的交互:

<div
draggable="true"
@dragstart="handleDragStart(rowIndex, colIndex)"
@dragover.prevent
@drop="handleDrop(rowIndex, colIndex)"
></div>
function handleDragStart(row, col) {
event.dataTransfer.setData('text/plain', `${row},${col}`);
}
function handleDrop(row, col) {
const [srcRow, srcCol] = event.dataTransfer.getData('text/plain').split(',');
if (isAdjacent(srcRow, srcCol, row, col)) {
swapTiles(srcRow, srcCol, row, col);
}
}
5. 校验拼图完成 每次移动后检查拼图是否按顺序排列:
function checkCompletion() {
let expectedValue = 1;
for (const row of puzzle.value) {
for (const tile of row) {
if (tile !== null && tile !== expectedValue++) {
return false;
}
}
}
return true;
}
样式与交互优化
- 使用 CSS Grid 或 Flexbox 布局拼图容器
- 为拼图块添加过渡动画提升用户体验
- 实现随机打乱拼图的初始化逻辑
完整示例扩展
可通过图片分割实现更真实的拼图效果,将图片切割为网格后为每个拼图块设置对应的背景位置。
通过上述方法,可以快速实现一个基于 Vue 的滑动拼图游戏,核心逻辑清晰且易于扩展。






