FloatingActionButton
Expressive floating action buttons
Native promoted actions with size-aware extension, elevation, and toggle motion.
import { useState } from 'react'
import {
Button,
FloatingActionButton,
Icon,
Surface,
Text,
type FloatingActionButtonElevation,
type FloatingActionButtonSize,
} from '@language-lit/material3-expressive'
const sizes: readonly FloatingActionButtonSize[] = ['standard', 'medium', 'large']
const elevations: readonly FloatingActionButtonElevation[] = ['default', 'lowered', 'none']
export function FloatingActionButtonExample() {
const [actionsOpen, setActionsOpen] = useState(false)
const [extended, setExtended] = useState(true)
return (
<Surface
as="section"
aria-labelledby="fab-example-title"
color="surface-container-low"
shape="extra-large"
className="fab-example"
>
<Text as="h2" id="fab-example-title" variant="titleLarge" emphasis="emphasized">
Expressive floating action buttons
</Text>
<Text as="p" variant="bodyMedium">
Native promoted actions with size-aware extension, elevation, and toggle motion.
</Text>
<div className="fab-example__row" aria-label="Floating action button sizes">
{sizes.map((size) => (
<FloatingActionButton
key={size}
aria-label={`${size} create`}
icon={<Icon source="add" />}
size={size}
/>
))}
</div>
<div className="fab-example__row" aria-label="Extended floating action buttons">
{sizes.map((size) => (
<FloatingActionButton
key={size}
icon={<Icon source="edit" />}
label={`${size} compose`}
size={size}
expanded={extended}
elevation={size === 'medium' ? 'lowered' : 'default'}
/>
))}
</div>
<div className="fab-example__row" aria-label="Floating action button elevations">
{elevations.map((elevation) => (
<FloatingActionButton
key={elevation}
aria-label={`${elevation} elevation create`}
icon={<Icon source="add" />}
elevation={elevation}
/>
))}
</div>
<FloatingActionButton
icon={<Icon source="edit" />}
label="Statically collapsed compose"
expanded={false}
/>
<div className="fab-example__row" aria-label="Toggle floating action button sizes">
{sizes.map((size) => (
<FloatingActionButton
key={size}
aria-label={`${size} toggle bookmark`}
icon={<Icon source="bookmark" />}
selectedIcon={<Icon source="bookmark" fill={1} />}
size={size}
toggle
defaultSelected={size !== 'standard'}
/>
))}
</div>
<div className="fab-example__row">
<FloatingActionButton
aria-label="Creation actions"
icon={<Icon source="add" />}
selectedIcon={<Icon source="close" />}
size="large"
toggle
selected={actionsOpen}
onSelectedChange={setActionsOpen}
/>
<Button variant="text" onClick={() => setExtended((value) => !value)}>
{extended ? 'Collapse' : 'Expand'} labels
</Button>
<FloatingActionButton
aria-label="Unavailable"
icon={<Icon source="block" />}
disabled
/>
<FloatingActionButton
icon={<Icon source="edit" />}
label="Disabled compose"
size="large"
disabled
/>
<FloatingActionButton
aria-label="Disabled toggle bookmark"
icon={<Icon source="bookmark" />}
selectedIcon={<Icon source="bookmark" fill={1} />}
size="medium"
toggle
defaultSelected
disabled
/>
</div>
</Surface>
)
}FloatingActionButtonは、Material 3 Expressiveで最も重要なアクションを示すネイティブコントロールです。標準、中、大サイズ、拡張、トグル、エレベーションの各動作に対応し、ルーター、フレームワーク、アイコンパッケージ、配置ライブラリには依存しません。
import {
FloatingActionButton,
Icon,
} from '@language-lit/material3-expressive'
import '@language-lit/material3-expressive/styles.css'
<FloatingActionButton
aria-label="Create"
icon={<Icon source="add" />}
/>仕様
- ルートは常にネイティブの
<button>で、refはHTMLButtonElementです。既定のtypeは"button"です。submit/reset、フォーム所有者、name、value、無効状態、ネイティブのイベントハンドラーは引き続き機能します。 sizeはstandard(既定値)、medium、largeから選択します。- 通常のFABとextended FABでは、
elevationにdefault、lowered、noneを指定します。 iconは必須の装飾用コンテンツで、通常はIconまたはSVGを渡します。labelを追加すると、サイズに応じたextended FABになります。expandedの既定値はtrueです。アクセシブルな名前を変えずに、ラベルを視覚的に折りたたむこともできます。toggle={true}はアイコンだけのトグルFABになります。このときlabel、expanded、独自のエレベーションは型で指定できません。
画面で最も重要なアクションにFABを使います。配置、安全領域、スクロール時の表示、ツールチップ、今後のFabMenuとの組み合わせは、利用側または専用コンポーネントが管理します。
Extended FAB
<FloatingActionButton
icon={<Icon source="edit" />}
label="Compose"
size="medium"
expanded={isExpanded}
elevation="lowered"
/>表示ラベルはネイティブのアクセシブルな名前になります。折りたたまれてもアクセシビリティツリーには残り、視覚上は幅と不透明度を0にする遷移を行います。label内にインタラクティブなコンテンツを置かないでください。
| サイズ | 高さ | アイコン | 角 | タイポグラフィ | 先頭/末尾 | アイコンとラベルの間隔 |
|---|---|---|---|---|---|---|
standard | 56px | 24px | 16px | title medium | 16 / 16px | 8px |
medium | 80px | 28px | 20px | title large | 26 / 26px | 12px |
large | 96px | 36px | 28px | headline small | 28 / 28px | 16px |
mediumとlargeのラベル間隔12px、16pxは、生成トークンファイルに保留値が残る間に適用された現行AndroidXソースの修正に従います。
トグルFAB
トグルモードは、FABメニューで使う現行Expressiveの閉じるボタンへの遷移を実装します。FabMenuの公開前でも独立して利用できます。
const [open, setOpen] = useState(false)
<FloatingActionButton
aria-label="Creation actions"
icon={<Icon source="add" />}
selectedIcon={<Icon source="close" />}
size="large"
toggle
selected={open}
onSelectedChange={setOpen}
/>制御状態にはselectedとonSelectedChangeを使い、非制御状態にはdefaultSelectedを使います。単発のFABはaria-pressedを省略し、トグルFABは真偽値を公開します。利用側のonClickを先に実行し、preventDefault()で内部の状態変更を取り消せます。
選択時は、色がprimary-container/on-primary-containerからprimary/on-primaryへ変わります。サイズを問わず、すべてのボタンでコンテナーを56pxの完全な円形、アイコンを20pxにします。mediumとlargeは元の占有領域である80pxまたは96pxを保ちながら、選択時の表示を論理方向の右上に合わせます。これによりレイアウトを維持し、RTLでは水平方向の端が自動で反転します。
エレベーションと状態
| モード | 通常時 | hover時 | フォーカス時 | 押下時 |
|---|---|---|---|---|
default | Level 3 | Level 4 | Level 3 | Level 3 |
lowered | Level 1 | Level 2 | Level 1 | Level 1 |
none | Level 0 | Level 0 | Level 0 | Level 0 |
| toggle | Level 3 | Level 3 | Level 3 | Level 3 |
hover、フォーカス、押下時のステートレイヤーはシステムの不透明度トークンを使います。ネイティブの無効状態はアクティベートを防ぎ、shadowを取り除き、ソースに基づくon-surfaceの不透明度ロールを適用します。
アクセシビリティ
アイコンだけのFABには、利用者の言語に合ったaria-labelまたはaria-labelledbyが必要です。どちらもない場合は開発ビルドで警告します。extended FABはラベルのコンテンツがアクセシブルな名前になります。アイコンの各スロットは支援技術から隠されるため、内側のIconが重複した名前を付けることはありません。
ポインター、Enter、Space、無効状態、フォーカス、フォームの動作はブラウザーが担います。フォーカスにはトークンに基づく:focus-visibleリングを使います。強制カラー表示ではButtonFace/ButtonText、選択状態にHighlight/HighlightText、無効状態にGrayTextと明示的なアウトラインを使います。モーションを減らす設定では遷移をなくしますが、状態の変化は維持します。
トークンとモーション
コンポーネント変数は、次のリテラルなグループに分けています。
--m3e-comp-floating-action-button-{size}-container-{size|shape}--m3e-comp-floating-action-button-{size}-icon-size--m3e-comp-floating-action-button-{size}-extended-{leading-space|trailing-space|icon-label-space}- 通常、選択されたトグル、無効状態の色変数
- default/lowered時のステートshadow変数とLevel 0のshadow
- 選択されたトグル用のコンテナーサイズ/シェイプとアイコンサイズ
- 最小ターゲットとフォーカスリングの変数
extended FABのサイズにはExpressive fast-spatialモーションを、ラベルの不透明度にはfast-effectsを使います。トグル時のサイズ、角、アイコンにはfast-spatial、色にはfast-effectsを使います。エレベーションにはdefault-effects投影を使います。テーマの上書きはMaterial3Provider内に限定され、描画時にCSSは挿入されません。
SSRと境界
サーバーのマークアップ、初期の展開状態、非制御選択状態の初期値は一貫します。FloatingActionButtonが読み込むのはReactと公開・内部プリミティブだけです。Next.js、Vite、アプリケーション独自のコード、アニメーションランタイム、配置ライブラリは読み込みません。