0Pricing
HTML Academy · Lezione

Attributo draggable ed evento dragstart

Rendere trascinabili gli elementi e reagire a dragstart

Attributo draggable ed evento dragstart è una lezione HTML Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento HTML Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso HTML Academy include 4 lezioni in totale.

L'attributo draggable

Qualsiasi elemento diventa una sorgente di trascinamento quando si imposta draggable="true". I link e le immagini sono trascinabili per impostazione predefinita; per tutto il resto (div, li, span) è necessario l'attributo esplicito. draggable="false" esclude un elemento dal trascinamento nativo.

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

L'evento dragstart

Quando l'utente inizia un trascinamento, l'elemento sorgente genera dragstart. È il momento in cui inizializzare il trascinamento: registrare quale elemento si sta spostando, applicare eventualmente uno stile e scrivere nell'oggetto dataTransfer i dati che leggerà la destinazione.

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

Senza dragstart non accade nulla

Se contrassegna un elemento come trascinabile ma non gestisce mai dragstart, il browser trascina comunque un'immagine fantasma, ma non imposta alcun dato; per questo la maggior parte delle destinazioni rifiuta il rilascio. Abbini sempre l'attributo draggable a un listener dragstart che memorizzi almeno un identificatore.

Impostazione di effectAllowed

e.dataTransfer.effectAllowed = "move" in dragstart limita l'operazione a: "copy", "move", "link", "copyMove", "all" oppure "none". Questo determina il cursore mostrato dal browser e il valore di dropEffect che la destinazione potrà impostare in seguito.

Aggiunta di un indicatore visivo

Aggiunga una classe CSS alla sorgente in modo che appaia attenuata durante il trascinamento: card.classList.add("dragging"). Rimuova la classe nell'evento dragend, così lo stile viene eliminato sia quando il rilascio riesce sia quando viene annullato con Escape.

Immagine di trascinamento personalizzata

Per impostazione predefinita, il browser trascina un'istantanea traslucida della sorgente. La sostituisca con e.dataTransfer.setDragImage(node, offsetX, offsetY): passi un elemento DOM nascosto o un oggetto Image per visualizzare un'anteprima personalizzata sotto il cursore.

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

L'evento dragend

dragend si attiva sulla sorgente al termine del trascinamento, sia che il rilascio abbia avuto successo, sia che sia avvenuto su una destinazione non valida o che sia stato annullato. Lo utilizzi per le operazioni di pulizia: rimuovere la classe dragging, nascondere le anteprime fantasma e ripristinare l'opacità.

Rilevamento dell'annullamento

All'interno di dragend, controlli e.dataTransfer.dropEffect. Se il valore è "none", il rilascio non è avvenuto (la destinazione lo ha rifiutato, l'utente ha premuto Escape oppure ha rilasciato il pulsante fuori dalla pagina). Altrimenti corrisponde all'effetto scelto dalla destinazione ("move", "copy", "link").

Trascinamento sui dispositivi touch

Il trascinamento nativo è pensato innanzitutto per i computer desktop. Sui dispositivi touch l'API funziona a malapena senza un polyfill o un'alternativa basata su Pointer Events. Per interfacce di riordinamento adatte ai dispositivi mobili, preferisca librerie come SortableJS o dnd-kit, che astraggono entrambe le modalità di gestione degli eventi.

Considerazioni sull'accessibilità

Il trascinamento nativo non è accessibile da tastiera: gli utenti che usano solo la tastiera non possono riordinare gli elementi. Fornisca sempre un'alternativa: gestori dei tasti freccia, pulsanti per spostare in alto o in basso oppure una finestra di dialogo per il riordinamento controllata tramite aria. Il trascinamento deve migliorare l'esperienza, non sostituirla.

Disabilitazione dei comportamenti predefiniti del browser

La selezione del testo all'interno degli elementi trascinabili può interferire con il trascinamento. Applichi il CSS user-select: none e -webkit-user-drag: element alla sorgente, così il browser trascina l'elemento invece di selezionare il testo al suo interno.

Verifica delle conoscenze

Perché di solito è necessario associare un listener dragstart anche se il solo attributo draggable="true" rende un elemento trascinabile?

Riepilogo

Contrassegni le sorgenti con draggable="true" e utilizzi dragstart per popolare dataTransfer, impostare effectAllowed e, facoltativamente, un'immagine di trascinamento personalizzata. Lo abbini a dragend per ripulire gli stili. Fornisca alternative da tastiera per l'accessibilità e consideri i polyfill per il touch.

Domande Frequenti

La lezione «Attributo draggable ed evento dragstart» è gratuita?

Sì — il testo completo di «Attributo draggable ed evento dragstart» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso HTML Academy, passa a CoddyKit PRO. Il corso HTML Academy include 4 lezioni in totale.

Cosa imparerò in «Attributo draggable ed evento dragstart»?

Rendere trascinabili gli elementi e reagire a dragstart Eserciti HTML Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare HTML Academy?

Non è richiesta alcuna esperienza precedente. HTML Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Attributo draggable ed evento dragstart»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione HTML Academy?

Sì. Ogni lezione HTML Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Attributo draggable ed evento dragstart
  2. Eventi dragover e drop
  3. Oggetto dataTransfer
  4. Creare una lista riordinabile con il trascinamento
← Torna a HTML Academy