El Atributo ONDRAGLEAVE

Es parte de la API de Drag and Drop de HTML5 y se activa cuando un elemento arrastrable abandona los límites de una zona de destino válida.
El atributo ondragleave
es parte de la API de Drag and Drop de HTML5 y se activa cuando un elemento arrastrable abandona los límites de una zona de destino válida. Es esencial para restablecer estilos o estados modificados durante el arrastre, garantizando una experiencia de usuario fluida y coherente.
¿Qué hace ondragleave
?
Disparador:
Cuando un elemento arrastrable sale de una zona de destino (drop target) después de haber entrado en ella.
Propósito principal:
-
Revertir cambios visuales aplicados al entrar en la zona (
ondragenter
). -
Limpiar estados temporales o indicadores de interacción.
Relación con otros eventos:
-
ondragenter
: Cuando el elemento entra en la zona. -
ondragover
: Mientras el elemento está sobre la zona (requieree.preventDefault()
para permitir el drop). -
ondragleave
: Cuando el elemento sale de la zona. -
ondrop
: Al soltar el elemento en la zona.
Sintaxis básica
Como atributo HTML:
<div id="zonaDestino" ondragenter="resaltarZona()" ondragleave="restaurarZona()" > Suelta aquí </div>
Con JavaScript (recomendado para mayor control):
const zona = document.getElementById("zonaDestino"); zona.addEventListener("dragenter", () => { zona.style.background = "#e3f2fd"; // Resaltar al entrar }); zona.addEventListener("dragleave", () => { zona.style.background = "white"; // Restaurar al salir });
Ejemplos prácticos
Ejemplo 1: Cambio de estilo básico
<div class="drop-zone" ondragenter="this.style.border = '3px dashed #2196F3'" ondragleave="this.style.border = '2px dashed #ccc'" ondragover="event.preventDefault()" > Arrastra archivos aquí </div> <style> .drop-zone { width: 300px; height: 200px; border: 2px dashed #ccc; margin: 20px; } </style>
Ejemplo 2: Sistema de carrito de compras
<div class="item" draggable="true">???? Producto</div> <div id="carrito" ondragenter="this.classList.add('resaltado')" ondragleave="this.classList.remove('resaltado')" ondragover="event.preventDefault()" > Carrito de compras </div> <script> document.getElementById("carrito").addEventListener("drop", (e) => { e.preventDefault(); e.target.innerHTML += "<div>Producto añadido</div>"; e.target.classList.remove("resaltado"); }); </script> <style> .resaltado { background: #fff3e0; border: 2px solid #ff9800 !important; } </style>
Diferencias entre eventos de arrastre
Evento | Descripción | Momento de activación |
---|---|---|
ondragenter |
Elemento entra en la zona de destino | 1 vez al entrar |
ondragover |
Elemento se mueve dentro de la zona | Continuamente |
ondragleave |
Elemento sale de la zona | 1 vez al salir |
ondrop |
Elemento se suelta en la zona | Al finalizar el arrastre |
Mejores prácticas
Restaurar estados visuales:
Siempre revierte los cambios hechos en ondragenter
:
zona.addEventListener("dragleave", () => { zona.style.opacity = "1"; });
Manejar jerarquías de elementos:
Si la zona de destino contiene elementos hijos, usa event.relatedTarget
para evitar activar ondragleave
al moverse entre padres e hijos:
zona.addEventListener("dragleave", (e) => { if (!zona.contains(e.relatedTarget)) { zona.style.background = "white"; } });
Accesibilidad:
Añade mensajes para lectores de pantalla con aria-live
:
<div id="zona" aria-live="polite" ondragleave="document.getElementById('mensaje').textContent = ''" > <p id="mensaje"></p> </div>
Casos avanzados
Validación de tipo de archivo:
<div id="dropZone" ondragenter="validarArchivo(event)" ondragleave="limpiarAlerta()" > Arrastra solo imágenes (.png, .jpg) </div> <p id="alerta"></p> <script> function validarArchivo(e) { const tiposPermitidos = ["image/png", "image/jpeg"]; const archivo = e.dataTransfer.items[0]?.type; if (archivo && !tiposPermitidos.includes(archivo)) { document.getElementById("alerta").textContent = "Formato no válido"; e.preventDefault(); } } function limpiarAlerta() { document.getElementById("alerta").textContent = ""; } </script>
Errores comunes
<!-- MAL: No prevenir el comportamiento predeterminado en ondragover --> <div ondragenter="resaltar()" ondragleave="restaurar()" <!-- ¡Falta ondragover! --> ></div> <!-- CONFUSIÓN: Usar ondragleave en elementos no drop targets --> <span ondragleave="...">Esto no es una zona de destino</span> <!-- OLVIDAR restaurar estados --> <div ondragenter="this.style.border = 'red'" <!-- ¡El borde queda rojo para siempre! --> ></div>
Compatibilidad
Navegador | Soporte | Notas |
---|---|---|
Chrome | ✅ Todas versiones | |
Firefox | ✅ Todas versiones | |
Safari | ✅ v10+ | |
Edge | ✅ Todas versiones | |
Móviles | ⚠️ Soporte parcial | Requiere toques largos y manejo de eventos táctiles |
Conclusión
El atributo ondragleave
es crucial para:
- Mejorar la retroalimentación visual durante operaciones de arrastre.
- Mantener la integridad de la interfaz al revertir cambios.
- Crear experiencias intuitivas en sistemas de arrastre y soltar.
Recuerda:
- Siempre restaura los estilos aplicados en
ondragenter
. - Combina con
ondragover
ye.preventDefault()
para permitir drops. - Prueba en múltiples navegadores para garantizar consistencia.
¡Ahora puedes implementar zonas de destino profesionales y accesibles!