Como fazer um elemento arrastável permanecer na nova posição quando solto (HTML5 não jQuery)?

asinix

Acabei de aprender o básico da API arrastável e solta do HTML5. Não sei como manter a posição arrastada em sua posição solta. Ao deixá-lo cair, ele muda de posição.

Aqui está o HTML básico (apenas elementos relevantes):

onDragStart = function(ev) {
  //...
}

drop_handler = function(ev) {
  ev.preventDefault();
  ev.target.appendChild(document.getElementById("id1"));
}

dragover_handler = function(ev) {
  ev.preventDefault();
  ev.dataTransfer.dropEffect = "move";
}
<div id="id1" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid green; cursor:pointer;width:100px;height:50px;">Dragged Div</div>


<div id="id2" style="position:absolute;left:100px;top:200px;border:2px solid red; cursor:pointer;width:200px;height:200px;" ondrop="drop_handler(event)" ondragover="dragover_handler(event)">Drop Div
</div>

Quero que o elemento arrastado permaneça em sua posição final onde foi solto. Quaisquer sugestões serão apreciadas.

horizonte 3000

Como mencionei no meu comentário, <div id="id1" ...>ainda tem o posicionamento padrão que é static. Depois de anexá-lo ao dropDiv, ele assume o comportamento normal do fluxo de documentos. Por ser um elemento de bloco, ele fica abaixo do texto que já está lá e preenche a largura do bloco.

Se você quiser que ele fique exatamente onde está ao soltá-lo, você precisa dar position: absolutee levar em consideração como o mouse se move ao arrastá-lo na tela. Nesse dragStartcaso, capturamos as coordenadas originais do dragDiv e consideramos onde o mouse estava dentro em relação ao canto superior esquerdo. Quando soltamos o dragDiv no dropDiv, definimos o posicionamento absoluto e consideramos quanto o mouse se moveu durante o arrasto.

Como dragDiv agora é filho de dropDiv, precisamos que nossos novos valores de topo e esquerda sejam relativos às coordenadas de dropDiv em vez de toda a tela, então subtraímos os valores de topo e esquerda de dropDiv. Observe bem que alguns desses métodos podem não levar em conta as bordas ao redor dos elementos, o que pode fazer com que pareça que estão um ou dois pixels fora - para corrigir isso, você pode subtrair um ou dois pixels no cálculo ou fornecê-los box-sizing: border-box.

let offsetX;
let offsetY;

onDragStart = function(ev) {
  const rect = ev.target.getBoundingClientRect();

  offsetX = ev.clientX - rect.x;
  offsetY = ev.clientY - rect.y;
};

drop_handler = function(ev) {
  ev.preventDefault();

  const left = parseInt(id2.style.left);
  const top = parseInt(id2.style.top);

  id1.style.position = 'absolute';
  id1.style.left = ev.clientX - left - offsetX + 'px';
  id1.style.top = ev.clientY - top - offsetY + 'px';
  id2.appendChild(document.getElementById("id1"));
};

dragover_handler = function(ev) {
  ev.preventDefault();
  ev.dataTransfer.dropEffect = "move";
};
<div id="id1" draggable="true" ondragstart="onDragStart(event)" style="border:2px solid green; cursor:pointer;width:100px;height:50px;">Dragged Div</div>


<div id="id2" style="position:absolute;left:200px;top:50px;border:2px solid red; cursor:pointer;width:200px;height:200px;" ondrop="drop_handler(event)" ondragover="dragover_handler(event)">Drop Div
</div>

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como fazer um elemento arrastável para permanecer no mesmo lugar

Como você remove o atributo "arrastável" de um elemento depois que ele é solto?

Como soltar um item arrastável em um classificável, o item solto não é o elemento original, mas um auxiliar personalizado

jquery droppable / html5 api - como tornar o elemento soltável e arrastável

Como atualizo a classe de um item arrastável do jQuery com o ID do pai em que ele foi solto?

Evita que o item arrastável seja solto sobre um elemento específico

Como fazer o elemento arrastado quando solto deve estar no centro da área para soltar

jQuery encontra o valor de um div arrastável após ser solto

Tornando o elemento arrastado e solto solto e ainda arrastável

O elemento arrastável dentro de um GridView em flutter está na posição errada

O elemento arrastável do jQuery muda de posição no início do arrasto quando a posição é absoluta

elemento arrastável muda suas margens quando a posição é relativa

Como posso definir a posição padrão de um elemento arrastável usando Angular Material DragAndDrop?

Como exibir e fazer a transição quando a posição de rolagem atinge a posição do elemento na tela?

Como fazer um objeto manter-se na posição quando o botão Play é clicado

Como fazer uma lista HTML permanecer na posição ao adicionar dinamicamente novos <LI> s a uma lista diferente

Como colocar o widget na posição de arrastável?

elemento solto não visível

como fazer um elemento ficar no lugar quando a posição muda de absoluta para fixa

jquery como fazer um elemento retornar à posição inicial após a animação

Quando faço borda em pairar, outro elemento se move levemente, como fazer ele ficar na posição deles?

fazer arrastável não retornar quando for cancelado

Fixar um elemento SVG na posição quando a janela for redimensionada

Como posso fazer com que o jQuery DatePicker não interrompa um elemento <span> ou <input> quando chamado?

Como fazer 2 col-lg-6 permanecer horizontal na visualização móvel?

Como um valor referenciado pode permanecer na memória quando a variável original que o contém tem um novo valor referenciado?

Como randomizar a posição de um elemento quando clicado

Como fazer um elemento rolar com o usuário e permanecer do mesmo lado usando o bootstrap 4

Como obter o elemento na função de reversão arrastável do jQueryUI?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo