UIXHERO

Carousel(カルーセル)

複数のコンテンツアイテムを横スクロールまたはスライドで切り替える複合UIコンポーネント。自動再生・手動ナビゲーション・インジケーター・レスポンシブ対応・アクセシビリティ(aria-roledescription・aria-live)の設計を解説する。

2026年3月3日
更新: 2026年9月3日
15
by Dengen Yosho(DGYS)

複数のコンテンツアイテム(画像・カード・テキスト)を横スクロールまたはスライド形式で切り替えるコンポーネント。前後ナビゲーションボタン・ドットインジケーター・自動再生・スワイプ操作を組み合わせた複合UIで、のヒーロー画像・ECの商品ギャラリー・レビュー一覧・メディアのフィーチャー記事など幅広い場面で使われる。

この記事を読むと、Carousel vs 静的一覧の使い分け・自動再生の弊害と制御・スライドアイテムのARIA実装(role="group" + aria-roledescription)・prefers-reduced-motion 対応・インジケーターの設計が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

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

2. 定義(Definition)

複数のアイテムを横方向にスライドして切り替えるUIコンポーネント。1枚表示・複数枚部分表示・ループ再生など多様な実装がある。

Carousel vs 静的一覧

Carousel静的一覧
視認性1度に1〜数枚のみ全件一覧で比較可能
発見性低い(隠れたアイテムを見落とす)高い
スペース高い(省スペース)低い(縦に伸びる)
向いている用途ヒーロー画像・ギャラリー・レビュー商品比較・記事一覧・フィルター結果

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

3.1 When to use

  • ヒーロービジュアルの切り替え:LPのメインビジュアル・キャンペーンバナー
  • 画像ギャラリー:商品詳細の複数画像・ポートフォリオ
  • テスティモニアル(レビュー):ユーザーの声を1つずつ強調して表示
  • スペースが限られている場面:モバイルでカードを横スクロールで表示

3.2 When NOT to use

  • 比較が必要な商品一覧:ユーザーが全商品を比較できないCarouselは不向き
  • 重要な情報のすべてをCarouselに入れる:隠れたスライドは見落とされる確率が高い
  • ナビゲーション要素やタブの代替にCarouselを使わない

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

Carouselの核は「自動再生を使う場合の一時停止コントロール」——WCAG 2.2の達成基準2.2.2では、5秒以上動くコンテンツには一時停止・停止・非表示の手段を提供することを要求している。自動再生は発見性を下げ、前庭障害のユーザーに悪影響を与える。

判断の優先順位:① 自動再生の是非 → ② role="group" + aria-roledescription → ③ ドットインジケーターのAR → ④ スワイプ対応

  • 自動再生はデフォルトOFF、または prefers-reduced-motion で無効化する@media (prefers-reduced-motion: reduce) で自動再生を止める。ユーザーが自動再生を有効にした場合も、一時停止ボタン(または aria-label="自動再生を停止" ボタン)を提供する
  • 各スライドに role="group" + aria-roledescription="スライド" + aria-label="N / 全M枚":スクリーンリーダーが「スライド 1 / 5:タイトル」と読み上げられるようにする。カルーセル全体を囲む要素には role="region" + aria-roledescription="カルーセル" + aria-label を設定する
  • ドットインジケーターは role="tab" + aria-selected:各ドットにスライド番号を aria-label="スライド N" で示す。現在のスライドに aria-selected="true" を設定する
  • スライド切り替え後は aria-live="polite" でカウンターを読み上げる:「2 / 5」のようなカウンターに aria-live="polite" aria-atomic="true" を設定し、切り替えを音声で通知する

5. 状態設計(States)

状態表示aria
アクティブスライドフォーカス・表示aria-selected="true"
非アクティブスライド非表示または部分表示aria-selected="false"
自動再生中インジケーターが一時停止ボタン表示
一時停止中静止再生ボタン表示
ループ先頭最後のスライドから最初に戻る

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

バリアント説明使用例
Hero Carousel1枚フルワイド表示LPのメインビジュアル
Card Carousel複数カードの部分表示付き関連記事・商品一覧
Testimonial Carouselテキスト中心の1枚表示レビュー・お客様の声
Thumbnail Carouselサムネイル付き選択UI商品画像ギャラリー
Infinite Scroll Carousel横方向の無限スクロールSNSのフィード・タイムライン

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

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

  • 自動再生が止まらない:5秒ごとにスライドが切り替わり続け、ユーザーに読む時間を与えない
  • ARIAが実装されていない<div> の羅列で実装されており、スクリーンリーダーがスライドを識別できない
  • キーボードでナビゲーションできない:矢印ボタンが <div onClick> で実装されており、Tabキーでフォーカスできない

7.1 Bad(典型3つ)

  • setInterval で自動再生し、停止する手段を提供していない
  • スライドを <div> の羅列で実装し、role="group"aria-label もない
  • 前後ボタンが <div onClick>aria-label がなく「左矢印」「右矢印」と読み上げられる

7.2 Good(対になる3つ)

  • useEffect で自動再生を制御し、autoPlay stateのtoggleボタンと prefers-reduced-motion で自動再生を無効化する
  • <div role="region" aria-roledescription="カルーセル"> でラップし、各スライドに role="group" aria-roledescription="スライド" aria-label="1 / 5:タイトル" を設定する
  • <button aria-label="前のスライド"> + <button aria-label="次のスライド"> で実装する

7.3 How to fix(手順)

  1. スライドコンテナに role="region" aria-roledescription="カルーセル" aria-label を追加
  2. 各スライドに role="group" aria-roledescription="スライド" aria-label="N / 全M枚" を追加
  3. ナビゲーションボタンを <button aria-label="前のスライド/次のスライド"> に変更
  4. prefers-reduced-motion で自動再生を無効化し、一時停止ボタンを追加

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


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

Screen Reader

<section
  role="region"
  aria-roledescription="カルーセル"
  aria-label="おすすめ記事"
>
  <div
    role="group"
    aria-roledescription="スライド"
    aria-label="1 / 5:ビジュアルデザインの基礎"
  >
    <!-- スライドコンテンツ -->
  </div>

  <button aria-label="前のスライド">‹</button>
  <button aria-label="次のスライド">›</button>

  <div role="tablist" aria-label="スライドを選択">
    <button role="tab" aria-selected="true" aria-label="スライド 1" />
    <button role="tab" aria-selected="false" aria-label="スライド 2" />
  </div>

  <p aria-live="polite" aria-atomic="true">1 / 5</p>
</section>

10. 実装メモ(Implementation Notes)

  • embla-carousel-react はキーボードナビゲーション・スワイプ・ARIA対応が充実した軽量ライブラリ。shadcn/ui の Carousel コンポーネントも Embla ベース
  • 自動再生の prefers-reduced-motion 対応:const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; で判定し、true の場合は自動再生を初期化しない
  • タッチスワイプの実装:onTouchStart で開始X座標を記録し、onTouchEnd でdiff > 50px なら前後に切り替える。またはPointer Events APIを使う
  • 複数枚部分表示のLayout:display: flex + overflow: hidden + スライドに min-width: calc(100% / N) のアプローチが基本

11. 関連リンク


12. まとめ

Carouselの設計で最重要なのは「自動再生の一時停止コントロール」と「role="group" + aria-roledescription のARIA実装」です。CarouselはビジュアルインパクトのあるUIですが、アクセシビリティ実装が最も疎かになりやすいコンポーネントの1つです。自動再生はデフォルトOFFまたは prefers-reduced-motion で無効化し、必ず停止手段を提供してください。重要な情報をCarouselに入れる場合は、隠れたスライドが見落とされることを前提に、代替の静的一覧も検討してください。

更新のお知らせ

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

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

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

UIXHEROに頼めることを見る

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

記事をシェア

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

最終更新: 2026年9月3日

この記事を書いた人

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

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

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

リクエストを送る