implementing-drag-drop
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDrag-and-Drop & Sortable Interfaces
拖拽与可排序界面
Purpose
用途
This skill helps implement drag-and-drop interactions and sortable interfaces using modern React/TypeScript libraries. It covers accessibility-first approaches, touch support, and performance optimization for creating intuitive direct manipulation UIs.
本技能可帮助你使用现代React/TypeScript库实现拖拽交互与可排序界面。内容涵盖无障碍优先方案、触控支持以及性能优化,助力打造直观的直接操作型UI。
When to Use
适用场景
Invoke this skill when:
- Building Trello-style kanban boards with draggable cards between columns
- Creating sortable lists with drag handles for priority ordering
- Implementing file upload zones with visual drag-and-drop feedback
- Building reorderable grids for dashboard widgets or galleries
- Creating visual builders with node-based interfaces
- Implementing any UI requiring spatial reorganization through direct manipulation
在以下场景中调用本技能:
- 构建Trello风格的看板,支持卡片在列间拖拽
- 创建带拖拽手柄的可排序列表,用于优先级排序
- 实现带视觉拖拽反馈的文件上传区域
- 构建用于仪表板组件或画廊的可重排网格
- 创建基于节点的可视化构建器界面
- 实现任何需要通过直接操作进行空间重组的UI
Core Patterns
核心模式
Sortable Lists
可排序列表
Reference for:
references/dnd-patterns.md- Vertical lists with drag handles
- Horizontal lists for tab/carousel reordering
- Grid layouts with 2D dragging
- Auto-scrolling near edges
参考获取:
references/dnd-patterns.md- 带拖拽手柄的垂直列表
- 用于标签页/轮播重排序的水平列表
- 支持2D拖拽的网格布局
- 边缘自动滚动
Kanban Boards
看板
Reference for:
references/kanban-implementation.md- Multi-column boards with cards
- WIP limits and swimlanes
- Card preview on hover
- Column management (add/remove/collapse)
参考获取:
references/kanban-implementation.md- 带卡片的多列看板
- 在制品(WIP)限制与泳道
- 悬停时的卡片预览
- 列管理(添加/删除/折叠)
File Upload Zones
文件上传区域
Reference for:
references/file-dropzone.md- Visual feedback states
- File type validation
- Multi-file handling
- Progress indicators
参考获取:
references/file-dropzone.md- 视觉反馈状态
- 文件类型验证
- 多文件处理
- 进度指示器
Accessibility
无障碍设计
Reference for:
references/accessibility-dnd.md- Keyboard navigation patterns
- Screen reader announcements
- Alternative UI approaches
- ARIA attributes
参考获取:
references/accessibility-dnd.md- 键盘导航模式
- 屏幕阅读器播报
- 替代UI方案
- ARIA属性
Library Selection
库选择
Primary: dnd-kit
首选:dnd-kit
Modern, accessible, and performant drag-and-drop for React.
Reference for:
references/library-guide.md- Library comparison (dnd-kit vs alternatives)
- Installation and setup
- Core concepts and API
- Migration from react-beautiful-dnd
适用于React的现代化、无障碍且高性能的拖拽库。
参考获取:
references/library-guide.md- 库对比(dnd-kit vs 其他替代方案)
- 安装与设置
- 核心概念与API
- 从react-beautiful-dnd迁移
Key Features
核心特性
- Built-in accessibility support
- Touch, mouse, and keyboard input
- Zero dependencies (~10KB core)
- Highly customizable
- TypeScript native
- 内置无障碍支持
- 支持触控、鼠标与键盘输入
- 零依赖(核心约10KB)
- 高度可定制
- 原生支持TypeScript
Implementation Workflow
实现流程
Step 1: Analyze Requirements
步骤1:分析需求
Determine the drag-and-drop pattern needed:
- Simple list reordering → Sortable list pattern
- Multi-container movement → Kanban pattern
- File handling → Dropzone pattern
- Complex interactions → Visual builder pattern
确定所需的拖拽模式:
- 简单列表重排序 → 可排序列表模式
- 多容器间移动 → 看板模式
- 文件处理 → 上传区域模式
- 复杂交互 → 可视化构建器模式
Step 2: Set Up Library
步骤2:设置库
Install required packages:
bash
npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities安装所需包:
bash
npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilitiesStep 3: Implement Core Functionality
步骤3:实现核心功能
Use examples as starting points:
- for basic lists
examples/sortable-list.tsx - for multi-column boards
examples/kanban-board.tsx - for file uploads
examples/file-dropzone.tsx - for grid layouts
examples/grid-reorder.tsx
以示例为起点:
- :基础列表
examples/sortable-list.tsx - :多列看板
examples/kanban-board.tsx - :文件上传
examples/file-dropzone.tsx - :网格布局
examples/grid-reorder.tsx
Step 4: Add Accessibility
步骤4:添加无障碍支持
Reference to:
references/accessibility-dnd.md- Implement keyboard navigation
- Add screen reader announcements
- Provide alternative controls
- Test with assistive technologies
Run to check implementation.
scripts/validate_accessibility.js参考完成:
references/accessibility-dnd.md- 实现键盘导航
- 添加屏幕阅读器播报
- 提供替代控件
- 使用辅助技术测试
运行检查实现效果。
scripts/validate_accessibility.jsStep 5: Optimize Performance
步骤5:优化性能
For lists with >100 items:
- Reference
references/performance-optimization.md - Implement virtual scrolling
- Use for efficient calculations
scripts/calculate_drop_position.js
针对超过100条数据的列表:
- 参考
references/performance-optimization.md - 实现虚拟滚动
- 使用进行高效计算
scripts/calculate_drop_position.js
Step 6: Style with Design Tokens
步骤6:使用设计令牌设置样式
Apply theming using the design-tokens skill:
- Reference design token variables
- Implement drag states (hovering, dragging, dropping)
- Add visual feedback and animations
借助设计令牌技能应用主题:
- 参考设计令牌变量
- 实现拖拽状态(悬停、拖拽中、放置)
- 添加视觉反馈与动画
Mobile & Touch Support
移动端与触控支持
Reference for:
references/touch-support.md- Long press to initiate drag
- Preventing scroll during drag
- Touch-friendly hit areas (44px minimum)
- Gesture conflict resolution
参考获取:
references/touch-support.md- 长按触发拖拽
- 拖拽期间禁止滚动
- 触控友好的点击区域(最小44px)
- 手势冲突解决
State Management
状态管理
Reference for:
references/state-management.md- Managing drag state in React
- Optimistic updates
- Undo/redo functionality
- Persisting order changes
参考获取:
references/state-management.md- 在React中管理拖拽状态
- 乐观更新
- 撤销/重做功能
- 持久化排序变更
Scripts
脚本
Calculate Drop Position
计算放置位置
Run to:
scripts/calculate_drop_position.js- Determine valid drop zones
- Calculate insertion indices
- Handle edge cases
运行可:
scripts/calculate_drop_position.js- 确定有效放置区域
- 计算插入索引
- 处理边缘情况
Generate Configuration
生成配置
Run to:
scripts/generate_dnd_config.js- Create dnd-kit configuration
- Set up sensors and modifiers
- Configure animations
运行可:
scripts/generate_dnd_config.js- 创建dnd-kit配置
- 设置传感器与修饰器
- 配置动画
Validate Accessibility
验证无障碍性
Run to:
scripts/validate_accessibility.js- Check keyboard navigation
- Verify ARIA attributes
- Test screen reader compatibility
运行可:
scripts/validate_accessibility.js- 检查键盘导航
- 验证ARIA属性
- 测试屏幕阅读器兼容性
Examples
示例
Each example includes complete TypeScript code with accessibility:
每个示例均包含完整的TypeScript代码,并支持无障碍:
Sortable List
可排序列表
examples/sortable-list.tsx- Vertical list with drag handles
- Keyboard navigation (Space/Enter to grab, arrows to move)
- Screen reader announcements
examples/sortable-list.tsx- 带拖拽手柄的垂直列表
- 键盘导航(按空格/Enter抓取,方向键移动)
- 屏幕阅读器播报
Kanban Board
看板
examples/kanban-board.tsx- Multiple columns with draggable cards
- Card movement between columns
- Column management features
- WIP limits
examples/kanban-board.tsx- 多列布局,支持卡片拖拽
- 卡片在列间移动
- 列管理功能
- 在制品(WIP)限制
File Dropzone
文件上传区域
examples/file-dropzone.tsx- Drag files to upload
- Visual feedback states
- File type validation
- Upload progress
examples/file-dropzone.tsx- 拖拽文件上传
- 视觉反馈状态
- 文件类型验证
- 上传进度
Grid Reorder
网格重排
examples/grid-reorder.tsx- 2D grid dragging
- Auto-layout on drop
- Responsive breakpoints
examples/grid-reorder.tsx- 2D网格拖拽
- 放置时自动布局
- 响应式断点
Assets
资源
TypeScript Types
TypeScript类型定义
assets/drag-state-types.ts- Type definitions for drag state
- Event handler types
- Configuration interfaces
assets/drag-state-types.ts- 拖拽状态的类型定义
- 事件处理函数类型
- 配置接口
Configuration Schema
配置Schema
assets/dnd-config-schema.json- Valid configuration options
- Sensor settings
- Animation parameters
assets/dnd-config-schema.json- 有效的配置选项
- 传感器设置
- 动画参数
Best Practices
最佳实践
Visual Feedback
视觉反馈
- Show drag handles (⋮⋮) to indicate draggability
- Change cursor (grab → grabbing)
- Display drop zone placeholders
- Make dragged items semi-transparent
- Highlight valid drop targets
- 显示拖拽手柄(⋮⋮)以标识可拖拽性
- 更改光标样式(grab → grabbing)
- 显示放置区域占位符
- 拖拽中的元素设为半透明
- 高亮有效放置目标
Performance
性能
- Use CSS transforms, not position properties
- Apply for animations
will-change: transform - Throttle drag events for large lists
- Implement virtual scrolling when needed
- 使用CSS transform而非position属性
- 为动画添加
will-change: transform - 对大型列表的拖拽事件进行节流
- 必要时实现虚拟滚动
Accessibility First
无障碍优先
- Always provide keyboard alternatives
- Include screen reader announcements
- Test with NVDA/JAWS/VoiceOver
- Provide non-drag alternatives (buttons/forms)
- 始终提供键盘替代方案
- 包含屏幕阅读器播报
- 使用NVDA/JAWS/VoiceOver测试
- 提供非拖拽式替代操作(按钮/表单)
Error Handling
错误处理
- Show invalid drop feedback
- Implement undo functionality
- Auto-save after successful drops
- Handle network failures gracefully
- 显示无效放置的反馈
- 实现撤销功能
- 成功放置后自动保存
- 优雅处理网络故障
Common Pitfalls
常见陷阱
Avoid These Issues
需避免的问题
- Forgetting keyboard navigation
- Missing touch support
- Not preventing scroll during drag
- Ignoring accessibility
- Poor performance with large lists
- 遗漏键盘导航
- 缺失触控支持
- 未在拖拽期间禁止滚动
- 忽略无障碍设计
- 大型列表性能不佳
Solutions
解决方案
Reference the appropriate guide for each issue:
- Accessibility →
references/accessibility-dnd.md - Touch →
references/touch-support.md - Performance →
references/performance-optimization.md - State →
references/state-management.md
针对每个问题参考对应指南:
- 无障碍 →
references/accessibility-dnd.md - 触控 →
references/touch-support.md - 性能 →
references/performance-optimization.md - 状态 →
references/state-management.md
Testing Checklist
测试清单
Before deployment, verify:
- Keyboard navigation works completely
- Screen readers announce all actions
- Touch devices can drag smoothly
- Performance acceptable with expected data volume
- Visual feedback clear and responsive
- Undo/redo functionality works
- Alternative UI provided for accessibility
- Works across all target browsers
部署前请验证:
- 键盘导航完全可用
- 屏幕阅读器播报所有操作
- 触控设备可流畅拖拽
- 在预期数据量下性能可接受
- 视觉反馈清晰且响应及时
- 撤销/重做功能正常
- 为无障碍提供了替代UI
- 在所有目标浏览器中正常运行
Next Steps
后续步骤
After implementing basic drag-and-drop:
- Add advanced features (auto-scroll, multi-select)
- Implement gesture support for mobile
- Add animation polish with Framer Motion
- Create custom drag preview components
- Build complex interactions (nested dragging)
实现基础拖拽功能后:
- 添加高级功能(自动滚动、多选)
- 为移动端实现手势支持
- 使用Framer Motion优化动画
- 创建自定义拖拽预览组件
- 构建复杂交互(嵌套拖拽)