Como criar elementos de arrastar e soltar com Vanilla JavaScript e HTML

Introdução

Arrastar e soltar é uma interação de usuário comum que pode ser encontrada em muitas interfaces gráficas de usuário.

Existem bibliotecas JavaScript pré-existentes para adicionar um recurso de arrastar e soltar ao seu aplicativo. No entanto, pode haver situações em que uma biblioteca não esteja disponível ou introduza uma sobrecarga ou dependência de que seu projeto não precisa. Nessas situações, o conhecimento das APIs disponíveis para você em navegadores modernos da web pode oferecer soluções alternativas.

A API HTML Drag and Drop depende do modelo de evento do DOM para obter informações sobre o que está sendo arrastado ou solto e para atualizar esse elemento ao arrastar ou soltar. Com manipuladores de eventos JavaScript, você pode transformar qualquer elemento em um item arrastável ou em um item que pode ser solto.

Neste tutorial, construiremos um exemplo de arrastar e soltar usando o recurso HTML Drag and Drop API com JavaScript vanilla para usar os manipuladores de eventos.

Pré-requisitos

Para concluir este tutorial, você precisará:

  • Um navegador da web moderno que suporte a API Drag and Drop (Chrome 4+, Firefox 3.5+, Safari 3.1+, Edge 18+).

Etapa 1 – Criação do projeto e marcação inicial

Nosso projeto consistirá em um contêiner com dois tipos de elementos filhos:

  • Elementos filhos que você pode arrastar
  • Elementos filhos que podem ter elementos soltos neles

Primeiro, abra a janela do terminal e crie um novo diretório de projeto:

Em seguida, navegue até esse diretório:

Em seguida, crie um index.html arquivo nesse diretório:

Em seguida, adicione o código padrão para uma página da web HTML:

index.html

E entre <body> tags adicionam seu draggable item e seu dropzone (drop target):

índice .html

Salve e feche o arquivo. Em seguida, crie um style.css arquivo:

Em seguida, adicione estilos para os elementos em nosso index.html arquivo:

style.css

Isso adicionará alguma formatação ao aplicativo. Agora você pode visualizar index.html no navegador e observar que isso produz um draggable <div> e a dropzone <div>.

Em seguida, tornaremos explicitamente o primeiro <div> arrastável adicionando o draggable atributo:

index.html

Salve e feche o arquivo.

Finalmente, visualize index.html no navegador novamente. Se clicarmos em draggable <div> e arrastá-lo pela tela, deve haver uma indicação visual de que ele está se movendo.

O valor padrão para o atributo draggable é auto. Isso significa que o fato de o elemento ser arrastável será determinado pelo comportamento padrão do seu navegador. Normalmente, isso significa que as seleções de texto, imagens e links podem ser arrastados sem especificar draggable="true".

Agora você tem um arquivo HTML com um elemento arrastável. Avançaremos para adicionar manipuladores onevent.

Etapa 2 – Tratamento de eventos de arrastar e soltar com JavaScript

Atualmente, se nós solte o mouse enquanto arrasta o elemento arrastável, nada acontece. Para acionar uma ação de arrastar ou soltar em elementos DOM, precisaremos utilizar a API Drag and Drop:

  • ondragstart: Este manipulador de eventos será anexado ao nosso elemento draggable e disparado quando um dragstart evento ocorrer.
  • ondragover: Este manipulador de eventos será anexado ao nosso elemento dropzone e disparado quando um evento dragover ocorrer.
  • ondrop: Este manipulador de eventos também será anexado ao nosso elemento dropzone e disparado quando um drop o evento ocorre.

Observação: há oito manipuladores de eventos no total: ondrag, ondragend, ondragenter, ondragexit, ondragleave, ondragover, ondragstart e ondrop. Para nosso exemplo, não exigiremos todos eles.

Primeiro, vamos fazer referência a um novo arquivo https://www.digitalocean.com/community/tutorials/script.js em nosso index.html:

index.html

Em seguida, crie um novo https://www.digitalocean.com/community/tutorials/script.js arquivo:

O objeto DataTransfer manterá o controle das informações relacionadas ao arrasto atual acontecendo. Para atualizar nosso elemento ao arrastar e soltar, precisamos acessar diretamente o objeto DataTransfer.Para fazer isso, podemos selecionar a propriedade dataTransfer do elemento DOM DragEvent.

Observação: o DataTransfer objeto pode tecnicamente rastrear informações para vários elementos sendo arrastados ao mesmo tempo. Para nosso exemplo, vamos nos concentrar em arrastar um elemento.

O método dataTransfer do objeto setData pode ser usado para definir as informações do estado de arrasto para o elemento arrastado no momento. Leva dois parâmetros:

  • uma string que declara o formato do segundo parâmetro
  • os dados reais sendo transferidos

Nosso objetivo é mover nosso elemento draggable para um novo elemento pai. Precisamos ser capazes de selecionar nosso elemento draggable com um id exclusivo. Podemos definir o id do elemento arrastado com o método setData para que possa ser usado mais tarde.

Vamos revisite nosso arquivo https://www.digitalocean.com/community/tutorials/script.js e crie uma nova função para usar setData:

https://www.digitalocean.com/community/tutorials/script.js

Nota: O Internet Explorer 9 a 11 tem supostamente problemas com o uso do "text/plain". O formato precisa ser "text" para esse navegador.

Para atualizar o estilo CSS do item arrastado, podemos acessar seus estilos usando o evento DOM novamente e por definindo os estilos que quisermos para currentTarget.

Vamos adicionar à nossa função e alterar backgroundColor para yellow:

https://www.digitalocean.com/community/tutorials/script.js

Observação: todos os estilos que você alterar precisarão ser atualizados manualmente novamente ao soltar se desejar estilos somente arrastar. Se você alterar qualquer coisa quando começar a arrastar, o elemento arrastado manterá o novo estilo, a menos que você o altere de volta.

Agora, temos nossa função JavaScript para quando começar a arrastar.

Podemos adicionar ondragstart ao elemento draggable em index.html:

index.html

Visualize index.html em seu navegador. Se você tentar arrastar seu item agora, o estilo declarado em nossa função será aplicado:

No entanto, nada acontecerá quando você libera seu clique.

O próximo manipulador de eventos disparado nesta sequência é ondragover.

O comportamento de soltar padrão para certos elementos DOM como <div> s em navegadores normalmente não aceita descartar. Este comportamento irá interceptar o comportamento que estamos tentando implementar. Para garantir que obtenhamos o comportamento de eliminação desejado, aplicaremos preventDefault.

Vamos revisitar o arquivo https://www.digitalocean.com/community/tutorials/script.js e crie uma nova função para usar preventDefault. Adicione este código ao final do arquivo:

https://www.digitalocean.com/community/tutorials/script.js

Agora, podemos adicionar ondragover ao nosso dropzone elemento em index.html:

index.html

Neste ponto, ainda não escrevemos o código para lidar com a eliminação real. O manipulador de eventos final acionado nesta sequência é ondrop.

Vamos revisitar nosso arquivo https://www.digitalocean.com/community/tutorials/script.js e criar uma nova função .

Podemos fazer referência aos dados que salvamos anteriormente com o método dataTransfer do objeto setData. Usaremos o método dataTransfer do objeto getData. Os dados que definimos foram id, então é isso que nos será retornado:

https://www.digitalocean.com/community/tutorials/script.js

Selecione nosso draggable elemento com o id que recuperamos:

https://www.digitalocean.com/community/tutorials/script.js

Selecione nosso dropzone elemento:

https://www.digitalocean.com/community/tutorials/script.js

Anexe nosso draggable elemento para o dropzone:

https://www.digitalocean.com/community/tutorials/script.js

Redefina nosso objeto dataTransfer:

https://www.digitalocean.com/community/tutorials/script.js

Agora, podemos adicionar ondrop ao nosso dropzone elemento em index.html:

index.html

Feito isso, temos um recurso completo de arrastar e soltar. Visualize index.html em seu navegador e arraste o elemento draggable para dropzone.

Nosso exemplo lida com o cenário de um único item arrastável e um único destino para soltar. Você pode ter vários itens arrastáveis, vários destinos de soltar e personalizá-los com todos os outros manipuladores de eventos da API de arrastar e soltar.

Etapa 3 – Construindo um exemplo avançado com vários itens arrastáveis

Aqui está mais um exemplo de como você pode usar esta API: uma lista de tarefas com tarefas arrastáveis da qual você pode mover uma coluna "To-do" para uma coluna "Done".

Para criar sua própria lista de tarefas, adicione mais elementos arrastáveis com id s para index.html:

index.html

Visualize index.html em seu navegador e arraste os itens da coluna Pendências para a coluna Concluído. Você criou um aplicativo de tarefas e testou a funcionalidade.

Conclusão

Neste artigo, você criou um aplicativo de tarefas para explorar a funcionalidade de arrastar e soltar que é disponível para navegadores da web modernos.

A API de arrastar e soltar oferece várias opções para personalizar suas ações, além de arrastar e soltar. Por exemplo, você pode atualizar o estilo CSS dos itens arrastados. Além disso, em vez de mover o item, você pode optar por copiar o item arrastável para que seja replicado ao soltar.

Lembre-se de que, embora muitos navegadores da web sejam compatíveis com essa tecnologia, você não pode confiar nele se o seu público consistir em dispositivos que não suportam essa funcionalidade.

Para saber mais sobre tudo que você pode soltar com a API Drag and Drop, verifique os documentos do MDN sobre ele.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *