Product Craft Bible
Drag and Drop UX
Inicio Patrones de interacción Drag and Drop UX
Patrones de interacción

Drag and Drop UX

8 reglas material.io · drag and drop guidelinesdnd-kit · sortable presetsdnd-kit · sortable / rectSortingStrategymaterial.io · multi-select drag
70

Drag and Drop UX

8 reglas
608

Drop zone con borde discontinuo y acento al drag-over

La zona de destino debe anunciarse: borde 2px dashed var(--border) en reposo que pasa a var(--accent) con fondo rgba(79,70,229,.08) al detectar drag-over. Sin ese cambio el usuario no sabe si soltar ahí es válido y abandona el gesto a mitad de camino.

material.io · drag and drop guidelines
Preferir
Subir comprobante · factura_marzo.pdf
Suelta para subir
Drag-over detectado: borde dashed acento + fondo tenido
Evitar
Subir comprobante · factura_marzo.pdf
Arrastra el archivo aquí
Cursor encima ahora mismo, pero nada cambia
609

Estado dragging: sombra elevada, grabbing y origen al 0.7

El elemento arrastrado se eleva con box-shadow 0 12px 28px rgba(0,0,0,.22) y un leve scale(1.03), el cursor cambia a grabbing, y el hueco original queda como fantasma al opacity:.7. Esa tríada deja claro qué se mueve y de dónde salió.

dnd-kit · sortable presets
Preferir
Tareas · Sprint 14
Migrar auth a OAuth2 (origen)
Migrar auth a OAuth2
QA del checkout v3
Evitar
Tareas · Sprint 14
Migrar auth a OAuth2
Diseñar tabla de pricing
QA del checkout v3
610

Snap a grid en kanban con reordenamiento animado

Al cruzar un item por encima de otro, las tarjetas vecinas se desplazan con transform: translateY() en 180ms ease para abrir el hueco. El reflow animado comunica dónde caerá; un reordenamiento instantáneo sin transición desorienta al ojo.

dnd-kit · sortable / rectSortingStrategy
Preferir
En progreso
API de reportes
Onboarding wizard
Refactor de hooks
El vecino se desliza 46px para abrir hueco
Evitar
En progreso
API de reportes
Onboarding wizard
Refactor de hooks
Las cartas brincan de posición sin transición
611

Multi-selección con shift+click y badge de cantidad

Para mover varios items a la vez, shift+click rango y cmd+click individuales; al arrastrar el grupo se apila en un solo objeto con un badge circular de acento mostrando el conteo (3). Arrastrar 5 archivos uno por uno es una fricción que esta convención elimina.

material.io · multi-select drag
Preferir
Archivos · Q1_2026 · 3 seleccionados
balance.xlsx
reporte.pdf
notas.docx
balance.xlsx 3
Evitar
Archivos · Q1_2026
balance.xlsx
reporte.pdf
notas.docx
Solo seleccionas y arrastras uno a la vez
612

Cancelar drag con Escape o soltar fuera de zona válida

El usuario debe poder abortar: Escape a mitad del arrastre devuelve el item a su origen con una animación de retorno de 220ms, igual que soltar sobre una zona no válida. Un drag que sólo se confirma y nunca se cancela atrapa al usuario en una acción que ya no quiere.

react-dnd · monitor.didDrop()
Preferir
Mover evento · Reunión 1:1 con Marina
10:00, Reunión 1:1
Esc devuelve el bloque a su hora original en 220ms
Evitar
Mover evento · Reunión 1:1 con Marina
10:00, Reunión 1:1
Pulsas Escape y no pasa nada: el bloque sigue pegado al cursor
613

Éxito con animación de snap al destino, nunca teleport

Al soltar en zona válida el item recorre la distancia hasta su posición final con transition: transform 200ms cubic-bezier(.2,.9,.3,1), no aparece de golpe. El teleport rompe la continuidad espacial y obliga a re-localizar visualmente dónde quedó lo que moviste.

material.io · motion / shared axis
Preferir
Backlog
Listo
Deploy v2.4
Evitar
Backlog
(vacio)
Listo
Deploy v2.4
614

Touch drag en móvil: long press de 500ms para activar

En pantallas táctiles el drag arranca tras un long press de 500ms con feedback háptico, no al primer contacto, para no robarle el gesto al scroll vertical. Sin ese delay, deslizar la lista mueve items por accidente y el scroll se vuelve imposible.

dnd-kit · TouchSensor / activationConstraint
Preferir
Playlist
Midnight City
Resonance
Nightcall
Manten 500ms + haptico para tomar el item
Evitar
Playlist
Midnight City
Resonance
Nightcall
Intentabas hacer scroll y moviste la canción
615

Accesibilidad: flechas y Enter como alternativa al gesto

Todo drag debe tener equivalente de teclado: Enter/Espacio toma el item, flechas lo mueven posición a posición con anuncio por aria-live ("movido a posición 2 de 4"), Enter confirma. Un drag exclusivamente de mouse excluye a usuarios de teclado y lectores de pantalla.

dnd-kit · KeyboardSensor + screen reader announcements
Preferir
Orden de columnas
Estado tomado
Nombre
↑↓ mueve · Enter confirma
aria-live: "Estado movido a posición 1 de 2"
Evitar
Orden de columnas
Nombre
Estado
Sin mouse no hay forma de reordenar