この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2006年3月)

2006年3月10日

Bug 4449 word-spacingが に描画時のみ適用される
初回投稿日時: 2006年03月10日01時15分36秒
カテゴリ: CSS Mozilla Core
SNS: (list)

修正完了。このバグでディスカッションした結果、word-spacingは以下のように仕様変更となる。

  • 単語の区切り文字一文字ごとにword-spacing値分、空白の幅を追加する
  • 単語の区切り文字は、U+0020(半角スペース)、U+00A0(NBSP)、U+3000(全角スペース)の三文字

CSS3では前者の定義が覆されかけたが、結局この仕様に落ち着いている。前者の仕様の明確化により<length>値の基準となる文字の大きさは、word-spacing指定時のfont-sizeが参照されることになる。 例えば以下のような例を考えてみる。

<ol style="font-size: 20px; word-spacing: 0.1em;">
<li>word word</li>
<li style="font-size: 2em;">word word</li>
<li style="font-size: 2em; word-spacing: 0.1em;">word word</li>
</ol>

この場合、ol要素のword-spacingの算出値は2ピクセルとなるので、一つ目のリストアイテムの空白に追加される幅は2ピクセルとなる。また、二つめのリストアイテムの文字の大きさは倍の40ピクセルになっているが、word-spacingは計算結果を継承するので、このリストアイテム内で空白に追加される幅は2ピクセルのままである。最後のみword-spacingが再度指定されているのでその文字の大きさから計算され、20ピクセル × 2 × 0.1 = 4ピクセルとなる。

まあ、おそらくCSS2の仕様をきちんと理解していればここは明文化されただけなので違和感は何もないと思うが、整形済みテキストで出現する可能性のある空白文字の連続はCSS2でどう対処すれば良いのか定義されてなかったのでこの明文化には意味があることに注意して欲しい。

ただし、(今回修正するコードの問題ではなかったため)今回は踏み込まなかったが、次のような例は非現実的ではあるが問題が残っている。

word<span style="word-spacing: 1px;"> </span><span style="word-spacing: 2px;"> </span>word

この例でどちらの値を採用するかは今のところ実装依存である。(最も、この問題はword-spacingに限った話ではなく、background等でもどうなるのかという問題がある。)

その次は完全に新しい情報。まだCSS2.1の仕様書にも反映されていないが、概ね本決まりの模様。CSS2では単語の区切りとなる文字に関して明確な定義が行われていなかったが、上記の三文字と定義するということで話が落ち着いている。これ以外の空白(例えば、enスペースや、emスペース、ゼロ幅スペース等)はword-spacingの適用される語の区切り文字とはならない。

ただし、今回の修正では全角スペースには対応していない。これは仕様書に明文化されてから作業することになっているためで、現在は半角スペースと、NBSPのみが区切り文字として認識される。

次はletter-spacingについて作業しようかと考えている。これの仕様の曖昧さは実に酷い。

関連するかもしれないエントリ

bug 4449を含むエントリ