UIXHERO

Switch(スイッチ)

ON/OFFを即座にシステムへ反映させる設定コンポーネント。操作した瞬間に副作用が発生するため、確認なしに取り返せない設定には使用しない。

2026年2月28日
更新: 2026年8月28日
17
by Dengen Yosho(DGYS)

操作した瞬間に設定が変わる「即時反映型」のON/OFFコントロール。スマートフォンのOSから持ち込まれた直感的なだが、「保存なしで即時適用される」という暗黙の契約をユーザーと結んでいる。

この記事を読むと、SwitchとCheckbox・Toggleの正確な使い分け、即時反映における安全設計、A11y(role="switch")要件が自分でできるようになります。


1. UI例(Preview / Live)

このスイッチは、 GUNJO の Switch 実装(checked / onCheckedChangelabel / description props、role="switch")です。操作した瞬間に反映される設定パネルで確認できます(右上 Code で編集可)。

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

操作した瞬間にシステムの状態を変更する即時反映型のON/OFFコントロール。見た目はスライド式のトグルで、スマートフォンのOS設定UIから広まった。

Checkboxとの違い:Checkboxは「フォームの一部として、送信ボタンを押すまで確定しない選択肢」。Switchは「操作した瞬間に設定が変わる即時コントロール」。保存ボタンが必要かどうかが判断基準。

Toggleとの違い:Toggleはエディタの書式設定ボタンのように「コンテンツへのスタイル適用」に使い、SwitchはOSやアプリの「システム設定の即時変更」に使う。副作用の重さと即時性が異なる。


3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • アプリの設定画面で、操作した瞬間に設定が保存・反映されるON/OFFコントロール(通知設定・ダークモード・自動保存など)
  • 保存ボタンなしで即時反映されることがユーザーに自明な
  • フォームの外側に配置される独立した設定項目

3.2 When NOT to use

  • フォームの一部として、送信ボタンで一括確定する選択肢(Checkbox を使う)
  • 「同意する」「利用規約に合意」など、意思確認を要する選択(Checkbox を使う)
  • 操作後にが必要になるほど重大な変更(AlertDialog を使う)

3.3 代替UI(Alternatives)

  • フォーム内の選択肢 → Checkbox
  • コンテンツへのスタイル適用切替 → Toggle
  • 重大な設定変更(取り消し不可) → AlertDialog → 確認後に Switch

4. 設計判断の核(Decision Principles)

「保存ボタンを押さなくても変わる」——その暗黙の契約を守れるときだけ Switch を使う。

判断の優先順位:① 即時反映か確定か → ② 副作用の重さ → ③ role="switch" の付与

  • Switch を使う = 「操作した瞬間に副作用が発生する」という約束をユーザーに与える。その約束を守れない実装なら Checkbox に変える
  • 非同期処理(APIコール)が完了するまでの間は、Switch を Loading 状態にしてユーザーの連打を防ぐ
  • ON/OFF の意味が「ラベルだけでは不明瞭」な場合は、ONラベル・OFFラベルを並記する(例:「有効 / 無効」)
  • 副作用が取り返しのつかないほど重大な設定の場合は、Switch の前段に AlertDialog を挟んで確認を求める

5. 状態設計(States)

5.1 必須状態(Required)

  • Default ON:青(またはブランドカラー)で塗りつぶし。ノブが右寄り
  • Default OFF:グレーで塗りつぶし。ノブが左寄り
  • Focus:キーボード操作時にフォーカスリングを表示(省略不可)
  • Disabled:透明度を下げ cursor-not-allowed。ラベルの色も薄くする

5.2 条件付き状態(Conditional)

  • Loading:API処理中にノブをスピナー化し、操作を一時無効にする
  • Error:API失敗時に元の状態に戻し、エラーメッセージをトーストやインラインで表示する
状態必須何を伝えるか
Default ON現在この設定が有効であること
Default OFF現在この設定が無効であること
Focusキーボードユーザーに今ここにいることを示す
Disabledこの設定は現在変更できないこと
Loading設定変更をシステムが処理中で、完了まで待つ必要があること
Error設定変更が失敗し、元の状態に戻ったこと

6. バリエーション設計(Variants)

Switch のバリアントは「見た目のサイズ」より「ラベルの配置と明示度」で設計する。

バリアント目的
Label Left設定項目名をSwitchの左に置く(一般的な設定行)
Label with Description設定名+補足テキスト+Switch の3点セット(意味が複雑な設定)
ON/OFF Inline LabelSwitch内部または直隣に「ON」「OFF」文字を表示(意味が曖昧な場合)

禁止パターン:ラベルなしのSwitch単体 → 何をON/OFFしているのか完全に不明になる。


7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • Checkboxで即時反映:フォーム内のCheckboxを「保存なしで即時変更」として使うと、ユーザーが「これは保存されるのか?」と混乱する
  • Loading状態の欠落:API処理中も Switch が操作可能なまま → 連打による不整合状態が発生する
  • role="switch" の欠落:見た目がSwitchでも role がなければスクリーンリーダーは「ボタン」として読み上げ、ON/OFF状態を伝えられない

7.1 Bad(典型3つ)

  • 設定フォームに Checkbox が並び、「保存する」ボタンなしで配置 → Switch にすべき or 保存ボタンが必要か不明
  • Switch を操作してAPIが失敗したが、UIは ON のまま → ユーザーは設定が変わったと誤認する
  • <div> にCSSだけで Switch を再現し role="switch"aria-checked もない → スクリーンリーダーが無視する

7.2 Good(対になる3つ)

  • 即時反映の設定には Switch、フォームの一括確定には Checkbox と役割を分離する
  • API処理中は Switch を Loading 状態(スピナー+disabled)にし、完了後に結果でUI状態を確定する
  • <button role="switch" aria-checked={isOn}> を使い、ON/OFF状態を DOM に正確に反映する

7.3 How to fix(手順)

  1. 「保存ボタンを押さずに即時変更が起きるか?」を確認 → Yes なら Switch、No なら Checkbox
  2. APIコールを伴う場合は Loading 状態を追加し、成功/失敗で UI 状態を確定するハンドリングを実装する
  3. <button role="switch" aria-checked={checked}> で実装し、見た目の状態と AR 状態を常に同期する

7.4 GUNJO 実装で見る(Bad / Good)

同じ GUNJO の Switch を、ラベル関連付けの崩れた使い方と正しい使い方で


8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Keyboard

  • Tab でフォーカスでき、Space で状態を切り替えられること

Focus

  • フォーカスリングは周囲と4.5:1以上のコントラストを持つこと

Screen Reader

  • role="switch"aria-checked を付与し、スクリーンリーダーが「スイッチ、オン/オフ」と読み上げられるようにする
  • ラベルが視覚的に分離している場合は aria-labelledby または aria-label で関連付ける
<!-- 基本パターン -->
<button
  role="switch"
  aria-checked="true"
  aria-label="プッシュ通知"
>
  <!-- ノブのDOM -->
</button>

Touch / Pointer

  • 最小 44×44px 以上を確保する(Switchのトラック全体をタップ可能にする)

Contrast / Readability

  • ON状態の背景色(青)とノブ(白)は3:1以上のコントラスト比を確保する( 1.4.11)

10. 実装メモ(Implementation Notes)

  • role="switch"<input type="checkbox"> でも代替できるが、見た目を完全にカスタマイズするには <button role="switch"> の方が扱いやすい。ただし <input> の方がフォームとの統合が容易
  • Radix UI / shadcn の Switch コンポーネントは role="switch"aria-checked を自動管理し、さらにフォームライブラリ(react-hook-form 等)との統合も容易なため推奨
  • iOS Safari では role="switch" の読み上げが「スイッチ」と認識される。Androidは「チェックボックス、オン/オフ」と読む場合がある。クリティカルなA11y要件がある場合は実機テストを行う

11. 関連リンク


12. まとめ

Switch の設計は「即時反映の約束を守れるか」という一問に尽きます。迷ったら 4. 設計判断の核 に戻り、「保存ボタンなしで変わるか?」を確認してください。即時反映するなら role="switch" と Loading 状態の実装が最低ライン。副作用が重大な場合は AlertDialog を前段に挟んで誤操作を防いでください。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年8月28日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る