LoginSignup
31
35

More than 5 years have passed since last update.

スマホ対応の超軽量VanillaなJavaScriptドラッグ&ドロップ

Last updated at Posted at 2015-10-15

HTML5の標準でDrag&Dropが実装されましたので、jQueryなどを使わなくてもドラッグ&ドロップが簡単に実現できるようになりました。
しかしマウスイベントのみという状況なので、iPhoneなどのマウスを使わない、TouchイベントのデバイスではjQueryに頼っているという人も多いと思います。

jQueryやプラグインを使用しなくても、以下の様なVanillaの簡単なコードでリストの並び替えができます。

HTMLコード
<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>
JavaScriptコード
var lis = document.querySelectorAll('li');
var draggingItem;
[].forEach.call(lis, function(li){
    li.setAttribute('draggable', true);
    li.addEventListener('touchstart', function(e){
        draggingItem = li;
    });
    li.addEventListener('touchend', function(e){
        draggingItem = null;
    });
    li.addEventListener('touchmove', function(e){
        e.preventDefault();
        var getOrder = function(elem){
            return [].indexOf.call(elem.parentNode.children, elem);
        }
        var pointedElement = document.elementFromPoint(e.pageX - window.pageXOffset, e.pageY - window.pageYOffset);
        if(!pointedElement.getAttribute('draggable') || pointedElement == draggingItem) return;
        var order = getOrder(pointedElement) - getOrder(draggingItem);
        if(order > 0) {
            pointedElement.parentNode.insertBefore(pointedElement, draggingItem);
        } else if (order < 0) {
            pointedElement.parentNode.insertBefore(draggingItem, pointedElement);
        }
    });
});

実際に動くデモは以下に置いています。
デモ

31
35
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
31
35