本文へスキップ
Material 3 Expressivev1.3.0-rc.1
アクション · 準拠済み

FloatingActionButton

FloatingActionButtonFloatingActionButtonElevationFloatingActionButtonPropsFloatingActionButtonSize

Expressive floating action buttons

Native promoted actions with size-aware extension, elevation, and toggle motion.

playground/examples/FloatingActionButton.example.tsx

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内にインタラクティブなコンテンツを置かないでください。

サイズ高さアイコン角タイポグラフィ先頭/末尾アイコンとラベルの間隔
standard56px24px16pxtitle medium16 / 16px8px
medium80px28px20pxtitle large26 / 26px12px
large96px36px28pxheadline small28 / 28px16px

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時フォーカス時押下時
defaultLevel 3Level 4Level 3Level 3
loweredLevel 1Level 2Level 1Level 1
noneLevel 0Level 0Level 0Level 0
toggleLevel 3Level 3Level 3Level 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、アプリケーション独自のコード、アニメーションランタイム、配置ライブラリは読み込みません。