El Atributo ONDRAGOVER

Es parte de la API de Drag and Drop de HTML5 y se activa mientras un elemento arrastrable está sobre una zona de destino válida.
El atributo ondragover
es parte de la API de Drag and Drop de HTML5 y se activa mientras un elemento arrastrable está sobre una zona de destino válida. Es fundamental para permitir operaciones de "soltar" (drop) y proporcionar retroalimentación visual durante el arrastre.
¿Qué hace ondragover
?
-
Disparador: Se ejecuta continuamente mientras un elemento arrastrado está sobre una zona de destino.
-
Propósito principal:
-
Permitir que la zona acepte elementos arrastrados mediante
e.preventDefault()
. -
Actualizar la interfaz en tiempo real (ej: efectos visuales).
-
-
Relación con otros eventos:
-
ondragenter
: Al entrar en la zona (una vez). -
ondragover
: Durante el movimiento sobre la zona (varias veces por segundo). -
ondragleave
: Al salir de la zona. -
ondrop
: Al soltar el elemento.
-
Sintaxis básica
Como atributo HTML:
<div id="zona" ondragover="manejarArrastre(event)" > Zona de destino </div>
Con JavaScript (recomendado):
const zona = document.getElementById("zona"); zona.addEventListener("dragover", (e) => { e.preventDefault(); // ¡Obligatorio para permitir el drop! });
Ejemplos prácticos
Ejemplo 1: Permitir drop básico
<div class="item" draggable="true">???? Arrástrame</div> <div id="contenedor" style="width: 300px; height: 200px; border: 2px dashed #ccc;" > Suelta aquí </div> <script> const contenedor = document.getElementById("contenedor"); // Permitir drop contenedor.addEventListener("dragover", (e) => { e.preventDefault(); }); // Manejar elemento soltado contenedor.addEventListener("drop", (e) => { e.preventDefault(); const elemento = document.querySelector(".item"); e.target.appendChild(elemento); }); </script>
Ejemplo 2: Efecto de resaltado dinámico
<style> .resaltado { background: #e3f2fd; transform: scale(1.02); } </style> <div id="dropZone" ondragover="event.preventDefault(); this.classList.add('resaltado')" ondragleave="this.classList.remove('resaltado')" ondrop="manejarDrop(event)" > Arrastra archivos aquí </div>
Ejemplo 3: Sistema de subida de archivos
<div id="dropArea">???? Arrastra archivos aquí</div> <ul id="listaArchivos"></ul> <script> const dropArea = document.getElementById("dropArea"); dropArea.addEventListener("dragover", (e) => { e.preventDefault(); dropArea.style.background = "#f0f4ff"; }); dropArea.addEventListener("drop", (e) => { e.preventDefault(); dropArea.style.background = "white"; const archivos = e.dataTransfer.files; const lista = document.getElementById("listaArchivos"); for (const archivo of archivos) { const li = document.createElement("li"); li.textContent = `${archivo.name} (${(archivo.size/1024).toFixed(2)} KB)`; lista.appendChild(li); } }); </script>
Propiedades clave del evento
Accede a información útil desde el objeto event
:
-
clientX
/clientY
: Posición actual del cursor. -
dataTransfer
: Datos del elemento arrastrado (definidos enondragstart
). -
target
: Elemento sobre el que se está arrastrando.
Diferencias entre eventos clave
Evento | Frecuencia | Uso principal |
---|---|---|
ondragenter |
Una vez | Iniciar efectos visuales |
ondragover |
Continuamente | Permitir drop + actualizaciones |
ondragleave |
Una vez | Limpiar efectos visuales |
Mejores prácticas
Siempre usar e.preventDefault()
:
Es obligatorio para permitir el evento drop
:
zona.addEventListener("dragover", (e) => { e.preventDefault(); // ¡Sin esto, el drop no funcionará! });
Optimizar el rendimiento:
Evita operaciones pesadas dentro de ondragover
, ya que se ejecuta muchas veces por segundo:
let ultimaPosicion = null; zona.addEventListener("dragover", (e) => { if (ultimaPosicion !== `${e.clientX},${e.clientY}`) { // Actualizar solo si la posición cambió ultimaPosicion = `${e.clientX},${e.clientY}`; animarElemento(e.clientX, e.clientY); } });
Accesibilidad:
<div role="region" aria-dropzone="move">...</div>
Proporciona alternativas para usuarios que no usen arrastre (ej: botones de subida).
Casos avanzados
Juego de rompecabezas con arrastre:
<div class="pieza" draggable="true" data-posicion="correcta">????</div> <div id="tablero"></div> <script> const tablero = document.getElementById("tablero"); tablero.addEventListener("dragover", (e) => { e.preventDefault(); e.target.style.border = "2px solid #4CAF50"; }); tablero.addEventListener("drop", (e) => { e.preventDefault(); const pieza = document.querySelector(".pieza"); if (e.target === tablero && pieza.dataset.posicion === "correcta") { tablero.appendChild(pieza); pieza.draggable = false; // Bloquear después de colocar } }); </script>
Editor de diagramas con arrastre:
<div class="nodo" draggable="true">???? Nodo 1</div> <svg id="lienzo" width="500" height="300"></svg> <script> const lienzo = document.getElementById("lienzo"); lienzo.addEventListener("dragover", (e) => { e.preventDefault(); lienzo.style.backgroundColor = "#f5f5f5"; }); lienzo.addEventListener("drop", (e) => { e.preventDefault(); const nodo = document.createElementNS("http://www.w3.org/2000/svg", "circle"); nodo.setAttribute("cx", e.clientX); nodo.setAttribute("cy", e.clientY); nodo.setAttribute("r", "20"); lienzo.appendChild(nodo); }); </script>
Errores comunes
<!-- MAL: Olvidar e.preventDefault() --> <div ondragover="console.log('Arrastrando')"></div> <!-- Drop no funcionará --> <!-- CONFUSIÓN: Usar ondragover en elementos no drop targets --> <span ondragover="...">No es una zona válida</span> <!-- EFECTOS VISUALES PESADOS --> <script> zona.addEventListener("dragover", (e) => { // ¡Esto se ejecuta cientos de veces! generarAnimacionCompleja(); }); </script>
Compatibilidad
Navegador | Soporte | Notas |
---|---|---|
Chrome | ✅ Todas versiones | |
Firefox | ✅ Todas versiones | |
Safari | ✅ v10+ | |
Edge | ✅ Todas versiones | |
Móviles | ⚠️ Soporte parcial | Requiere polyfills para touch |
Conclusión
El atributo ondragover
es esencial para:
- Habilitar operaciones de arrastre y soltar.
- Crear interfaces dinámicas con retroalimentación en tiempo real.
- Implementar sistemas complejos como editores gráficos o gestores de archivos.
Recuerda:
- Siempre usa
e.preventDefault()
enondragover
. - Combínalo con otros eventos (
ondragenter
,ondragleave
) para una experiencia completa. - Optimiza el rendimiento evitando cálculos pesados en el evento.
¡Ahora puedes crear zonas de destino interactivas y altamente responsivas!