0Pricing
HTML Academy · Lección

Atributo draggable y evento dragstart

Haga que los elementos se puedan arrastrar y responda a dragstart

Atributo draggable y evento dragstart es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.

El atributo draggable

Cualquier elemento se convierte en un origen de arrastre cuando establece draggable="true". Los enlaces y las imágenes se pueden arrastrar de forma predeterminada; todo lo demás (divs, lis, spans) requiere el atributo explícito. draggable="false" excluye un elemento del arrastre nativo.

<div draggable="true" id="card">Drag me</div>

El evento dragstart

Cuando el usuario comienza a arrastrar, el elemento de origen emite dragstart. Aquí es donde debe inicializar el arrastre: registre qué elemento se está moviendo, aplíquele estilos opcionales y escriba los datos en el objeto dataTransfer que leerá la zona de destino.

card.addEventListener("dragstart", (e) => {
  e.dataTransfer.setData("text/plain", card.id);
});

Sin dragstart no ocurre nada

Si marca un elemento como arrastrable pero nunca gestiona dragstart, el navegador sigue arrastrando una imagen fantasma, pero no se establecen datos, por lo que la mayoría de las zonas de destino rechazan la operación. Asocie siempre el atributo draggable a un listener de dragstart que almacene al menos un identificador.

Establecer effectAllowed

e.dataTransfer.effectAllowed = "move" en dragstart restringe la operación: "copy", "move", "link", "copyMove", "all" o "none". Esto determina el cursor que muestra el navegador y el dropEffect que la zona de destino puede establecer posteriormente.

Añadir una señal visual

Añada una clase CSS al elemento de origen para que aparezca atenuado mientras se arrastra: card.classList.add("dragging"). Quite la clase en el evento dragend para borrar los estilos tanto si la operación se completó correctamente como si se canceló con Escape.

Imagen de arrastre personalizada

De forma predeterminada, el navegador arrastra una instantánea translúcida del elemento de origen. Sustitúyala con e.dataTransfer.setDragImage(node, offsetX, offsetY): pase un elemento DOM oculto o una Image para mostrar una vista previa personalizada junto al cursor.

const ghost = document.getElementById("drag-preview");
card.addEventListener("dragstart", (e) => {
  e.dataTransfer.setDragImage(ghost, 20, 20);
});

El evento dragend

dragend se emite en el elemento de origen cuando termina el arrastre, tanto si se soltó correctamente como si se soltó en una zona no válida o se canceló. Úselo para la limpieza: quitar la clase de arrastre, ocultar las vistas previas fantasma y restaurar la opacidad.

Detectar la cancelación

Dentro de dragend, compruebe e.dataTransfer.dropEffect. Si el valor es "none", la operación de soltar no se produjo (la zona de destino la rechazó, el usuario pulsó Escape o soltó el elemento fuera de la página). De lo contrario, equivale al efecto que eligió la zona de destino ("move", "copy", "link").

Arrastrar en dispositivos táctiles

La función nativa de arrastrar y soltar está diseñada principalmente para ordenadores de escritorio. En dispositivos táctiles, la API apenas funciona sin un polyfill o una alternativa basada en Pointer Events. Para interfaces de reordenación adaptadas a móviles, prefiera bibliotecas como SortableJS o dnd-kit, que abstraen ambos modelos de eventos.

Consideraciones de accesibilidad

La función nativa de arrastrar y soltar no es accesible mediante el teclado: los usuarios que solo utilizan el teclado no pueden reordenar elementos. Proporcione siempre una alternativa: controladores para las teclas de flecha, botones para subir o bajar elementos, o un diálogo de reordenación controlado mediante aria. Arrastrar y soltar debe mejorar la experiencia, no sustituirla.

Desactivar los valores predeterminados del navegador

La selección de texto dentro de elementos arrastrables puede interferir con el arrastre. Aplique CSS user-select: none y -webkit-user-drag: element al elemento de origen para que el navegador arrastre el elemento en lugar de seleccionar el texto que contiene.

Comprobación de conocimientos

¿Por qué debe asociar normalmente un listener de dragstart aunque el atributo draggable="true" por sí solo haga que un elemento se pueda arrastrar?

Resumen

Marque los elementos de origen con draggable="true" y use dragstart para rellenar dataTransfer, establecer effectAllowed y, opcionalmente, una imagen de arrastre personalizada. Combínelo con dragend para limpiar los estilos. Proporcione alternativas de teclado por motivos de accesibilidad y considere usar polyfills para dispositivos táctiles.

Preguntas frecuentes

¿La lección «Atributo draggable y evento dragstart» es gratis?

Sí — el texto completo de «Atributo draggable y evento dragstart» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Atributo draggable y evento dragstart»?

Haga que los elementos se puedan arrastrar y responda a dragstart Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar HTML Academy?

No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Atributo draggable y evento dragstart»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de HTML Academy?

Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Atributo draggable y evento dragstart
  2. Eventos dragover y drop
  3. Objeto dataTransfer
  4. Lista práctica con reordenación mediante arrastre
← Volver a HTML Academy