このウェブサイトはご利用の端末での閲覧に対応していません。
This website does not support your device.

“CSS Text Decoration Module”

記事Oct.27th, 2021
CSS3で下線や取り消し線などのテキスト装飾に関する仕様を定義した“CSS Text Decoration Module”について。

仕様書の概要

概要

CSS Text Decoration Module”はCSSにおけるテキストに引く線や影、圏点などのテキスト装飾について定義している仕様書です。

用語など

テキスト装飾

text-decoration”プロパティなどによってテキストに引かれる下線、上線、取り消し線や影、圏点はまとめて“テキスト装飾(Text Decoration)”と呼ばれます。このうち、下線、上線、取り消し線のみを指す場合は“ライン装飾(Line Decoration)”とも言います。

text-decoration”プロパティや他の“text-decoration-*”各プロパティがインライン・ボックスに指定されるか伝播するとそのボックスは装飾のためのボックスである“装飾ボックス(Decorating Box)”となります。装飾はこの装飾ボックスのすべての断片に適用されます。装飾はさらにそのインライン・ボックスを分割しているフロー内ブロック・レベルのボックスにも伝播します。

text-decoration”プロパティや他の“text-decoration-*”各プロパティがインライン整形コンテキストを生成するブロック・コンテナに指定されるか伝播すると装飾はブロック・コンテナのすべてのフロー内インライン・レベルの子を内包するインライン・レベルアノニマス・ボックスに伝播します。

text-decoration”プロパティや他の“text-decoration-*”各プロパティがルビ・コンテナに指定されるか伝播すると装飾はルビ・ベースだけに伝播します。

text-decoration”プロパティや他の“text-decoration-*”各プロパティが上記以外の種類のボックスでは装飾はボックスのすべてのフロー内の子に伝播します。

下線、上線、取り消し線は非置換要素であるインライン・ボックスにのみ引かれ、そのコンテンツであるすべてのテキストに引かれます。下線、上線、取り消し線はホワイトスペースや文字間、単語間の空白にも引かれますが、行の先頭もしくは最後のホワイトスペースや空白には引かれません。装飾ボックスのマージンボーダーパディングの部分は装飾の対象になりますが、装飾ボックスの子孫となるインライン・ボックスマージンボーダーパディングの部分は装飾の対象になります。

画像やインライン・ブロック(display: inline-block;)などのアトミック・インラインはテキスト装飾の対象にはなりません。

text-shadow”プロパティによる影やtext-emphasis”プロパティによる圏点はライン装飾とは異なり、継承によって子孫ボックスに適用されます。

装飾ボックスの子孫ボックスを相対位置指定(position: relative;)によって移動させると適用されたテキスト装飾は子孫ボックスとともに移動されますが、テキスト装飾の初期位置の計算には影響しません。visibility”プロパティtext-shadow”プロパティfilter”プロパティなどの視覚効果はこれらが適用されているテキストの一部としてテキスト装飾の見た目に影響します。これはテキスト装飾が祖先ボックスに適用されている場合も同様ですが、テキスト装飾の初期位置や太さ計算には影響しません。

ライン装飾の位置と太さ

ライン装飾は文字の大きさや揃え位置の異なる複数の要素に跨って引かれることがあるため、装飾ボックスが示す位置が装飾の理想的な位置であるとは限りません。そのため、ライン装飾の位置は行ごとにその行にある装飾ボックスによって装飾されるすべてのテキストである“考慮テキスト(Considered Text)”から計算されます。

その行にある装飾ボックスの子孫のうちtext-decoration-skip”プロパティによって装飾の対象にならないものやtext-decoration-skip: ink;であるもの、装飾ボックスインライン整形コンテキストに参加しないものは考慮テキストには含まれません。

ライン装飾の位置は以下のように計算されます。

上線(Over Lines)
線を考慮テキストの中で最もライン・オーバー側にあるEMボックスの縁に合わせます。
下線(Underlines)
アルファベット(Alphabetic)
考慮テキストの中の個々のテキストの塊の理想的なベースラインからのオフセットを取って平均化した後、最もライン・アンダー側にあるベースラインに平均化したオフセットを適用した位置が線の位置となります。
上付き文字や下付き文字がライン装飾を曲げるのを防ぐため、vertical-align”プロパティ計算値が初期値でないインライン・レベルのボックスの下線位置はその親における理想的な下線位置となります。
非アルファベット(Non-alphabetic)
線を考慮テキストの中で最もライン・アンダー側にあるEMボックスの縁に合わせます。
取り消し線(Line-throughs)
アルファベット用の下線の位置を算出する場合と同様のオフセットの平均化を行いますが、font-size”プロパティ計算値が異なる子孫に線を引く時にはこれを再計算します。
font-size”プロパティ計算値が同じ考慮テキストの場合にはフォントのメトリックを使用して平均化した理想的な位置を算出します。
上付き文字や下付き文字がライン装飾を曲げるのを防ぐため、vertical-align”プロパティ計算値が初期値でないインライン・レベルのボックスの下線位置はその親における理想的な下線位置となります。
最後に、それぞれの位置に線の一部が引かれます。

CSSではライン装飾の太さを決める方法は定義されていませんが、ユーザー・エージェントは文字の大きさと太さ、フォントなどを考慮したうえで適切で平均的な太さを算出することができます。

ライン装飾の具体的な位置と太さはtext-decoration-position”プロパティtext-decoration-offset”プロパティtext-decoration-thickness”プロパティによって指定される他はユーザー・エージェントによって決められますが、一つの装飾ボックスに由来するライン装飾はすべて同じ太さでそれぞれの行内で同じ位置に描画されなければなりません。

ユーザー・エージェントは装飾ボックス自身が値が“baseline”以外のvertical-align”プロパティによって移動された場合やfont-variant-position”プロパティによって上付き文字や下付き文字にされた場合にはライン装飾の位置を調整しなければなりませんが、装飾ボックスの子孫が移動されたり、上付き文字や下付き文字にされた場合にはライン装飾の位置を調整してはいけません。

圏点

日本語などのいくつかの東アジアの言語では文字の上か下に強調のための点を付加することがあり、この点を“圏点(Emphasis Mark)”と言います。

圏点

圏点はtext-emphasis”プロパティ、もしくはtext-emphasis-style”プロパティtext-emphasis-color”プロパティによって指定され、他にその位置を指定するtext-emphasis-position”プロパティがあります。

圏点を描画する際には要素のフォントの設定に加えて、使用されているフォントにルビ用の変化形(font-variant-east-asian: ruby;)があればこれを使用し、大きさを50%に縮小します。描画に使用されるフォントに適切なグリフが含まれていない場合にはユーザー・エージェントはそれ以外のより適切なフォントを使用したり、圏点を合成したりすることができます。

圏点はtext-emphasis-style”プロパティで指定された記号をルビと同じように描画することで付加され、テキストのtext-emphasis-position”プロパティで指定された側に文字の中央に揃えて配置されます。テキストにルビがある場合には圏点はルビの外側に配置されます。また、圏点がライン装飾と干渉する場合は位置が調整される場合があります。

圏点は垂直の表記モードでも常に直立した向きで配置され、垂直書字モード(縦書き)の場合でも回転しません。

圏点は各文字に対して1個だけ付加されます。ただし、圏点は以下の文字には付加されません。

  • ワード・セパレータやUnicodeの仕様の汎用カテゴリ“Z*(ZlやZp、Zs)”に含まれる文字
  • Unicodeの仕様の汎用カテゴリ“Cc(Control)”、“Cf(Format)”、“Cn(Unassigned)”に含まれる文字
  • Unicodeの仕様の汎用カテゴリ“P*(PcやPdなど)”に含まれる文字で、NFKC形式で以下の表の文字に正規化されないもの
ユニコード 文字 説明
U+0023 # 番号記号
U+0025 % パーセント記号
U+2030 パーミル記号
U+2031 パーミリアド記号
U+066A ٪ アラビア文字のパーセント記号
U+0609 ؉ アラビア文字のパーミル記号
U+060A ؊ アラビア文字のパーミリアド記号
U+0026 & アンパサンド
U+204A ティロニアン速記の“Et. (and)”
U+0040 @ 単価記号、アットマーク
U+00A7 § 節記号
U+00B6 段落記号
U+204B 反転段落記号
U+2053 スワング・ダッシュ
U+303D 庵点

テキスト装飾の描画

テキスト装飾は装飾が対象とするテキストの直下もしくは直上に描画されます。下(ユーザーから一番遠い側)からの描画順は以下の通りです。

  1. text-shadow”プロパティによる影
  2. text-decoration”プロパティなどによる下線
  3. text-decoration”プロパティなどによる上線
  4. テキスト
  5. text-emphasis”プロパティなどによる圏点
  6. text-decoration”プロパティなどによる取り消し線

テキスト装飾がボーダーなどのボックス装飾やアトミック・インラインを跨いで描画される場合には位置指定されていないコンテンツよりも上、位置指定された子孫の直下に描画されます。

ボックスからはみ出すテキスト装飾はインキ・オーバーフローとして扱われ、テキスト装飾によってインキ・オーバーフロー・エリアは拡張されません。

定義されているCSSルール

プロパティ

プロパティ 説明
text-decoration-line: テキストに引く線の種類を指定する
text-decoration-style: テキストに引く線の見た目を指定する
text-decoration-color: テキストに引く線の色を指定する
text-decoration-thickness: テキストに引く線の太さを指定する
text-decoration: テキストに引く線を指定する
text-underline-position:
text-underline-offset:
text-decoration-skip:
text-decoration-skip-self:
text-decoration-skip-box:
text-decoration-skip-inset:
text-decoration-skip-spaces:
text-decoration-skip-ink:
text-emphasis-style: 圏点の見た目を指定する
text-emphasis-color: 圏点の見た色を指定する
text-emphasis: 圏点を付加する
text-emphasis-position: 圏点の位置を指定する
text-emphasis-skip:
text-shadow: テキストの影を指定する
一番上へ
トップにもどる
シェアする
シェアする
Facebookでシェアする
ツイート
Google+でシェア
Pocket
はてなブックマーク