CSSで文字の上に傍点(圏点)を付ける方法

​​CSS​HTML,日本語組版

強調したい文字の上に傍点(圏点)を付けるには、CSS の text-emphasis プロパティを使います。記号はブラウザーが文字ごとに描くので、HTML に記号を書き足す必要はありません。日本語の傍点らしい「﹅」の形にするなら、text-emphasis: sesame と形を書きます。

補足

検証環境は Ubuntu 24.04、Node.js 22.23.4、Playwright 1.63.0、Chromium 153 です。フォントは Noto Sans CJK JP を入れました。傍点の色だけを赤にして画面を撮り、赤い画素がどの文字の上下にあるかを数えて、付き方を確かめました。Firefox と Safari での表示は試していません。各ブラウザーの対応バージョンは、互換性データ(@mdn/browser-compat-data 8.1.8)の値です。

em 要素に text-emphasis を付ける

強調の意味を持つ <em> に付けると、HTML はそのままで傍点になります。

html
<p>これは<em>大事</em>な話です。</p>
css
em {
  font-style: normal;
  text-emphasis: sesame;
}

検証環境の Chromium では、<em> の font-style は何も書かないと italic でした。斜体にならないように、font-style: normal も書いておきます。

画面に傍点が出ても、文字列は変わりません。上の HTML の段落を選択して取り出した文字列(getSelection().toString())は「これは大事な話です。」で、傍点の記号は入っていませんでした。

MDN の text-emphasis のページにあるとおり、text-emphasis は形の text-emphasis-style と色の text-emphasis-color をまとめて書くプロパティで、子の要素に引き継がれます。検証環境でも、親の段落に付けると中の <span> にも傍点が付き、<span> に text-emphasis: none を書くと、そこだけ消えました。

形を書かないと、横書きでは小さな点になる

形は、記号の名前と、塗りつぶし(filled)か中抜き(open)かを組み合わせて選びます。filled か open かは省けて、省くと filled になります。

8種類の指定を縦に並べた画面。左に指定の値、右に「傍点を付ける」の文字列がある。filled sesame は「﹅」、open sesame は中抜きのゴマ、filled dot は小さな黒い点、filled circle は大きな黒丸、open circle は白丸、filled double-circle は二重丸、filled triangle は黒い三角、"✓" はチェックマークが、各文字の上に1つずつ付いている
text-emphasis に書いた値と、検証環境の Chromium での表示。文字の大きさは 34px

検証環境で、32px の文字に付けた記号の大きさを測ると、次のようになりました。

形の指定 記号 記号の幅
sesame ﹅ 10px
dot • 4px
circle ● 14px
double-circle ◉ 14px
triangle ▲ 14px
filled(形を省く) • 4px

注意したいのは、形を省いて filled だけを書いたときです。CSS の仕様と MDN では、横書きなら circle(●)、縦書きなら sesame(﹅)になると書かれています。検証環境の Chromium 153 では、横書きのとき計算値が dot になり、幅 4px の小さな点が付きました。縦書きでは sesame でした。どのブラウザーでも同じ形にしたいときは、形の名前まで書いておくと確実です。

記号は好きな文字にもできます。text-emphasis: "✓" のように、引用符で囲んだ1文字を書きます。MDN の text-emphasis-style のページには、2文字以上を書かないように、と書かれています。検証環境で "foo" と書くと、描かれた記号は "f" と同じ大きさで、「f」だけが付きました。

色は、text-emphasis: sesame #d85878; のように形の後ろに書くか、text-emphasis-color で指定します。書かなければ、文字と同じ色です。

句読点やかっこ、空白には付かない

文の一部をまとめて囲んでも、句読点やかっこには傍点が付きません。

2行の文字列の上に、ピンクの傍点が付いた画面。1行目「傍点、「CSS」と 123。!?」では、「傍」「点」「C」「S」「S」「と」「1」「2」「3」に傍点があり、「、」「「」「」」「。」「!」「?」と空白にはない。2行目「#%&@・ー〜」では、「#」「%」「&」「@」「ー」に傍点があり、「・」と「〜」にはない
文全体に text-emphasis: filled sesame を付けたところ。ピンクの記号が傍点

検証環境では、次のように分かれました。

  • 付いた文字:漢字とかな、英字、数字、長音の「ー」、「#」「%」「&」「@」
  • 付かなかった文字:「、」「。」「「」「」」「!」「?」「・」「〜」と半角の空白

CSS の仕様では、空白などの区切りの文字と、Unicode で句読点に分類される文字には、圏点を描かないと決められています。「#」「%」「&」「@」などは句読点に分類されますが、例外として描く文字の一覧に入っています。検証環境の結果は、この決まりのとおりでした。

行の間隔が狭いと、その行だけ広がる

MDN の text-emphasis-position のページにあるとおり、場所が足りないときは、ルビと同じように行の高さが広がります。

検証環境で、16px の文字で4行になる段落の3行目に傍点を付け、line-height ごとに、傍点を付けた文字の上端の位置(ページの上端から)を比べました。

line-height 傍点なし 傍点あり 差
1 52px 60px 8px 下がる
1.5 72px 73px 1px 下がる
1.8 84px 84px 変わらない
2 92px 92px 変わらない

line-height: 1 では、傍点のある行だけ前の行との間が 8px 空き、行の間隔がそろわなくなりました。本文の line-height が 1.8 程度あれば、この大きさの文字では行の位置は変わりませんでした。見出しのように行の間隔を詰めている所に付けるときは、表示を確かめておくと安心です。

下に付ける、縦書きで左に付ける

傍点の位置は text-emphasis-position で変えます。text-emphasis では変わらないので、別に書きます。

css
em {
  text-emphasis: sesame;
  text-emphasis-position: under;
}

検証環境では、何も書かないと横書きでは文字の上、under にすると文字の下に付きました。縦書き(writing-mode: vertical-rl)では、何も書かないと文字の右に付き、over left にすると左に付きました。

MDN のページでは、初期値は auto と書かれていますが、互換性データでは Chrome、Edge、Safari は auto に対応していません。検証環境の Chromium でも CSS.supports('text-emphasis-position', 'auto') は false で、auto と書いた指定は無視されました。CSS Text Decoration Level 3 の仕様では、初期値は over right(横書きで上、縦書きで右)です。MDN のページにも、日本語ではこの位置が望ましいと書かれています。ほかの場所で変えた位置をこの位置に戻したいときは、auto ではなく over right と書きます。

左は縦書きの「傍点は右に」で、各文字の右側に傍点が付いている。右は横書きの「傍点を付ける」で、「傍」「点」には「ぼう」「てん」のルビがあり、その2文字の傍点はルビのさらに上に付いている。ルビのない「を付ける」の傍点は、文字のすぐ上にある
左は縦書きにしたもの、右はルビのある文字にも傍点を付けたもの

ルビのある文字に傍点を付けると、傍点はルビのさらに上に付きました。上の画像の右側のように、ルビのある文字とない文字で、傍点の高さがずれます。CSS の仕様にも、ルビと同じ側に付くときは、ルビの外側に置くと書かれています。仕様には、ルビと重なる文字では傍点を消したいときの書き方の例として、ruby { text-emphasis: none; } でルビのある文字の傍点を消す方法も載っています。

ルビの文字(「ぼう」)そのものには、傍点は付きませんでした。検証環境の Chromium では、親の段落に text-emphasis を書いても、<rt> の text-emphasis-style の計算値は none のままでした。

対応しているブラウザー

互換性データでは、接頭辞なしの text-emphasis に対応しているのは、Chrome 99、Edge 99、Firefox 46、Safari 7(iOS 版も 7)からです。Chrome 25〜98 と Edge 79〜98 は -webkit-text-emphasis だけに対応しています。検証環境の Chromium 153 では、-webkit-text-emphasis だけを書いても傍点が付きました。古い Chrome も対象にするなら、MDN の例のように両方を書いておきます。

css
em {
  font-style: normal;
  -webkit-text-emphasis: sesame;
  text-emphasis: sesame;
}

​Posted by 86