Command Palette

Search for a command to run...

Drag & Drop API: Arrastrar y Soltar Archivos

Aprende a implementar funcionalidad de arrastrar y soltar usando la API nativa Drag & Drop para archivos y elementos en el navegador.

Lectura: 15 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Drag & Drop API permite arrastrar y soltar archivos en el navegador
  • Usa eventos dragstart, dragover y drop para controlar el proceso
  • DataTransfer object contiene los archivos y datos arrastrados
  • preventDefault() en dragover es obligatorio para permitir el drop
  • La API funciona tanto para archivos como para elementos del DOM

Introducción a Drag & Drop API

La API Drag & Drop permite a los usuarios arrastrar elementos y soltarlos en ubicaciones específicas. Es especialmente útil para subir archivos de forma intuitiva, reordenar listas, mover elementos entre contenedores y crear interfaces más interactivas y naturales.

Esta API está disponible en todos los navegadores modernos y no requiere librerías externas. Funciona tanto para arrastrar archivos desde el sistema operativo como para mover elementos dentro de la página web. La implementación correcta requiere manejar varios eventos y entender el comportamiento por defecto del navegador.

  • Subir archivos arrastrándolos desde el escritorio o explorador
  • Reordenar elementos en listas y tableros (drag & drop interno)
  • Mover elementos entre diferentes contenedores
  • Implementar interfaces tipo 'copiar y pegar' con arrastrar
  • Crear zonas de drop visuales con feedback visual

Diferencia con HTML5 Drag & Drop

La API Drag & Drop es diferente de la API de arrastre de archivos del sistema operativo. HTML5 Drag & Drop funciona dentro del navegador, mientras que la API de archivos específica maneja la lectura de archivos una vez que se han soltado.

¿Qué es Drag & Drop API?

Drag & Drop API es un conjunto de eventos que permiten controlar el proceso de arrastrar y soltar elementos. El navegador tiene un comportamiento por defecto que impide soltar elementos en ciertas áreas, por lo que necesitas prevenir este comportamiento con preventDefault() en los eventos apropiados.

Eventos de Drag

Los eventos de drag se disparan en el elemento que se está arrastrando. dragstart es el más importante porque es donde configuras los datos que se transferirán y el efecto visual que se mostrará mientras se arrastra.

  • <strong>dragstart</strong> - Se dispara al comenzar a arrastrar un elemento
  • <strong>drag</strong> - Se dispara continuamente mientras se arrastra
  • <strong>dragend</strong> - Se dispara cuando termina el arrastre (soltado o cancelado)
eventos-drag.js
Loading code...

dragstart se dispara cuando el usuario comienza a arrastrar un elemento. Es aquí donde usas setData() para transferir datos y setDragImage() para personalizar la imagen que aparece mientras se arrastra. dragend se dispara cuando se completa la operación, independientemente de si se soltó o no.

Eventos de Drop

Los eventos de drop se disparan en el elemento donde se suelta. dragover es crítico porque el navegador por defecto impide soltar elementos. Debes llamar a preventDefault() en dragover para permitir el drop en esa zona.

eventos-drop.js
Loading code...

dragover se dispara continuamente mientras el elemento arrastrado está sobre la zona de drop. Es el lugar ideal para añadir clases CSS que proporcionen feedback visual al usuario. drop se dispara cuando se suelta el elemento y es donde procesas los datos transferidos.

preventDefault() es obligatorio

Sin preventDefault() en dragover, el navegador no permitirá el drop. Este es el error más común al implementar Drag & Drop. También necesitas preventDefault() en drop para evitar que el navegador abra el archivo directamente.

Implementar Zona de Drop para Archivos

Una zona de drop para archivos permite a los usuarios subir archivos arrastrándolos desde el explorador de archivos o el escritorio. Esta funcionalidad mejora significativamente la experiencia de usuario porque es más intuitiva que navegar por directorios para seleccionar archivos.

zona-drop-archivos.js
Loading code...

Este ejemplo implementa una zona de drop completa con feedback visual. Cuando el usuario arrastra un archivo sobre la zona, se añade una clase que cambia el estilo para indicar que puede soltar. Al soltar, se accede a los archivos a través de dataTransfer.files y se procesan con FileReader.

DataTransfer Object

El objeto DataTransfer contiene los datos que se transfieren durante una operación de drag & drop. Está disponible en los eventos dragstart, drop y otros eventos relacionados. Puedes usarlo para transferir texto, URLs, archivos y datos personalizados entre elementos.

data-transfer.js
Loading code...

setData() almacena datos en el objeto DataTransfer durante dragstart. El primer parámetro es el tipo MIME del dato y el segundo es el valor. getData() recupera estos datos en el evento drop. Para archivos, accedes directamente a la propiedad files que es una FileList.

Tipos de datos comunes

text/plain - Texto simple
text/html - HTML
text/uri-list - URLs
application/json - JSON
Para archivos: usa la propiedad files directamente

Arrastrar Elementos del DOM

Además de archivos, puedes arrastrar elementos del DOM como divs, imágenes o cualquier elemento HTML. Esto es útil para implementar funcionalidades como reordenar listas, mover elementos entre contenedores o crear interfaces tipo tablero kanban.

arrastrar-elementos.js
Loading code...

Este ejemplo muestra cómo arrastrar elementos entre dos listas. Cada elemento tiene el atributo draggable="true" para que sea arrastrable. Al soltar, el elemento se mueve al nuevo contenedor. Puedes extender este patrón para implementar reordenamiento dentro de la misma lista.

Mejoras de Experiencia de Usuario

Una implementación básica de Drag & Drop funciona, pero añadir mejoras de UX hace la diferencia entre una funcionalidad usable y una excelente. El feedback visual, las animaciones y las indicaciones claras mejoran significativamente la experiencia del usuario.

mejoras-ux.js
Loading code...

Este ejemplo añade varias mejoras: feedback visual al arrastrar sobre la zona, indicación del tipo de archivo aceptado, y manejo de errores. También muestra cómo prevenir el comportamiento por defecto del navegador que abriría el archivo directamente al soltarlo.

Animaciones y transiciones

Usa transiciones CSS para hacer las zonas de drop más atractivas. Por ejemplo, anima el cambio de color de fondo cuando el usuario arrastra un archivo sobre la zona. Esto hace la interfaz más responsiva y agradable.

Errores Comunes

Al implementar Drag & Drop, hay varios errores comunes que puedes encontrar. Conocerlos de antemano te ayudará a evitar problemas y a crear implementaciones más robustas.

errores-comunes.js
Loading code...

El primer error ocurre cuando olvidas preventDefault() en dragover, lo que impide el drop. El segundo muestra el problema de no validar el tipo de archivo antes de procesarlo. El tercero demuestra cómo manejar correctamente el caso cuando el usuario arrastra algo que no es un archivo.

Validar siempre los archivos

Nunca asumas que lo que el usuario arrastra es un archivo válido. Siempre valida el tipo MIME, el tamaño y el contenido antes de procesar los archivos. Esto previene ataques de seguridad y errores inesperados.

Resumen: Drag & Drop API

Conceptos principales:

  • Drag & Drop API permite arrastrar y soltar elementos y archivos
  • DataTransfer object contiene los datos transferidos
  • dragstart configura los datos, dragover permite el drop
  • preventDefault() en dragover es obligatorio para permitir drop
  • La API funciona tanto para archivos como para elementos del DOM

Mejores prácticas:

  • Siempre llama a preventDefault() en dragover y drop
  • Proporciona feedback visual durante el arrastre
  • Valida el tipo MIME y tamaño de los archivos antes de procesar
  • Usa dragenter y dragleave para animaciones de entrada/salida
  • Maneja el caso cuando el usuario arrastra algo que no es un archivo