figcaptionを中央に配置し最大幅を兄弟要素に揃える方法

figure要素とfigcaption要素をいい感じに表示させるために、先人たちは苦労してきました。

WordPress の場合、キャプション付き画像 (wp-caption) では、figure要素のstyle属性にwidthプロパティを設定しています。画像ブロック (wp-block-image) では、figure要素をtable要素として、figcaption要素をcaption要素として扱うという、裏技的なテクニックを使用しています。

今回は、figcaption要素を中央に配置して、その最大幅を兄弟要素に揃える、正攻法で汎用的な方法を紹介します。

1. figure要素の幅を内包要素に合わせる

figcaption要素の最大幅を兄弟要素に揃えるには、それらの親要素であるfigure要素の幅を、その兄弟要素 (内包要素) に合わせる必要があります。

WordPress のキャプション付き画像 (wp-caption) では、figure要素のstyle属性に画像と同じ幅になるようwidthプロパティを追加していますが、今は内包要素の寸法に合わせる fit-content という便利な値があります。

…
<style>
figure {
  inline-size: fit-content;
    max-inline-size: 100%;
  margin-inline: auto;
}
</style>
…
<figure>
  <img … />
  <figcaption> … </figcaption>
</figure>
…

内包要素が大きいと、figure要素が親要素から突き抜けてしまうことがあるので、max-inline-size: 100%; も設定します。

逆に内包要素が小さいと、figure要素の右側 (書字方向によっては左側) に大きな余白ができるので、margin-inline: auto; で中央に配置します。

2. figcaption要素の幅を兄弟要素に揃える

figcaption要素もfigure要素の内包要素なので、figcaption要素内の文章量が多いと、figure要素の幅を押し広げ、兄弟要素以上の幅になってしまう場合があります。

WordPress の画像ブロック (wp-block-image) では、caption要素の幅がtable要素の幅以上にならないという特徴を利用するために、figure要素に display: table; を、figcaption要素に display: table-caption; を設定しています。いい感じに表示されますが、他の不具合を誘発する可能性のある、良くないテクニックです。

実は安全な方法でfigcaption要素の幅をfigure要素の幅以下に抑えることができます。

…
<style>
…
figcaption {
  inline-size: 0;
  min-inline-size: fit-content;
  margin-inline: auto;
}
</style>
…
<figure>
  <img … />
  <figcaption> … </figcaption>
</figure>
…

それが、今回のキモとなる inline-size: 0; です。これだけだと本当に幅が 0px になってしまうので、min-inline-size: fit-content; も併せて設定します。

inline-sizeプロパティ、min-inline-sizeプロパティ、max-inline-sizeプロパティが同時に設定されていた場合、inline-sizeプロパティよりもmax-inline-sizeプロパティが、max-inline-sizeプロパティよりもmin-inline-sizeプロパティが優先されます。これは、block-sizeプロパティ、widthプロパティ、heightプロパティでも同様です。

この仕様により、min-inline-size: fit-content; が優先されます。そして、兄弟要素の幅以上にもなりません。

文章量が少ない時は margin-inline: auto; によって中央に配置されます。text-alignプロパティを使用していないので、複数行になった場合は左揃え (書字方向によっては右揃え) になります。

まとめ

CSSコードをまとめると、次のようになります。コピペして使ってみてください。

figure {
  inline-size: fit-content;
  max-inline-size: 100%;
  margin-inline: auto;
}
figcaption {
  inline-size: 0;
  min-inline-size: fit-content;
  margin-inline: auto;
}

CodePen

See the Pen Align caption to sibling element by nov (@numerofive) on CodePen.

外は春の嵐。

関連記事