ドロップダウン(アクションメニュー)
クリックで開くアクションメニューの実装比較。グループ化・アイコン付き・ネスト構造など実践的なパターンをインタラクティブに確認できます。
💡 値を選ぶセレクトボックス・コンボボックスをお探しの場合はセレクトボックス・コンボボックスページ →
Mantine Menu
Mantine の Menu は Target / Dropdown のコンポジション API を採用したアクションメニュー専用コンポーネント。 position で12方向の表示位置を制御、withArrow で矢印表示、closeOnItemClick で選択後の動作を制御できる。 グループ化・アイコン・danger・disabled アイテムも標準対応。
Menu.Target / Dropdownposition 12方向withArrowグループ化danger / disabled
読み込み中...
tsx
'use client';
import { MantineProvider, Menu, Button } from '@mantine/core';
import '@mantine/core/styles.css';
export function MantineDropdownDemo() {
return (
<MantineProvider>
<div className="flex gap-4 flex-wrap">
{/* アクションメニュー */}
<Menu>
<Menu.Target>
<Button variant="default">操作メニュー ▾</Button>
</Menu.Target>
<Menu.Dropdown>
<Menu.Label>ファイル操作</Menu.Label>
<Menu.Item>📄 新規作成</Menu.Item>
<Menu.Item>💾 保存</Menu.Item>
<Menu.Divider />
<Menu.Item color="red">🗑️ 削除</Menu.Item>
</Menu.Dropdown>
</Menu>
{/* アイコンボタン型 */}
<Menu>
<Menu.Target>
<Button variant="outline" color="gray">⋮ 詳細</Button>
</Menu.Target>
<Menu.Dropdown>
<Menu.Item>✏️ 編集</Menu.Item>
<Menu.Item>📋 複製</Menu.Item>
<Menu.Item color="red">🗑️ 削除</Menu.Item>
</Menu.Dropdown>
</Menu>
</div>
</MantineProvider>
);
}🤖 AIプロンプトテンプレート
React + Tailwind CSSで、Mantineを使ったドロップダウンメニューを実装してください。 - 使用ライブラリ: @mantine/core の Menu・Select・MultiSelect コンポーネント - Menu.Target と Menu.Dropdown のコンポジション API でアクションメニューを実装 - position prop でメニューの表示位置を制御(bottom-start・top-end など12方向) - Select コンポーネントで単一選択フォームを実装(searchable prop で検索対応) - MultiSelect コンポーネントで複数選択フォームを実装(maxValues で最大選択数を制限) - group キーでアイテムのグループ化を実現 - クリア機能(clearable prop)とデフォルト値の設定
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。
ライブラリ比較
| 項目 | Mantine | Ant Design | shadcn/ui | Chakra UI | MUI | CSS カスタム |
|---|---|---|---|---|---|---|
| アクションメニュー | ✅ Menu(Target/Dropdown) | ✅ Dropdown(items配列) | ✅ DropdownMenu(Radix UIベース) | ✅ Menu(Root/Trigger/Content) | ✅ Menu + MenuItem | ⚠️ 自作コンポーネント |
| メイン+メニューボタン | ⚠️ 手動で構成 | ✅ Space.Compact統合 | ⚠️ 手動で構成 | ⚠️ 手動で構成 | ⚠️ 手動で構成 | ⚠️ 手動で構成 |
| danger アイテム | ✅ color="red" | ✅ danger prop | ✅ variant="destructive" | ✅ color="red.500" | ✅ sx={{ color: 'error.main' }} | ✅ dangerフラグ |
| disabled アイテム | ✅ disabled prop | ✅ disabled prop | ✅ disabled prop | ✅ disabled prop | ✅ disabled prop | ✅ disabled フラグ |
| グループ化 / ラベル | ✅ Menu.Label | ✅ type: 'group' | ✅ DropdownMenuGroup | ✅ Menu.ItemGroup | ✅ ListSubheader | ⚠️ 手動レンダリング |
| 表示位置制御 | ✅ position 12方向 | ✅ placement 8方向 | ✅ side / align | ✅ placement prop | ✅ anchorEl + anchorOrigin | ⚠️ CSS で手動 |
| アクセシビリティ | ✅ WAI-ARIA準拠 | ✅ WAI-ARIA準拠 | ✅ 自動(Radix UI) | ✅ WAI-ARIA準拠 | ✅ WAI-ARIA準拠 | ⚠️ 手動対応が必要 |
| バンドルサイズ | ⚠️ 中(全体で大) | ⚠️ 中(全体で大) | ✅ 使った分だけ | ⚠️ 中(emotion含む) | ⚠️ 中(Emotion込み) | ✅ ゼロ追加 |
選択のポイント
- Mantine — Menu の Target/Dropdown コンポジション API が直感的で柔軟。 position で12方向の表示位置を制御でき、グループ化・danger・disabled・withArrow も 標準サポート。Mantine を採用しているプロジェクトなら統一感を保ちながら使いやすい。
- Ant Design — Space.Compact と組み合わせることでメインアクション+メニューを1セットで実現できる点が便利。 items 配列による宣言的な定義で可読性が高く、danger・disabled・グループ化も items レベルで設定できる。 trigger で click・hover・contextMenu を切り替えられる柔軟さも特徴。
- Chakra UI — Menu.Root / Trigger / Content の複合コンポーネントパターンで構成。 Portal で DOM 外にレンダリングするため z-index の問題が起きにくい。 asChild prop で任意の要素をトリガーにできる柔軟性がある。
- MUI — 週670万DLと圧倒的なシェアを誇るMaterial Design準拠のライブラリ。anchorEl でメニュー表示位置を 制御し、sx prop でスタイルをきめ細かく調整できる。エンタープライズ〜スタートアップまで幅広く採用され、 ドキュメントや事例が豊富。
- shadcn/ui — Radix UI ベースでアクセシビリティが高く、キーボード操作・スクリーンリーダー対応が標準装備。 DropdownMenuCheckboxItem や RadioItem など、メニュー内の状態管理も宣言的に書ける。 コードが手元にあるため、スタイルの完全カスタマイズが可能。
- CSS カスタム — デザインを完全にコントロールしたい場合や外部ライブラリを避けたい場合に最適。 useClickOutside・開閉アニメーション・グループ化・danger を自前実装するため学習コストはあるが、 デザインシステムへの完全準拠・軽量化を優先する場面では選ぶ価値がある。
ドロップダウンメニューは、ボタンやリンクをクリック・ホバーすると選択肢のリストが展開するUIコンポーネント。コンテキストメニューとも呼ばれる。
ナビゲーションのサブメニュー・「…」メニューのアクション一覧・テーブル行の操作メニュー・フィルター選択など、限られたスペースに複数のアクションを格納する場面で使われる。
主なバリエーション
- •基本ドロップダウン型
- •アイコン付き型
- •区切り線付き型
- •ネストメニュー型(サブメニュー)
- •コンテキストメニュー型(右クリック)