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

パーツ番号 08-15-03 ・ JavaScript使用

バウンド帰還ドラッグカード

カードを自由にドラッグして離すと、弾みながら必ず元の位置へ着地します。WordPressの付箋メモやドラッグお試しデモUIに使えます。

dragjs

プレビュー

ソースコード

HTML

<div class="d08-15-03-card" id="d08-15-03-card">📌<br>ドラッグしてみて</div>

CSS

.d08-15-03{width:100%;display:flex;align-items:center;justify-content:center}
        .d08-15-03-card{width:118px;height:96px;border-radius:16px;background:#fff;border:1.5px solid #e2e2e8;box-shadow:0 6px 16px rgba(0,0,0,.1);display:flex;align-items:center;justify-content:center;text-align:center;font-size:13px;font-weight:700;color:#2a2d3a;line-height:1.8;cursor:grab;touch-action:none}
        .d08-15-03-card.is-drag{cursor:grabbing;border-color:#6a5cff}

JavaScript

(function(){
        var root=document.getElementById('item-08-15-03');if(!root)return;
        var card=root.querySelector('#d08-15-03-card');if(!card)return;
        var dragging=false,sx=0,sy=0,px=0,py=0,raf=null;
        function apply(x,y,rot){card.style.transform='translate('+x+'px,'+y+'px) rotate('+rot+'deg)';}
        card.addEventListener('pointerdown',function(e){
          dragging=true;card.classList.add('is-drag');
          if(raf)cancelAnimationFrame(raf);
          sx=e.clientX-px;sy=e.clientY-py;
          try{card.setPointerCapture(e.pointerId);}catch(err){}
        });
        card.addEventListener('pointermove',function(e){
          if(!dragging)return;
          px=e.clientX-sx;py=e.clientY-sy;
          apply(px,py,px/18);
        });
        function end(){
          if(!dragging)return;
          dragging=false;card.classList.remove('is-drag');
          var x=px,y=py,vx=0,vy=0,stiff=.16,damp=.74;
          function step(){
            var fx=(0-x)*stiff,fy=(0-y)*stiff;
            vx=(vx+fx)*damp;vy=(vy+fy)*damp;
            x+=vx;y+=vy;apply(x,y,x/18);
            if(Math.abs(x)>.5||Math.abs(y)>.5||Math.abs(vx)>.5||Math.abs(vy)>.5){
              raf=requestAnimationFrame(step);
            }else{px=0;py=0;apply(0,0,0);}
          }
          raf=requestAnimationFrame(step);
        }
        card.addEventListener('pointerup',end);
        card.addEventListener('pointercancel',end);
      })();

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