川釣りのイラスト

CSS の `reading-flow` プロパティで要素の読み上げ順を制御する

Flex や Grid コンテナ内では要素の見た目上の順序と DOM 上の順序が異なることがあります。このような状態はキーボード操作やスクリーンリーダーなどの支援技術を使うユーザーにとって混乱を招く可能性があります。CSS の `reading-flow` プロパティ個の問題を解決するためのプロパティです。見た目上の順序に従って読み上げ順を制御することができます。

Note

reading-flow プロパティは 2024 年 8 月現在 Editor Draft として提案されている機能です。W3C によって標準化されておらず、将来仕様が変更される可能性があります。Chrome Dev または Canary バージョン 128 以降で試すことができます。

Flex や Grid などの CSS レイアウトを使っている場合や、ドラッグアンドドロップで自由に要素を配置できる UI を実装している場合、要素の見た目上の並び順と、DOM 上の並び順が異なることがあります。このような状態はキーボード操作やスクリーンリーダーなどの支援技術を使うユーザーにとって混乱を招く可能性があります。見た目とは異なる順番で要素にフォーカスがされるためです。

例えば、Flex コンテナ内の要素は flex-direction: column-reverse; を指定すると要素の順番を逆順にして表示できます。下記の例では、item 1item 2item 3 の順で DOM に配置されていますが、実際の見た目では item 3item 2item 1 の順で表示されます。

<div class="container">
  <div class="item">
    <button>Item 1</button>
  </div>
  <div class="item">
    <button>Item 2</button>
  </div>
  <div class="item">
    <button>Item 3</button>
  </div>
</div>
 
<style>
  .container {
    display: flex;
    flex-direction: column-reverse;
  }
  .item {
    width: 100px;
    height: 100px;
    border: 1px solid black;
  }
</style>

実際に Tab キーを押してフォーカスを移動させると、item 1 から item 2item 3 と下から上の順でフォーカスが移動することが確認できます。

このようなアクセシビリティ上の問題が存在するため、row-reversecolumn-reverseorder といった要素の表示順を制御するプロパティの使用は避けられていました。この問題を解決する手段として、reading-flow プロパティが提案されています。

reading-flow プロパティで読み上げ順を制御する

reading-flow プロパティは Flex または Grid コンテナ内の要素の読み上げ順もしくはキーボードフォーカスの順序を制御するためのプロパティです。reading-flow プロパティには以下の値が設定できます。

  • auto:DOM の順序に従う(デフォルト)
  • flex-visual:Flex コンテナのみで使用可能。writing-mode に従い、見た目上の順序に従う。例えば英語の場合は左から右に、アラビア語の場合は右から左に読む順序になる。
  • flex-flow:Flex コンテナのみで使用可能。flex-flow プロパティの指定に従う
  • grid-rows:Grid コンテナのみで使用可能。writing-mode に従い、列の見た目上の順序に従う
  • grid-columns:Grid コンテナのみで使用可能。writing-mode に従い、行の見た目上の順序に従う
  • grid-order:Grid コンテナのみで使用可能。order プロパティにより変更された順序に従う

記事の冒頭で紹介した Flex コンテナ内の要素の読み上げ順を制御する場合、reading-flow: flex-visual; を指定することで見た目上の順序に従って読み上げ順を制御できます。

.container {
  display: flex;
  flex-direction: column-reverse;
+ reading-flow: flex-visual;
}

item 1item 2item 3 の順でキーボードフォーカスが移動することが確認できます。

Grid コンテナではより複雑な並び順のレイアウトが可能ですが、同様に reading-flow: grid-row プロパティを使用して読み上げ順を制御できます。

まとめ

  • Flex や Grid コンテナ内の要素の見た目上の順序と DOM 上の順序が異なる場合、アクセシビリティ上の問題が発生する可能性がある
  • reading-flow プロパティは Flex または Grid コンテナ内の要素の読み上げ順もしくはキーボードフォーカスの順序を制御するためのプロパティ
  • reading-flow: flex-visual; は Flex コンテナ内の要素の見た目上の順序に従って読み上げ順を制御する
  • reading-flow: grid-row; は Grid コンテナ内の要素の列の見た目上の順序に従って読み上げ順を制御する

参考

記事の理解度チェック

以下の問題に答えて、記事の理解を深めましょう。

Flex コンテナ内の要素の読み上げ順を制御するためのプロパティはどれか?

  • reading-flow: auto;

    もう一度考えてみましょう

    auto は DOM の順序に従うプロパティで、デフォルトの値です。

  • reading-flow: flex-visual;

    正解!

  • reading-flow: grid-order;

    もう一度考えてみましょう

    grid-order は Grid コンテナ内の要素の読み上げ順を制御するプロパティです。

  • reading-flow: visual;

    もう一度考えてみましょう

    visual という値は存在しません。


Contributors

> GitHub で修正を提案する
この記事をシェアする
はてなブックマークに追加

関連記事