4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【JavaScript】要素のドラッグ&ドロップ

Posted at

このように投稿した要素のドラッグ&ドロップができるよう実装します。
メモドラッグ.gif

投稿した要素のドラッグ&ドロップ

<?php
foreach ($memos as $memo) :
?>
<div class="memo">
 <div class="memo_text"><?= $memo['text'] ?></div>
</div>
<?php endforeach ?>

投稿をブラウザに表示します。
次に、JavaScriptでドラッグ&ドロップを実装します。

$(document).on('dblclick', '.memo', function(event) {
    let memo = document.querySelector('.memo');
    let currentDroppable = null;
    let currentDroppable_memogroup = null;
    let currentDroppable_memogroup_create = null;
    let shiftX = event.clientX - ball.getBoundingClientRect().left;
    let shiftY = event.clientY - ball.getBoundingClientRect().top;

    //絶対位置で一番上になるように
    memo.style.position = 'absolute';
    memo.style.zIndex = 5;

    //対象オブジェクトをbody要素に追加
    document.body.append(memo);

    moveAt(event.pageX, event.pageY);

    function moveAt(pageX, pageY) {
        memo.style.left = pageX - shiftX + 'px';
        memo.style.top = pageY - shiftY + 'px';
    }

    function onMouseMove(event) {
        moveAt(event.pageX, event.pageY);

        memo.hidden = true;
        let elemBelow = document.elementFromPoint(event.clientX, event.clientY);
        memo.hidden = false;
    }
    document.addEventListener('mousemove', onMouseMove);

    memo.onmouseup = function() {
        document.removeEventListener('mousemove', onMouseMove);
        memo.onmouseup = null;
    };
});

対象の要素をダブルクリックしたときに、関数moveAtonMouseMoveを呼び出しています。
mousemoveでleft/topを変更しています。

ドラッグ中の要素を別要素にドラッグ

ドラッグ中の要素が別要素に重なるまたは離れた場合、処理が走るようにします。

:
    document.addEventListener('mousemove', onMouseMove);

        let droppableBelow = elemBelow.closest('.memo');

        if (currentDroppable != droppableBelow) {
       // ドラッグ中の要素が別の要素から離れた場合
            if (currentDroppable) { 
        alert('離れました');
            }

       // ドラッグ中の要素が別の要素に重なった場合
            currentDroppable = droppableBelow;
            if (currentDroppable) { 
        alert('重なりました');
            }
        }

このように別要素に重なったかどうか、判定できるようになります。
メモドラッグ2.gif

参考URL

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?