😊
[CSS組版]見出しに画像を使いつつヘッダ・フッタには画像のaltを使う例
CSS組版アドベントカレンダー2024の16日目の記事です。
明日はメイユールさんです。
string()
は画像を引っ張れない
ごくベーシックなヘッダの置き方を見てみましょう。
ヘッダに名前付き文字列headingを置く指定
@page { size: JIS-B5;
@top-center {
...
content: string(heading);
}
}
main> section> h2 {
string-set: heading content(); /**/
}
基本的に問題はないのですが、もしh2
の中に画像を貼り込まれたら?
<main>
<section>
<h2><img class="label" src="label.jpg" alt="あいこん" width="200"></h2>
<p>↑h2だよ</p>
</section>
</main>
はい。h2で書いたstring-set: heading content()
はヘッダ中央で無を映しています。
対策
「じゃあcontent()
じゃなくてaltを引っ張ればいいじゃん」ということになります。方針としてはその通りですが、ちょっとCSSの機能的制約にひっかかります。h2
を指すセレクタの中では、その子要素img
のalt
を持ってこれないのです。
attr()
は実はinheritする値なら持ってこれるようなのですが、XSLTのようなことはできません。
ではどうするかですが、名前付き文字列はCSS変数とは異なり、構造上の、階層位置ではなく登場位置で優先が決まります。つまりh2>img
の方で指定しても問題無く機能します。(ただし初期値から調整は要る)
@page { size: JIS-B5;
@top-center {
...
content: string(heading, last);/*first(初期値)だとh2への指定が優先されてしまう*/
}
}
main> section> h2 {
string-set: heading content(); /**/
}
main > section > h2 >img.label {
string-set: heading attr(alt); /*h2より構造上後ろに登場する*/
}
対策の制約
-
string()
でlast
を指定しているため、同ページ内で更に別の見出しを使うとそっちに内容が持っていかれる - 画像とテキストの混在には対応できない
この辺までいくと、素直にsection
かh2
にtitle
やdata-*
で入れたい内容を入れてそっちをstring-set
に指定する方が簡単でしょう。
Discussion