本文へスキップ

グーイ・メタボールメニュー

FABを押すと、子ボタンがぷるんと分裂して飛び出すメタボール演出。SVGフィルタ(ぼかし+コントラスト)で液体のように繋がって見える。

プレビュー

クリック

操作クリック/タップで動きます。

仕様書

向く場面
  • 遊び心のあるFAB展開
  • ブランド演出としてのメニュー
  • 単色で構成できる少数のアクション
避ける場面
  • 業務画面の常用メニュー
  • 背景が複雑で filter が乱れる場所
  • アクションが4個以上で縦に飛び出しすぎる
構成要素
  • メインボタン
  • 子ボタン
  • 液体フィルタ
持っている状態
  • 通常
  • 押下中
キーボード

Tab でメインボタンへ・Enter/Space で開閉。開くと Tab で子ボタンへ(閉状態では入らない)・Esc で閉じてメインへ戻る

支援技術

メインに aria-label=メニューと aria-expanded を同期、子ボタンに aria-label、SVG フィルタは aria-hidden。閉状態の子は visibility:hidden で Tab・読み上げから外す

動き

子は 0.4s のオーバーシュート(cubic-bezier(.34,1.56,.64,1))で飛び出し、+は 0.3s で135°回転。液体の分裂感。reduced-motion では即時

デザインの要点

  • 繋がって見えるのは feGaussianBlur → feColorMatrix(alpha×20−9)の順。ぼかしで滲ませた縁をコントラストで切り直すと、近い円どうしが橋で繋がる
  • 子は cubic-bezier(.34,1.56,.64,1) で行き過ぎてから戻す。等速だと「分裂」ではなく「移動」に見える
  • フィルタは単色の要素だけに当てる。文字や写真まで滲ませると読めなくなるので、メニューの塊だけを filter の対象にする
  • 閉じた子はメインの下に重なって見えないが DOM には残る。visibility:hidden を遅らせて切り、Tab で届かないようにする
実装メモ

繋がって見えるのは SVG の #goo フィルタ(feGaussianBlur→feColorMatrix)の効果です。アイテムは単色だと最もきれいに繋がります。背景に重ねる場合はメニュー側だけ filter を当ててください。

コード(コピーして使えます)

<div class="goo-wrap">
  <div class="goo-menu" data-open="false">
    <button class="goo-item goo-main" aria-label="メニュー" aria-expanded="false">+</button>
    <button class="goo-item goo-child" style="--i:1" aria-label="お気に入り">★</button>
    <button class="goo-item goo-child" style="--i:2" aria-label="いいね">♥</button>
    <button class="goo-item goo-child" style="--i:3" aria-label="花を送る">✿</button>
  </div>
  <svg width="0" height="0" aria-hidden="true">
    <defs>
      <filter id="goo">
        <feGaussianBlur in="SourceGraphic" stdDeviation="6" result="b" />
        <feColorMatrix in="b" mode="matrix"
          values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 20 -9" result="g" />
        <feBlend in="SourceGraphic" in2="g" />
      </filter>
    </defs>
  </svg>
</div>

タグ

同じカテゴリ「ナビ・リスト操作」のほかのパーツ

関連パーツ