スライドコントロールのタブを持つ自動回転画像カルーセルの例

この例について

以下のカルーセルパターンの実装例は、ページの読み込み時に自動的に回転を開始するカルーセルのアクセシビリティに不可欠なパターンの特徴を示しています。 この例は、シーケンス内のスライドをスキップして直接表示するスライドを選択する方法として、タブパターンを利用する方法を示しています。 スライド間のナビゲーションは、タブとして機能する一連の円形のボタンによって提供され、回転するスライドの上にレンダリングされます。 利用者がカルーセル内の任意のコントロールやリンクにフォーカスを移動するか、カルーセルのコンテンツの上にマウスをホバーすると、自動回転が停止します。 例の後に続くアクセシビリティの特徴のセクションでは、これらデザインの側面を詳しく説明しています。

類似の例には以下があります:

例のオプション

アクセシビリティ機能

自動スライド回転の制御

利用者はスライドの回転を停止及び開始することができます。これは、障害を持つ様々な人々にとって、カルーセルのアクセシビリティの不可欠な側面です。 ロービジョンや、視覚処理や読解に影響を及ぼす認知障害のある人にとって、スライドの回転を制御できることは、スライドの内容を探索するのに十分な時間を確保できることになり、利益を得られます。 同様に、スクリーンリーダーの利用者は自動的な回転を知覚できないため、ページを読むことが混乱しやすく、方向感を失わせることがあります。 例えば、スライドが自動的に回転しているとき、スクリーンリーダーの利用者はスライド 1 の要素を読んで、次の要素を読むためのスクリーンリーダーのコマンドを実行するかもしれませんが、スライド 1 の次の要素を聞く代わりに、完全に新しいコンテキストからの要素であるスライド 2 の要素を聞くことになり得ます。

この例には、利用者がスライドの回転を制御するための以下の機能が含まれています:

テキストと回転制御の色のコントラスト

このカルーセルのビューでは、コントロールとキャプションが画像内に表示されている場合、背景画像によってコントロールとテキストの色のコントラストが不十分になる可能性があります。 しかし、このビューには、この潜在的な問題を防ぐための以下の機能が含まれており、WCAG 2.1 の色のコントラスト要件を満たしています:

画像内にあるコントロールとテキストの色のコントラストの問題を回避する一つの方法は、コントロールを画像の外に配置することです。 コントロールとテキストを固定背景上に移動にすることで、著者には色のコントラストを制御するのが、利用者にはそれを知覚するのが簡単になります。 このテクニックの一例はビューオプションのうちのひとつです。

タブリストとタブのフォーカススタイリング

スライドの変更のスクリーンリーダーの読み上げ

自動回転がオフになっている場合、カルーセルのスライドコンテンツはライブリージョンに含まれています。 これにより、スクリーンリーダーの利用者がカルーセルのスライドをスキャンするのが簡単になります。 スクリーンリーダーの利用者が新しいタブを押下すると、新しいスライドのコンテンツが読み上げられ、コンテンツを操作するかどうかを判断するための即時のフィードバックが与えられます。 非常に重要なことに、自動回転がオンになっている場合、ライブリージョンは無効になっています。 そうでなければ、継続的に変更されるコンテンツの読み上げが利用者が読んでいる他のものを毎回中断するため、ページが使用できなくなります。

注記: 通常のタブにおいては、タブパネルをライブ領域にすることは推奨されません。 カルーセルの使用例では、コンテンツの迅速かつ軽量なスキャンが主な目的であるため、ライブ領域は自動回転を有する非スクリーンリーダー利用者の体験を模倣するために使用されます。

キーボードサポート

回転制御ボタン

キー 機能
Tab
  • カルーセル内のインタラクティブな要素を通してフォーカスを移動します。
  • 回転制御ボタンとタブリストは、Tab の順序でスライドの内容よりも先に来ます。
Enter 又は Space カルーセル内のスライドの自動回転を切り替えます。

タブ

キー 機能
Tab
  • フォーカスが tablist に移動すると、アクティブな tab 要素にフォーカスを置きます。カルーセル内の各スライドは tab によって制御されます。
  • タブリストがフォーカスを持っている場合、tab シーケンスにおける次の要素にフォーカスを移動します。それは現在表示されているスライド内のリンクです。
Right Arrow
  • 次のタブにフォーカスを移動します。
  • フォーカスが最後のタブにある場合、最初のタブにフォーカスを移動します。
  • 新しくフォーカスされたタブに関連付けられたスライドを表示します。
Left Arrow
  • 前のタブにフォーカスを移動します。
  • フォーカスが最初のタブにある場合、最後のタブにフォーカスを移動します。
  • 新しくフォーカスされたタブに関連付けられたスライドを表示します。
Home 最初のタブにフォーカスを移動し、最初のスライドを表示します。
End 最後のタブにフォーカスを移動し、最後のスライドを表示します。

ロール、プロパティ、ステート、及び tabindex 属性

回転制御

ロール 属性 要素 使用法
aria-label button アクセス可能な名前は、ボタンが実行するアクションを反映して変更されます:
  • 自動回転が一時停止している場合、ラベルは「自動スライドショーを開始」です。
  • カルーセルが自動的に回転している場合、ラベルは「自動スライドショーを停止」です。

タブ

ロール 属性 要素 使用法
暗黙の region ロール section
  • アクセス可能な名前を持つ任意の section 要素には region ロールが暗示れます。
  • カルーセルとそのコントロールをランドマーク領域として定義します。
aria-roledescription="カルーセル" section
  • 要素を「region」ではなく「カルーセル」として識別するように支援技術に知らせます。
  • ランドマーク領域への移動のような機能には影響せず、支援技術がロールをどのようにレンダリングするかに影響します。
  • 注記: aria-roledescriptionの値はページの言語を使用して明示され、著者によってローカライズされる必要があります。
aria-label="ハイライトされたテレビ番組" section カルーセル領域の内容を説明するラベルを提供します。
aria-live="off" div.carousel-items
  • すべてのスライドを含むdiv要素に適用されます。
  • コンテナ要素を「off」状態のライブ領域として特定し、支援技術の利用者は領域の変更について通知されません。
  • カルーセルが自動的に回転しているとき、ライブ領域はオフになります。
aria-live="polite" div.carousel-items
  • すべてのスライドを含むdiv要素に適用されます。
  • コンテナ要素を「polite」状態のライブ領域として特定し、支援技術の利用者は次の利用可能な機会に領域の変更について通知されます。
  • これにより、対応するタブが選択されたときにスクリーンリーダーが自動的にスライドの内容を読み上げます。
tablist div 要素がタブのセットのコンテナとして機能することを示します。
aria-label="スライド" div タブリストのアクセス可能な名前を提供します。
tab button
  • 要素がタブ制御として機能することを示します。
  • フォーカスが当たると、自動的にアクティブになり、関連する tabpanel(すなわちスライド)が表示されます。
aria-label="スライド X" button タブのアクセス可能な名前を提供します。
aria-selected="true" button
  • タブ制御がアクティブであり、関連するパネルが表示されていることを示します。
  • タブがフォーカスを受け取ったときに設定されます。
aria-selected="false" button
  • タブ制御がアクティブでなく、関連するパネルが表示されていないことを示します。
  • 現在表示されているスライドに関連するタブを除く、タブセット内のすべてのタブ要素に設定されます。
tabindex="-1" button
  • 要素をページの Tab 順序から削除します。
  • 選択されていないタブに設定され、ページの Tab 順序には選択されたタブのみが含まれるようにします。
  • タブ要素は HTML の button であるため、タブが選択 (アクティブに) されたときには tabindex="0" に設定するのではなく、tabindex 属性が削除されます。
  • このフォーカスの管理方法は、 Roving tabindex を使用したコンポーネント内のフォーカスの管理 のセクションで説明されています。
aria-controls="IDREF" button タブに関連する tabpanel 要素を参照します。
tabpanel div
  • 要素が、関連するタブ要素によって制御される tabpanel として機能することを示します。
  • 関連する tab 制御がアクティブでない限り、非表示になります。
aria-roledescription="スライド" div
  • 要素を「tabpanel」としてではなく「スライド」として識別するように支援技術に知らせます。
  • 支援技術の機能には影響せず、支援技術がロールをどのようにレンダリングするかに影響します。
  • 注記: aria-roledescription の値はページの言語を使用して明示され、著者によってローカライズされる必要があります。
aria-label="Y枚中のX" div
  • スライドのセット内でのスライドの位置を示すタブパネル(スライド)のアクセス可能な名前を提供します。
  • aria-roledescription と組み合わせると、スクリーンリーダーはタブパネルをスライドとして、位置も含めて読み上げることができます。例:「スライド 6枚中の1」。

JavaScript 及び CSS のソースコード

HTML ソースコード

<section id="myCarousel"
         class="carousel-tablist"
         aria-roledescription="カルーセル"
         aria-label="ハイライトされたテレビ番組">
  <div class="carousel-inner">
    <div class="controls">
      <button class="rotation" type="button">
        <svg width="42"
             height="34"
             version="1.1"
             xmlns="http://www.w3.org/2000/svg"
             class="svg-play">
          <rect class="background"
                x="2"
                y="2"
                rx="5"
                ry="5"
                width="38"
                height="24"></rect>
          <rect class="border"
                x="4"
                y="4"
                rx="5"
                ry="5"
                width="34"
                height="20"></rect>
          <polygon class="pause" points="17 8 17 20"></polygon>
          <polygon class="pause" points="24 8 24 20"></polygon>
          <polygon class="play" points="15 8 15 20 27 14"></polygon>
        </svg>
      </button>
      <div class="tab-wrapper">
        <div role="tablist" aria-label="スライド">
          <button id="carousel-tab-1"
                  type="button"
                  role="tab"
                  aria-label="スライド 1"
                  aria-selected="true"
                  aria-controls="carousel-item-1">
            <svg width="34"
                 height="34"
                 version="1.1"
                 xmlns="http://www.w3.org/2000/svg">
              <circle class="border"
                      cx="16"
                      cy="15"
                      r="10"></circle>
              <circle class="tab-background"
                      cx="16"
                      cy="15"
                      r="8"></circle>
              <circle class="tab"
                      cx="16"
                      cy="15"
                      r="6"></circle>
            </svg>
          </button>
          <button id="carousel-tab-2"
                  type="button"
                  role="tab"
                  tabindex="-1"
                  aria-label="スライド 2"
                  aria-selected="false"
                  aria-controls="carousel-item-2">
            <svg width="34"
                 height="34"
                 version="1.1"
                 xmlns="http://www.w3.org/2000/svg">
              <circle class="border"
                      cx="16"
                      cy="15"
                      r="10"></circle>
              <circle class="tab-background"
                      cx="16"
                      cy="15"
                      r="8"></circle>
              <circle class="tab"
                      cx="16"
                      cy="15"
                      r="6"></circle>
            </svg>
          </button>
          <button id="carousel-tab-3"
                  type="button"
                  role="tab"
                  tabindex="-1"
                  aria-label="スライド 3"
                  aria-selected="false"
                  aria-controls="carousel-item-3">
            <svg width="34"
                 height="34"
                 version="1.1"
                 xmlns="http://www.w3.org/2000/svg">
              <circle class="border"
                      cx="16"
                      cy="15"
                      r="10"></circle>
              <circle class="tab-background"
                      cx="16"
                      cy="15"
                      r="8"></circle>
              <circle class="tab"
                      cx="16"
                      cy="15"
                      r="6"></circle>
            </svg>
          </button>
          <button id="carousel-tab-4"
                  type="button"
                  role="tab"
                  tabindex="-1"
                  aria-label="スライド 4"
                  aria-selected="false"
                  aria-controls="carousel-item-4">
            <svg width="34"
                 height="34"
                 version="1.1"
                 xmlns="http://www.w3.org/2000/svg">
              <circle class="border"
                      cx="16"
                      cy="15"
                      r="10"></circle>
              <circle class="tab-background"
                      cx="16"
                      cy="15"
                      r="8"></circle>
              <circle class="tab"
                      cx="16"
                      cy="15"
                      r="6"></circle>
            </svg>
          </button>
          <button id="carousel-tab-5"
                  type="button"
                  role="tab"
                  tabindex="-1"
                  aria-label="スライド 5"
                  aria-selected="false"
                  aria-controls="carousel-item-5">
            <svg width="34"
                 height="34"
                 version="1.1"
                 xmlns="http://www.w3.org/2000/svg">
              <circle class="border"
                      cx="16"
                      cy="15"
                      r="10"></circle>
              <circle class="tab-background"
                      cx="16"
                      cy="15"
                      r="8"></circle>
              <circle class="tab"
                      cx="16"
                      cy="15"
                      r="6"></circle>
            </svg>
          </button>
          <button id="carousel-tab-6"
                  type="button"
                  role="tab"
                  tabindex="-1"
                  aria-label="スライド 6"
                  aria-selected="false"
                  aria-controls="carousel-item-6">
            <svg width="34"
                 height="34"
                 version="1.1"
                 xmlns="http://www.w3.org/2000/svg">
              <circle class="border"
                      cx="16"
                      cy="15"
                      r="10"></circle>
              <circle class="tab-background"
                      cx="16"
                      cy="15"
                      r="8"></circle>
              <circle class="tab"
                      cx="16"
                      cy="15"
                      r="6"></circle>
            </svg>
          </button>
        </div>
      </div>
    </div>
    <div id="myCarousel-items"
         class="carousel-items playing"
         aria-live="off">
      <div class="carousel-item active"
           id="carousel-item-1"
           role="tabpanel"
           aria-roledescription="スライド"
           aria-label="6枚中の1">
        <div class="carousel-image">
          <a href="#" id="carousel-image-1">
            <img src="images/amsterdamslide__800x600.jpg" alt="アムステルダムでのウォーキングツアー">
          </a>
        </div>
        <div class="carousel-caption">
          <h3>
            <a href="#">
              ダイナミックヨーロッパ: アムステルダム、プラハ、ベルリン
            </a>
          </h3>
          <div class="hidden-xs hidden-sm">
            <p>
              <span class="contrast">
                3月3日火曜日、午後7時、テレビで
              </span>
            </p>
          </div>
        </div>
        <!-- .carousel-caption -->
      </div>
      <!-- .item -->
      <div class="carousel-item"
           id="carousel-item-2"
           role="tabpanel"
           aria-roledescription="スライド"
           aria-label="6枚中の2">
        <div class="carousel-image">
          <a href="#" id="carousel-image-2">
            <img src="images/lands-endslide__800x600.jpg" alt="コーンウォールのLand's End">
          </a>
        </div>
        <div class="carousel-caption">
          <h3>
            <a href="#">
              イングランド南西部とパリへの旅
            </a>
          </h3>
          <div>
            <p>
              <span class="contrast">
                9月14日から9月24日又は27日まで
              </span>
            </p>
          </div>
        </div>
        <!-- .carousel-caption -->
      </div>
      <!-- .item -->
      <div class="carousel-item"
           id="carousel-item-3"
           role="tabpanel"
           aria-roledescription="スライド"
           aria-label="6枚中の3">
        <div class="carousel-image">
          <a href="#!" id="carousel-image-3">
            <img src="images/trustslide-2__800x600.jpg" alt="母と娘がノートパソコンでダニエルタイガーゲームをプレイ">
          </a>
        </div>
        <div class="carousel-caption">
          <h3>
            <a href="#">
              公共テレビの素晴らしい子供向け番組
            </a>
          </h3>
          <div></div>
        </div>
        <!-- .carousel-caption -->
      </div>
      <!-- .item -->
      <div class="carousel-item"
           id="carousel-item-4"
           role="tabpanel"
           aria-roledescription="スライド"
           aria-label="6枚中の4">
        <div class="carousel-image">
          <a href="#" id="carousel-image-4">
            <img src="images/foyleswarslide__800x600.jpg" alt="スーツとフェドラ帽をかぶった男と、髪を整えた女がカメラを厳しく見つめている。">
          </a>
        </div>
        <div class="carousel-caption">
          <h3>
            <a href="#">
              Foyleの戦争再訪
            </a>
          </h3>
          <div>
            <p>
              <span class="contrast">
                3月8日日曜日、午後8時、テレビで: 最終シーズンの先行上映。
              </span>
            </p>
          </div>
        </div>
        <!-- .carousel-caption -->
      </div>
      <!-- .item -->
      <div class="carousel-item"
           id="carousel-item-5"
           role="tabpanel"
           aria-roledescription="スライド"
           aria-label="6枚中の5">
        <div class="carousel-image">
          <a href="#" id="carousel-image-5">
            <img src="images/britcomdavidslide__800x600.jpg" alt="WILL-TVのホスト、デビッド・シールとともに英国の旗。">
          </a>
        </div>
        <div class="carousel-caption">
          <h3>
            <a href="#">
              グレートブリテン投票: 土曜日午後7時
            </a>
          </h3>
          <div></div>
        </div>
        <!-- .carousel-caption -->
      </div>
      <!-- .item -->
      <div class="carousel-item"
           id="carousel-item-6"
           role="tabpanel"
           aria-roledescription="スライド"
           aria-label="6枚中の6">
        <div class="carousel-image">
          <a href="#" id="carousel-image-6">
            <img src="images/mag800-2__800x600.jpg" alt="セットでのMid-American Gardenerのパネリスト">
          </a>
        </div>
        <div class="carousel-caption">
          <h3>
            <a href="#">
              Mid-American Gardener: 木曜日午後7時
            </a>
          </h3>
          <div class="hidden-xs hidden-sm">
            <p>
              <span class="contrast">
                最新のエピソードを見る。
              </span>
            </p>
          </div>
        </div>
        <!-- .carousel-caption -->
      </div>
      <!-- .item -->
    </div>
  </div>
  <!-- carousel-inner -->
</section>
<!-- /.carousel -->
<div class="col-sm-1"></div>