Magnetic Button UI(カーソルに引き寄せられるインタラクション)

Magnetic Button UIのアイキャッチ画像

1.Magnetic Button UIとは

カーソルが近づくと、ボタンが「吸い付く」ように動くインタラクションです。

  • 距離に応じて引き寄せられる
  • 離れると元の位置に戻る
  • 触っている感覚が強くなる

単なるホバー演出ではなく、「操作している感触」を作るUIです。

このような動きは、アニメーションの基礎であるrequestAnimationFrameや補間(lerp)の考え方を使って実現できます。

2.基本の考え方

やっていることはシンプルです。

  1. カーソルとボタンの距離を計算
  2. 一定距離内なら引き寄せる
  3. 離れたら元の位置へ戻す

3.実装(シンプル版)

<div class="magnetic-wrap">
  <button class="magnetic-btn">Hover Me</button>
</div>
body {
  height: 200vh;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #0e0e0e;
}

.magnetic-wrap {
  width: 200px;
  height: 100px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.magnetic-btn {
  padding: 16px 32px;
  font-size: 16px;
  background: #ffffff;
  color: #000;
  border: none;
  cursor: pointer;
  transition: transform 0.2s ease;
}
const wrap = document.querySelector(".magnetic-wrap");
const btn = document.querySelector(".magnetic-btn");

wrap.addEventListener("mousemove", (e) => {
  const rect = wrap.getBoundingClientRect();
  
  const x = e.clientX - rect.left - rect.width / 2;
  const y = e.clientY - rect.top - rect.height / 2;

  btn.style.transform = `translate(${x * 0.2}px, ${y * 0.2}px)`;
});

wrap.addEventListener("mouseleave", () => {
  btn.style.transform = `translate(0, 0)`;
});

4.強化版(滑らかにする)

ここからが重要です。
lerp(線形補間)で動きを滑らかにします。

let targetX = 0;
let targetY = 0;
let currentX = 0;
let currentY = 0;

wrap.addEventListener("mousemove", (e) => {
  const rect = wrap.getBoundingClientRect();

  targetX = (e.clientX - rect.left - rect.width / 2) * 0.3;
  targetY = (e.clientY - rect.top - rect.height / 2) * 0.3;
});

wrap.addEventListener("mouseleave", () => {
  targetX = 0;
  targetY = 0;
});

function animate() {
  currentX += (targetX - currentX) * 0.1;
  currentY += (targetY - currentY) * 0.1;

  btn.style.transform = `translate(${currentX}px, ${currentY}px)`;

  requestAnimationFrame(animate);
}

animate();

5.実験:Magneticインタラクションを体験

以下を試してみてください。

  • カーソルをゆっくり近づける
  • 速く動かす
  • 端から端まで動かす

観察ポイント

  • 距離によって吸引の強さが変わる
  • lerpによる「遅れて追従する感じ」
  • 離れた時の戻りの気持ちよさ

6.応用アイデア

この仕組みは色々使えます。

  • CTAボタン
  • カードUI
  • ナビゲーション

強さを調整するだけで印象が変わります。

スクロールに応じたインタラクションと組み合わせることもできます。

Scroll Trigger Animation

Scroll Sync UI

今回の実装で使っている基礎はこちらで詳しく解説しています。

requestAnimationFrameの使い方

easingの仕組み

7.まとめ

Magnetic Button UIは、

  • 距離計算
  • 補間(lerp)
  • フレーム更新(requestAnimationFrame)

を組み合わせたインタラクションです。

見た目はシンプルですが、
「触って気持ちいいUI」を作る重要な要素が詰まっています。

コメント

コメントを残す

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

CAPTCHA