Atributo draggable e evento dragstart
Torne elementos arrastáveis e responda a dragstart.
Atributo draggable e evento dragstart é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.
O atributo de arrastamento
Qualquer elemento se torna uma origem de arrastamento quando você define draggable="true". Links e imagens podem ser arrastados por padrão; todos os outros elementos (divs, lis, spans) exigem o atributo explícito. draggable="false" impede que um elemento seja arrastado nativamente.
<div draggable="true" id="card">Drag me</div>O evento de início do arrastamento
Quando o usuário começa a arrastar, o elemento de origem dispara o evento de início do arrastamento. É nesse momento que você inicializa o arrastamento: registre qual item está sendo movido, aplique um estilo opcionalmente e grave dados no objeto dataTransfer que o destino de soltura lerá.
card.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", card.id);
});Sem o início do arrastamento, nada acontece
Se você marcar um elemento como arrastável, mas nunca tratar o início do arrastamento, o navegador ainda arrastará uma imagem fantasma, mas nenhum dado será definido; por isso, a maioria dos destinos de soltura recusará a soltura. Sempre associe um atributo de arrastamento a um ouvinte de início do arrastamento que armazene pelo menos um identificador.
Configurando effectAllowed
e.dataTransfer.effectAllowed = "move" no início do arrastamento restringe a operação: "copy", "move", "link", "copyMove", "all" ou "none". Isso controla o cursor exibido pelo navegador e o dropEffect que o destino poderá definir depois.
Adicionando uma indicação visual
Adicione uma classe CSS à origem para que ela apareça esmaecida enquanto é arrastada: card.classList.add("dragging"). Remova a classe no evento de término do arrastamento para que o estilo seja limpo, independentemente de a soltura ter sido bem-sucedida ou cancelada com Esc.
Imagem de arrastamento personalizada
Por padrão, o navegador arrasta uma captura translúcida da origem. Substitua-a por e.dataTransfer.setDragImage(node, offsetX, offsetY) — passe um elemento DOM oculto ou uma imagem para exibir uma prévia personalizada no cursor.
const ghost = document.getElementById("drag-preview");
card.addEventListener("dragstart", (e) => {
e.dataTransfer.setDragImage(ghost, 20, 20);
});O evento de término do arrastamento
dragend é disparado na origem após a conclusão do arrastamento, seja quando a soltura ocorre com sucesso, em um destino inválido ou quando é cancelada. Use-o para a limpeza — remova a classe de arrastamento, oculte as prévias fantasmas e restaure a opacidade.
Detectando o cancelamento
Dentro do evento de término do arrastamento, verifique e.dataTransfer.dropEffect. Se o valor for "none", a soltura não aconteceu (o destino a rejeitou, o usuário pressionou Esc ou soltou fora da página). Caso contrário, ele será igual ao efeito escolhido pelo destino de soltura ("move", "copy", "link").
Arrastamento em dispositivos sensíveis ao toque
O arrastamento e a soltura nativos priorizam computadores. Em dispositivos sensíveis ao toque, a API quase não funciona sem uma camada de compatibilidade ou uma substituição baseada em eventos de ponteiro. Para interfaces de reordenação compatíveis com dispositivos móveis, prefira bibliotecas como SortableJS ou dnd-kit, que abstraem os dois modelos de eventos.
Considerações de acessibilidade
O arrastamento e a soltura nativos não são acessíveis pelo teclado — usuários que usam apenas o teclado não conseguem reordenar itens. Sempre ofereça uma alternativa: manipuladores de teclas de seta, botões para mover para cima ou para baixo ou um diálogo de reordenação controlado por aria. O arrastamento e a soltura devem complementar, não substituir.
Desativando os padrões do navegador
A seleção de texto dentro de elementos arrastáveis pode interferir no arrastamento. Aplique CSS user-select: none e -webkit-user-drag: element à origem para que o navegador arraste o elemento em vez de selecionar o texto dentro dele.
Verificação de conhecimento
Por que geralmente é necessário associar um ouvinte de início do arrastamento, mesmo que o atributo draggable="true" sozinho torne um elemento arrastável?
Resumo
Marque as origens com draggable="true" e use o início do arrastamento para preencher dataTransfer, definir effectAllowed e, opcionalmente, uma imagem de arrastamento personalizada. Combine-o com o término do arrastamento para limpar os estilos. Ofereça alternativas pelo teclado para garantir a acessibilidade e considere camadas de compatibilidade para dispositivos sensíveis ao toque.
Perguntas Frequentes
A aula “Atributo draggable e evento dragstart” é grátis?
Sim — o texto completo de “Atributo draggable e evento dragstart” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.
O que vou aprender em “Atributo draggable e evento dragstart”?
Torne elementos arrastáveis e responda a dragstart. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar HTML Academy?
Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Atributo draggable e evento dragstart”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de HTML Academy?
Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Atributo draggable e evento dragstart
- Eventos dragover e drop
- Objeto dataTransfer
- Lista prática com reordenação por arrastar