Dialog
HTML Dialog APIを使用したネイティブなダイアログコンポーネント
概要
DialogコンポーネントはHTML <dialog>要素を使用し、ネイティブなモーダルダイアログ機能を提供します。showModal()メソッドを活用し、バックドロップ、フォーカストラップ、ESCキーでの閉じる動作などを自動的に処理します。
デモ
基本的な使い方
import { Button } from "@/registry/ui/button"
import {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/registry/ui/dialog"
import { Input } from "@/registry/ui/input"
import { Label } from "@/registry/ui/label"
export function DialogDemo() {
return (
<Dialog>
<DialogTrigger asChild>
<Button variant="outline">ダイアログを開く</Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogTitle>プロフィールの編集</DialogTitle>
<DialogDescription>
プロフィールの変更を行います。完了したら保存をクリックしてください。
</DialogDescription>
</DialogHeader>
<div className="grid gap-4 py-4">
<div className="grid grid-cols-4 items-center gap-4">
<Label htmlFor="name" className="text-right">
名前
</Label>
<Input id="name" defaultValue="山田 太郎" className="col-span-3" />
</div>
<div className="grid grid-cols-4 items-center gap-4">
<Label htmlFor="username" className="text-right">
ユーザー名
</Label>
<Input id="username" defaultValue="@yamada" className="col-span-3" />
</div>
</div>
<DialogFooter>
<DialogClose asChild>
<Button type="submit">変更を保存</Button>
</DialogClose>
</DialogFooter>
</DialogContent>
</Dialog>
)
}インストール
npx shadcn@latest add https://your-registry-url.com/r/dialog.jsonProps
Dialog
Prop
Type
DialogTrigger
Prop
Type
DialogContent
Prop
Type
ネイティブ機能
HTML <dialog>要素により、以下の機能が自動的に提供されます:
- ✅ トップレイヤー: ダイアログは常に他のすべての要素の上に表示されます(
z-index管理不要) - ✅ バックドロップ:
::backdrop疑似要素で背景を暗くし、クリックをブロックします - ✅ フォーカストラップ: ダイアログが開いている間、フォーカスはダイアログ内に制限されます
- ✅ ESCキーで閉じる: ESCキーを押すとダイアログが閉じます
- ✅ アクセシビリティ: スクリーンリーダーなどの支援技術に対して適切な役割と状態を提供します
ブラウザ互換性
HTML <dialog>要素は主要なモダンブラウザで広くサポートされています:
- ✅ Chrome 37+
- ✅ Edge 79+
- ✅ Firefox 98+
- ✅ Safari 15.4+
技術的詳細
useRefを使用して<dialog>要素への参照を管理し、showModal()とclose()メソッドを呼び出します。React.createContextを使用して、トリガーとコンテンツ間で開閉状態を共有します。DialogCloseコンポーネント内のボタンクリックイベントの伝播を停止(e.stopPropagation())することで、ダイアログのバックドロップクリックハンドラーとの干渉を防いでいます。