Drag Interaction UI(ドラッグ操作UIの作り方)

Drag Interaction UIのアイキャッチ画像

1.Drag Interaction UIとは

ドラッグ操作は、単なるイベント処理ではなく「入力設計」と「状態管理」が重要になります。
先に理解しておくと、実装がかなりスムーズになります。

ドラッグ操作UIは、ユーザーが要素を直接動かせるインタラクションです。

  • カード移動
  • スライダー
  • カンバンUI
  • モバイルジェスチャ

など、多くのUIの基本になります。

2.今回作るUI

  • 要素をドラッグで移動
  • 離したときに少し慣性がつく
  • 指やマウス両対応(pointer events)

基本HTML

<div class="stage">
  <div class="box"></div>
</div>

CSS

body {
  margin: 0;
  height: 200vh;
  background: #0f172a;
  display: flex;
  align-items: center;
  justify-content: center;
}

.stage {
  width: 300px;
  height: 300px;
  border: 1px solid #334155;
  position: relative;
}

.box {
  width: 80px;
  height: 80px;
  background: #38bdf8;
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 12px;
  cursor: grab;
  touch-action: none;
}

JavaScript(基本ドラッグ)

const box = document.querySelector('.box');

let isDragging = false;
let offsetX = 0;
let offsetY = 0;

box.addEventListener('pointerdown', (e) => {
  isDragging = true;
  offsetX = e.clientX - box.offsetLeft;
  offsetY = e.clientY - box.offsetTop;
  box.setPointerCapture(e.pointerId);
});

box.addEventListener('pointermove', (e) => {
  if (!isDragging) return;

  const x = e.clientX - offsetX;
  const y = e.clientY - offsetY;

  box.style.left = x + 'px';
  box.style.top = y + 'px';
});

box.addEventListener('pointerup', () => {
  isDragging = false;
});

box.addEventListener('pointercancel', () => {
  isDragging = false;
});

3.この実装のポイント

pointer eventsを使う理由

  • マウス・タッチ両対応
  • イベント管理がシンプル

イベント処理の基本構造については、以下の記事で詳しく解説しています。

offsetでズレを防ぐ

offsetX = e.clientX - box.offsetLeft;

これがないと、ドラッグ開始時に位置がジャンプします。

4.慣性をつける(応用)

ドラッグ中の速度を記録して、離したあとも動かします。

let velocityX = 0;
let velocityY = 0;
let lastX = 0;
let lastY = 0;

box.addEventListener('pointermove', (e) => {
  if (!isDragging) return;

  velocityX = e.clientX - lastX;
  velocityY = e.clientY - lastY;

  lastX = e.clientX;
  lastY = e.clientY;
});

慣性の動きは、以下の基礎知識と強く関係しています。

requestAnimationFrameで慣性

function animate() {
  if (!isDragging) {
    velocityX *= 0.95;
    velocityY *= 0.95;

    box.style.left = box.offsetLeft + velocityX + 'px';
    box.style.top = box.offsetTop + velocityY + 'px';
  }

  requestAnimationFrame(animate);
}

animate();

アニメーションの基本構造については、以下の記事で詳しく解説しています。

5.よくある失敗

  • touch-action: none を忘れる
  • offset計算しない
  • pointercaptureしない
  • velocityが暴れる

6.実験:Drag Physics Playground

ドラッグして離したときの動きを観察してください。

観察ポイント

  • 速く動かす → 強い慣性
  • ゆっくり動かす → 小さい慣性
  • 減衰で止まる

今回のドラッグUIは、複数の設計要素が組み合わさった実装です。
全体の設計については、以下の記事もあわせてどうぞ。

7.まとめ

ドラッグUIはインタラクション設計の基本です。

  • pointer eventsで統一
  • 状態管理が重要
  • 慣性をつけると一気に体験が良くなる

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA