表のキャプションは <caption>
か <figcaption>
か
HTML においてまとまりを持った自己完結の図版や文章にキャプションを付ける場合、 <figure>
要素の子要素として <figcaption>
要素を使うことで表現できます。それとは別に表の場合は専用の <caption>
要素が HTML 3.2 やそれ以前から存在します。
両者は似た面も多いものの歴史的経緯もあり、使い方が異なります。
表のキャプションはどちらを使えばよいのか
どちらも使えます。ただし、表を <figure>
要素内に置く場合は以下の注意点があります。
すなわち、次のようなマークアップをしてはいけません[2]。
<figure>
<table>
<caption>表キャプション</caption>
<tbody>
...
</tbody>
</table>
</figure>
これは私見になりますが、表のキャプション用途として登場した <caption>
要素は、後発の <figcaption>
要素と比べて歴史的な経緯から使い方に差異はあるものの役割は被っており、仕様上廃止扱いにはなっていないが、マークアップする側の視点としては <figcaption>
要素に統合した方がすっきりするのではないかという感があります。すなわちプロジェクトルールとして <caption>
要素の使用を禁止できないかと考える次第です。そこで表のキャプションを <figcaption>
要素に置き換えた場合、アクセシビリティ面やブラウザ表示における問題がないか考えてみます。
適用ロールとアクセシブルネーム
<caption>
要素、 <figcaption>
要素ともに、現時点では暗黙の ARIA セマンティクスは割り当てられていませんが、 WAI-ARIA 1.2 では caption
ロールが新設され、両要素ともこれが割り当てられる事になります。
また、 HTML Accessibility API Mappings 1.0 ではいくつかの要素についてアクセシブルネームの計算方法が規定されていますが、 <figure>
要素と <table>
要素を比較すると、要素名以外の違いはない事が分かります。
キャプション内のキーボードフォーカス
<caption>
要素におけるキャプションを表の下側に表示する場合は CSS の caption-side
プロパティを使います。 <caption>
要素を <table>
要素の末尾に配置する事はできません。これはいくつかのメリット、デメリットがあります。
まずメリットとしては、状況によって表示を変えることが可能という点が挙げられます。例えば高さ方向が広い画面ではキャプションは下側、モバイル端末など小さな画面や印刷時には上側にするといった切り替えができます。
一方で、キャプションの中にアンカーリンクやボタンなどのフォーカス可能要素がある場合に caption-side: bottom
を指定すると、見た目上の表示位置と実際のフォーカス順序に差異が生じてしまうため、とくに晴眼者がキーボード操作を行うケースにおいて望ましくない挙動となります。
また、 Firefox では <caption>
要素内のフォーカス可能要素に Tab キーで到達できないバグ(bugzilla.mozilla.org
)が大昔からあるようで、長い間対応されていません。リンクやボタンがキーボードのみで操作できない状況はかなり致命的なので「特定のブラウザのバグだから」と無下にする判断もしにくいでしょう。ちなみにこれは <caption>
要素に限らず display: table-caption
が適用された場合全般で起こるバグのようです。
CSS によるキャプションと表の幅揃え
表キャプションをセンタリングしたい場合、 caption { text-align: center }
は意図どおりになりますが、 figcaption { text-align: center }
は親要素(<figure>
要素)の幅に対してセンタリングされてしまうので、全幅でない表の場合は表とキャプションの中心位置がずれてしまう結果となります。
またセンタリングでなくともキャプションの文言が表の横幅より長い場合、キャプションの幅は表の幅に合わせたいところでしょう。
これを解決する方法として、
figure {
display: table;
}
figcaption {
display: table-caption;
}
のように <figure>
要素をテーブルの見た目にするテクニックが昔から知られています。この手法は W3C の Web Style Sheets でも紹介されているくらいなので、それなりの知名度と信頼性があるように思われていますが、前述のとおりキーボードフォーカスの問題があるので好ましいものではありません。
現在では <figure>
要素に min-content
, max-content
, and fit-content()
を設定することで意図どおりの見た目を再現できる事が多いため、表ではない要素に表関連の display
プロパティを設定するのは極力避けた方がよいでしょう。
以上、いくつかの視点から <caption>
要素と <figcaption>
要素を比較してみましたが、支援技術(ロール、アクセシブルネーム)や見た目(CSS)に対しては多くのケースでは大差なしと判断できます。
一方でキーボードフォーカスや Firefox の長期に渡るバグなども含めて総合的に考えると、とくにキャプションにフォーカス可能要素が含まれる場合、 <caption>
要素の使用はユーザーのデメリットになってしまうことが考えられるため、表であっても <figure>
要素と <figcaption>
要素を使うことも一考に値するかと思います。