El Atributo DRAGGABLE

Permite definir si un elemento puede ser arrastrado por el usuario.
El atributo draggable
en HTML permite definir si un elemento puede ser arrastrado por el usuario. Es parte de la API de Drag and Drop de HTML5, que habilita interacciones avanzadas como mover elementos, cargar archivos o transferir datos entre aplicaciones. Aquí un tutorial completo:
¿Qué hace draggable
?
Valores posibles:
draggable="true"
: El elemento puede ser arrastrado.draggable="false"
: Bloquea el arrastre (valor predeterminado para la mayoría de elementos).draggable="auto"
: Hereda el comportamiento del navegador (ej: imágenes y enlaces son arrastrables por defecto).
HTML:
<div draggable="true">¡Arrástrame!</div>
Eventos Clave para Drag and Drop
Para implementar arrastre y soltado, debes manejar estos eventos con JavaScript:
Evento | Descripción |
---|---|
dragstart |
Se dispara al comenzar a arrastrar un elemento. |
dragend |
Se dispara al soltar el elemento (éxito o cancelación). |
dragover |
Se dispara mientras un elemento arrastrado está sobre una zona de soltado. |
drop |
Se dispara al soltar el elemento en una zona de soltado válida. |
Ejemplo Práctico: Arrastrar y Soltar
HTML:
<div class="container"> <div id="draggable" draggable="true">Arrástrame</div> <div id="dropzone">Suelta aquí</div> </div>
CSS:
#draggable { width: 100px; padding: 10px; background: #4CAF50; color: white; cursor: move; } #dropzone { width: 200px; height: 200px; border: 2px dashed #ccc; margin-top: 20px; padding: 20px; } .dragging { opacity: 0.5; } .dropzone-active { background: #e3f2fd; border-color: #2196F3; }
JavaScript:
const draggable = document.getElementById('draggable'); const dropzone = document.getElementById('dropzone'); // Evento al iniciar el arrastre draggable.addEventListener('dragstart', (e) => { e.target.classList.add('dragging'); e.dataTransfer.setData('text/plain', e.target.id); // Almacena el ID del elemento }); // Evento al finalizar el arrastre draggable.addEventListener('dragend', (e) => { e.target.classList.remove('dragging'); }); // Evento mientras se arrastra sobre la zona de soltado dropzone.addEventListener('dragover', (e) => { e.preventDefault(); // Permite el soltado dropzone.classList.add('dropzone-active'); }); // Evento al salir de la zona de soltado dropzone.addEventListener('dragleave', () => { dropzone.classList.remove('dropzone-active'); }); // Evento al soltar el elemento dropzone.addEventListener('drop', (e) => { e.preventDefault(); const id = e.dataTransfer.getData('text/plain'); // Recupera el ID almacenado const elemento = document.getElementById(id); dropzone.appendChild(elemento); // Mueve el elemento a la zona dropzone.classList.remove('dropzone-active'); });
Flujo de Trabajo
-
Marcar el elemento como arrastrable:
draggable="true"
. -
Manejar
dragstart
: Almacenar datos del elemento arrastrado (usandodataTransfer
). -
Manejar
dragover
: Permitir el soltado cone.preventDefault()
. -
Manejar
drop
: Recuperar los datos y realizar la acción deseada (ej: mover el elemento).
Usos Comunes
-
Interfaces de usuario: Reordenar listas, mover elementos entre columnas.
-
Subida de archivos: Arrastrar archivos desde el escritorio a una zona de carga.
-
Juegos o aplicaciones interactivas: Puzzles, tableros de trabajo.
Buenas Prácticas
-
Feedback visual: Usa clases CSS para indicar estados (
dragging
,dropzone-active
). -
Accesibilidad: Proporciona alternativas para usuarios que no usen ratón (ej: teclado).
-
Optimiza el rendimiento: Evita operaciones costosas durante los eventos de arrastre.
Errores Comunes
Error 1: Olvidar e.preventDefault()
en dragover
dropzone.addEventListener('dragover', (e) => { e.preventDefault(); // ¡Esencial para permitir el soltado! });
Error 2: No usar dataTransfer
Si no almacenas datos, no podrás identificar el elemento arrastrado en el evento drop
.
Compatibilidad en Navegadores
-
Soportado en: Chrome, Firefox, Safari, Edge (versiones modernas).
-
Limitaciones en móviles: Algunos dispositivos táctiles requieren polyfills.
Ejemplo Avanzado: Reordenar una Lista
<ul id="lista"> <li draggable="true">Item 1</li> <li draggable="true">Item 2</li> <li draggable="true">Item 3</li> </ul> <script> document.querySelectorAll('li').forEach(item => { item.addEventListener('dragstart', (e) => { e.dataTransfer.setData('text/plain', e.target.textContent); }); item.addEventListener('dragover', (e) => { e.preventDefault(); const target = e.target.closest('li'); if (target) { const rect = target.getBoundingClientRect(); const midY = rect.top + rect.height / 2; if (e.clientY < midY) { target.parentNode.insertBefore(e.target, target); } else { target.parentNode.insertBefore(e.target, target.nextSibling); } } }); }); </script>
Conclusión
El atributo draggable
y la API de Drag and Drop abren la puerta a interfaces de usuario dinámicas y profesionales. Con prácticas como el feedback visual y el manejo correcto de eventos, puedes crear experiencias intuitivas y atractivas. ¡Experimenta y lleva tu web al siguiente nivel!