← 動的パーツギャラリーへ戻る

パーツ番号 08-07-01 ・ JavaScript使用

ドラッグ並び替えリスト

行をつかんで上下にドラッグすると即座に順番が入れ替わります。WordPressのタスク一覧やメニュー項目の並び替えUIに応用できます。

dragjs

プレビュー

ソースコード

HTML

<ul class="d08-07-01-list" id="d08-07-01-list">
          <li class="d08-07-01-item" data-id="a"><span class="d08-07-01-handle">⠿</span>企画書を作成</li>
          <li class="d08-07-01-item" data-id="b"><span class="d08-07-01-handle">⠿</span>デザイン確認</li>
          <li class="d08-07-01-item" data-id="c"><span class="d08-07-01-handle">⠿</span>クライアント確認</li>
          <li class="d08-07-01-item" data-id="d"><span class="d08-07-01-handle">⠿</span>公開・納品</li>
        </ul>

CSS

.d08-07-01-list{list-style:none;margin:0;padding:0;width:100%;max-width:260px;display:flex;flex-direction:column;gap:8px}
        .d08-07-01-item{display:flex;align-items:center;gap:10px;background:#fff;border:1.5px solid #e2e2e8;border-radius:10px;padding:10px 14px;font-size:13px;font-weight:600;color:#2a2d3a;touch-action:none;user-select:none;position:relative;box-shadow:0 1px 2px rgba(0,0,0,.04)}
        .d08-07-01-handle{color:#c4c8d4;font-size:15px;cursor:grab;line-height:1}
        .d08-07-01-item.is-drag{z-index:5;cursor:grabbing;border-color:#6a5cff;box-shadow:0 8px 20px rgba(106,92,255,.22);background:#f7f6ff}

JavaScript

(function(){
        var root=document.getElementById('item-08-07-01');if(!root)return;
        var list=root.querySelector('.d08-07-01-list');if(!list)return;
        var dragEl=null,startY=0,baseTop=0;
        function itemsArr(){return Array.prototype.slice.call(list.children);}
        list.addEventListener('pointerdown',function(e){
          var item=e.target.closest('.d08-07-01-item');if(!item)return;
          dragEl=item;startY=e.clientY;baseTop=item.offsetTop;
          item.classList.add('is-drag');
          try{item.setPointerCapture(e.pointerId);}catch(err){}
        });
        list.addEventListener('pointermove',function(e){
          if(!dragEl)return;
          var dy=e.clientY-startY;
          dragEl.style.transform='translateY('+dy+'px)';
          var dragTop=baseTop+dy;
          var dragMid=dragTop+dragEl.offsetHeight/2;
          itemsArr().forEach(function(sib){
            if(sib===dragEl)return;
            var sibMid=sib.offsetTop+sib.offsetHeight/2;
            if(dragMid>sibMid&&sib.offsetTop>baseTop){
              list.insertBefore(dragEl,sib.nextSibling);
              baseTop=dragEl.offsetTop-dy;
            }else if(dragMid<sibMid&&sib.offsetTop<baseTop){
              list.insertBefore(dragEl,sib);
              baseTop=dragEl.offsetTop-dy;
            }
          });
        });
        function end(){
          if(!dragEl)return;
          dragEl.style.transform='';
          dragEl.classList.remove('is-drag');
          dragEl=null;
        }
        list.addEventListener('pointerup',end);
        list.addEventListener('pointercancel',end);
      })();

クラス名 .d08-07-01 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。