JavaScript实现Kanban拖拽功能需用原生drag and drop API:1.卡片设draggable="true",列容器加data-column-id并阻止默认行为;2. dragstart中存taskId和fromColumn到dataTransfer;3. drop时移动DOM并更新任务状态;4. 用dragenter/leave加视觉反馈,限制非法拖拽。

JavaScript 实现 Kanban 看板的拖拽功能,核心是利用原生 drag and drop API(draggable 属性 + dragstart/dragover/drop 等事件),配合 DOM 操作更新任务卡片位置。不依赖第三方库也能做得清晰可靠。
1. 结构准备:HTML 布局要支持拖拽语义
每个任务卡片需设置 draggable="true";每列(如 To Do / In Progress / Done)作为可放置区域,需阻止默认行为并监听 drop:
- 看板容器用
display: flex横向排列列容器 - 每列用
data-column-id标识状态(如"todo"、"doing") - 每张卡片用
data-task-id存唯一 ID,便于后续更新数据
2. 拖拽初始化:绑定 dragstart 并携带数据
在卡片上监听 dragstart,把任务 ID 和源列 ID 存入 dataTransfer:
card.addEventListener('dragstart', (e) => {
const taskId = card.dataset.taskId;
const fromColumn = card.closest('[data-column-id]').dataset.columnId;
e.dataTransfer.setData('text/plain', taskId);
e.dataTransfer.setData('application/json', JSON.stringify({ taskId, fromColumn }));
});
这样目标列就能知道“谁被拖来了”以及“从哪来的”,方便做状态更新或权限校验。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
3. 放置目标处理:允许放入 + 执行移动逻辑
列容器需同时监听 dragover(取消默认禁止)和 drop(执行插入):
-
dragover中必须调用e.preventDefault(),否则drop不会触发 -
drop中读取dataTransfer,移除原卡片 DOM,追加到当前列末尾(或按需插入到某位置) - 同步更新内存中的任务数据(如数组里修改
status字段)
示例关键逻辑:
column.addEventListener('drop', (e) => {
e.preventDefault();
const { taskId, fromColumn } = JSON.parse(e.dataTransfer.getData('application/json'));
const taskCard = document.querySelector(`[data-task-id="${taskId}"]`);
const targetColumn = e.target.closest('[data-column-id]');
if (taskCard && targetColumn && targetColumn !== taskCard.closest('[data-column-id]')) {
targetColumn.appendChild(taskCard); // 移动 DOM
updateTaskStatus(taskId, targetColumn.dataset.columnId); // 更新业务数据
}
});
4. 增强体验:添加视觉反馈与边界判断
纯功能可用,但用户需要明确感知“能放”或“不能放”:
- 在
dragenter时给列加临时 class(如drop-active),用 CSS 高亮背景边框 - 在
dragleave时移除该 class - 若限制某些列之间不可互拖(如 Done 列不允许拖出),可在
dragstart或drop中加条件判断并提前 return
小技巧:用 CSS ::after 或伪元素显示“+ 添加任务”提示,让空列也支持拖入。

















