A API HTML5 Drag and Drop (DnD) significa que podemos tornar quase qualquer elemento em nossa página arrastável. Nesta postagem, explicaremos os fundamentos do Drag e soltar.
Criando conteúdo arrastável #
É importante notar que na maioria dos navegadores, seleções de texto, imagens e links são arrastáveis por padrão. Por exemplo, se você arrastar o O logotipo do Google na Pesquisa Google, você verá a imagem fantasma. A imagem pode então ser solta na barra de endereço, um elemento <input type="file" />
ou até mesmo na área de trabalho.Para tornar outros tipos de conteúdo arrastáveis você precisa usar as APIs DnD HTML5.
Para tornar um objeto arrastável, defina draggable=true
nesse elemento. Praticamente qualquer coisa pode ser ativada para arrastar, imagens, arquivos , links, arquivos ou qualquer marcação em sua página.
Em nosso exemplo, estamos criando uma interface para reorganizar algumas colunas, que foram dispostas com CSS Grid. A marcação básica para minhas colunas se parece com isso, com cada coluna tendo o
atributo definido comotrue
.
Aqui está o CSS para meu recipiente e elementos de caixa. Observe que o único CSS relacionada à funcionalidade DnD está a propriedade cursor: move
. O resto do código apenas controla o layout e o estilo do contêiner e dos elementos da caixa.
Neste ponto, você irá descubra que você pode arrastar os itens, mas nada mais acontecerá. Para adicionar a funcionalidade DnD, precisamos usar a API JavaScript.
Ouvindo eventos de arrastamento #
Existem vários de eventos diferentes para anexar para monitorar todo o processo de arrastar e soltar.
-
dragstart
-
drag
-
dragenter
-
dragleave
-
dragover
-
drop
-
dragend
Para lidar com o fluxo DnD, você precisa de algum tipo de elemento de origem (de onde se origina o arrasto), os dados pa yload (o que você está tentando derrubar) e um alvo (uma área para pegar a queda). O elemento de origem pode ser uma imagem, lista, link, objeto de arquivo, bloco de HTML, etc. O destino é a zona de soltar (ou conjunto de zonas para soltar) que aceita os dados que o usuário está tentando eliminar. Lembre-se de que nem todos os elementos podem ser alvos, por exemplo, uma imagem não pode ser um alvo.
Começando e terminando uma sequência de arrastar e soltar #
Depois de ter draggable="true"
atributos definidos em seu conteúdo, anexe um dragstart
manipulador de eventos para iniciar a sequência DnD para cada coluna.
Este código definirá a opacidade da coluna para 40% quando o usuário começar a arrastá-la e, em seguida, retornará para 100% quando o evento de arrastar terminar.
O resultado pode ser visto na demonstração do Glitch abaixo. Arraste um item e ele se tornará opaco. Como o destino do dragstart
evento “é o elemento de origem, definir this.style.opacity
para 40% dá ao usuário feedback visual de que o elemento é a seleção atual que está sendo movida. Depois de soltar o item, embora a funcionalidade de soltar não esteja em vigor, o elemento de origem retorna para 100% de opacidade.
Adicionar dicas visuais adicionais com dragenter, dragover e dragleave #
Para ajudar o usuário a entender como interagir com sua interface, use o dragenter
, dragover
e dragleave
manipuladores de eventos. Neste exemplo, as colunas são destinos de soltar além de serem arrastáveis. Ajude o usuário para entender isso fazendo a borda tracejada conforme eles seguram um item arrastado sobre uma coluna. Por exemplo, em seu CSS, você pode criar uma classe over
para representar elementos que são alvos de soltar:
Então, em seu J avaScript configura os manipuladores de eventos, adicione a classe over
quando a coluna é arrastada e remova-a quando sairmos. No dragend
manipulador também nos certificamos de remover as classes no final da operação.
Há alguns pontos que valem a pena cobrir neste código :
- No caso de arrastar algo como um link, você precisa evitar o comportamento padrão do navegador, que é navegar até esse link. Para fazer isso, chame
e.preventDefault()
no eventodragover
. Outra boa prática é retornarfalse
no mesmo manipulador. - O manipulador de eventos
dragenter
é usado para alternar aover
classe em vez dedragover
.Se você usardragover
, a classe CSS será alternada várias vezes enquanto o eventodragover
continua a disparar em uma coluna hover. isso causaria o renderizador do navegador para fazer uma grande quantidade de trabalho desnecessário. Manter o redesenho mínimo é sempre uma boa ideia.Se você precisar usar o eventodragover
para algo, considere restringir ou eliminar o ouvinte de evento.
Concluindo a eliminação #
Para processar a eliminação real, adicione um ouvinte de evento para o evento drop
. No manipulador drop
, você “precisará evitar o comportamento padrão do navegador para quedas, que normalmente é algum tipo de redirecionamento irritante. Você pode evitar que o evento borbulhe no DOM chamando e.stopPropagation()
.
Se você executar o código neste ponto, o item não cairá para o novo local. Para conseguir isso, você precisa usar o DataTransfer
objeto.
A propriedade dataTransfer
é onde toda a mágica DnD acontece. Ela contém os dados enviados em uma ação de arrastar. dataTransfer
é definido no evento dragstart
e lido / tratado no evento de descarte. Chamar e.dataTransfer.setData(mimeType, dataPayload)
permite que você defina o objeto “s Tipo MIME e carga útil de dados.
Neste exemplo, vamos permitir que os usuários reorganizem a ordem das colunas. Para fazer isso, primeiro você precisa armazenar o HTML do elemento de origem ao arrastar começa:
No evento drop
que você processa a queda da coluna, definindo o HTML da coluna de origem como o HTML da coluna de destino que você soltou, primeiro verificando se o usuário não está voltando para a mesma coluna da qual foi arrastado.
Você pode ver o resultado no seguinte demo.Drag e solte a coluna A no topo da coluna B e observe como eles mudam de lugar:
Mais arrastando propriedades #
O objeto dataTransfer
expõe propriedades para fornecer feedback visual ao usuário durante o processo de arrastar. Essas propriedades também podem ser usadas para controlar como cada destino de soltar responde a um determinado tipo de dados.
-
dataTransfer.effectAllowed
restringir Este é o “tipo de arrastamento” que o usuário pode executar no elemento. É usado no modelo de processamento de arrastar e soltar para inicializar odropEffect
durante odragenter
edragover
eventos. A propriedade pode ser definida com os seguintes valores:none
,copy
,copyLink
,copyMove
,link
,linkMove
,move
,all
euninitialized
. -
dataTransfer.dropEffect
controla o feedback que o usuário recebe durante odragenter
edragover
eventos. Quando o usuário passa o mouse sobre um elemento de destino, o cursor do navegador indica que tipo de operação vai ocorrer (por exemplo uma cópia, uma mudança, etc.). O efeito pode assumir um dos seguintes valores:none
,copy
,link
,move
. -
e.dataTransfer.setDragImage(imgElement, x, y)
significa que em vez de usar o navegador ” s feedback padrão de “imagem fantasma”, você pode, opcionalmente, definir um ícone de arrastar.
Upload de arquivo com arrastar e soltar #
Este exemplo simples usa uma coluna como o arraste a origem e arraste o destino. Isso pode ser visto em uma IU em que o usuário é solicitado a reorganizar os itens. Em algumas situações, o destino e a origem do arrasto podem ser diferentes, como uma interface em que o usuário precisa selecionar uma imagem para ser o imagem principal de um produto arrastando a imagem selecionada para um alvo.
Arrastar e soltar é frequentemente usado para permitir que os usuários arrastem itens de sua área de trabalho para um aplicativo. A principal diferença está em seu drop
manipulador.em vez de usar dataTransfer.getData()
para acessar os arquivos, seus dados com estará contido na propriedade dataTransfer.files
:
Você pode encontrar mais informações sobre isso em arrastar e soltar personalizado.