日本語などの約物に含まれる空白(例えば、開き鍵括弧の左にある空白)などを文脈に応じて詰めるtext-spacing-trim
プロパティーがChrome 123やEdge 123で一部実装されている。特に指定せずにいたり、:root
要素などでtrim-first
などを指定すると、初期値の関係や継承によりpre
要素でも詰められる。そうすると(対応するOpenType機能であるhaltを所持している)等幅フォント(例えばNoto Sans Mono CJK JP)で描画される場合に文字位置がずれてしまう。
仕様で初期値のnormal
はChrome 123やEdge 123の実装でも採用されている。この値では、日本語の約物が続く場合(例えば」「や。「など、Text Module Level 4仕様のExample 41を参照)にどちらかの約物の持つ空白を詰めるよう指示する。この値は継承されるため、無指定でもpre
要素で詰められることから、文字が揃うかどうかはユーザーのフォント設定に依存する可能性が高い。なぜならば制作者CSSにおいてpre
要素のフォント指定で日本語の等幅フォントを指定することは少なく、この詰めが起こる日本語の約物はユーザーの設定したフォントやブラウザーの初期設定のフォントで描画されるからだ。
つまりpre
要素ではtext-spacing-trim: space-all
を必ず指定しておき、継承されないようにし、ずれないことを保証するべきではないかと考えられる。ルート要素などでtext-spacing-trim
プロパティーを使っていなくてもずれるかもしれないので、リセットやノーマライズの仕組みに組み込むのが妥当だと思う。副作用は無いと思われる。
pre
要素がこのプロパティーを継承してしまう仕様が悪いのか、等幅フォントなのに空白の詰めを司るOpenType機能を持っているフォントが悪いのか、微妙なところかもしれない。仕様側で要素によって既定値を変えて欲しいような気もするが、既に実装があるので面倒そうだ。制作者CSS側でほぼ確実に対処できるので、対処しておくに越したことはない。