Movatterモバイル変換


[0]ホーム

URL:


LoginSignup
45

Go to list of users who liked

11

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Noto Sans JPで上下中央揃えにするやつ

Last updated atPosted at 2025-12-14

結論

@font-face{font-family:'Noto Sans JP';src:local('Noto Sans JP');ascent-override:100%;descent-override:22%;}

勘で調整した値です。利用は自己責任でお願いします。


皆さんこんにちは。これは株式会社カオナビ Advent Calendar 2025の15日目(シリーズ3)の記事です。

Noto Sans JPの上下中央揃えの問題については、ご存知の方も多いのではないかと思います。以下のような既存記事も参考になります。

筆者も業務でこの問題に取り組む機会があり、既存記事に見当たらない解決法(冒頭のもの)をとったのでご紹介します。

問題の概要

Noto Sans JPでは、上下に非均等な余白があります。筆者はフロントエンドエンジニアなのでCSSの言葉で説明するのですが、例えば次のようなスタイルにしてみましょう。

body{font-family:"Noto Sans JP";font-size:14px;line-height:22px;font-weight:bold;}span{display:inline-block;background-color:#eee;}

この状態で、<span>テキスト</span>とするとこのような表示になります。

灰色のボックスが表示され、その中に黒い文字で「テキスト」と表示されている様子。フォントはもちろんNoto Sans JP

見やすさのために拡大していますが、灰色の領域の縦の大きさが22pxとなっています。

そして、画像をよく見ると、灰色のボックスの中で、文字が上下中央ではなく若干下に寄っているように見えます。

次の画像では、ずれが分かりやすいように背景を市松模様にしました。各正方形が1px四方です。

背景の市松模様によって、文字の上の余白と下の余白がわかりやすくなっている

この画像によると、グリフの上端・下端から見ると、上方向の余白が約6px、下方向の余白が約4pxあるように見えます。

このように、確保された行の高さに対して中央に描画されません。CSSのボックスとしてはこの画像の背景付きの範囲がボックスとして扱われることになるため、単純にボックスを上下中央揃えにしても、テキストが中央揃えにはなりません。これがNoto Sans JPの上下中央揃え問題です。

@font-face を用いる解決策

CSSの@font-faceを使うことで、Webフォント、あるいはローカルのフォント(ユーザーの端末にインストールされたフォント)に対してパラメータを上書きしつつ使用することができます。

冒頭でお見せした解決策では、ascent-overridedescent-overrideを用いてフォントのパラメータを上書きしています。ざっくり言えば、これらのパラメータを上書きすることで上方向と下方向の余白を調整できます。@font-faceルールの内容を再掲します。

@font-face{font-family:'Noto Sans JP';src:local('Noto Sans JP');ascent-override:100%;descent-override:22%;}

このように調整すると、画面表示はこうなります。

上記のルール適用後の表示(説明は後述)

この画像からは、同じ高さ22pxのボックスの中で、上下の余白が約5pxずつになっていることが見て取れます。

冒頭にある通り、ascent-overridedescent-overrideの数値は筆者が実際の表示を見ながら数値を調整して得たものです。筆者はフォントにあまり詳しくないので何となくで調整しています。

しかし、筆者がいろいろなfont-sizeやline-heightで試してみたところ、どの場合もボックスの中央を維持できています。

これであれば、テキストを表示する側でのmarginやpaddingといった調整は不要で、@font-faceの指定をグローバルに追加するだけで全ての箇所を調整できるのが魅力的ですね。line-heightで確保された縦の長さのちょうど真ん中あたりにテキストが描画されるようになり、解決策としてはとてもシンプルです。

注意点

いくつか注意点があります。

明示的にNoto Sans JPを指定する必要がある

この方法ではfont-familyに明示的にNoto Sans JPを指定する必要があります。

現在、Windowsには最初からNoto Sans JPがインストールされているため、sans-serifで自動的にNoto Sans JPが適用されることがあります。

しかし、この記事のやり方を用いる場合にはfont-familyにNoto Sans JPを明記する必要がある点はご注意ください。理由は、@font-faceNoto Sans JPというフォントを再定義しているからです。

本来の使い方と違うかも?

ascent-overrideといった機能の本来の使い方は、Webフォントなどを使っている場合に複数フォント間でパラメータを合わせることにありそうです。

そのため、この記事のように、特定のフォントのメトリクスだけを調整する目的で使うのは本来の使い方とは違うかもしれません。

Safariのサポートがない

今回使用したascent-overridedescent-overrideは、記事執筆時点ではSafariにサポートされていません。

ただ、Safari + Noto Sans JPという組み合わせがかなりレアなことから、我々はこの組み合わせには対応しなくても問題ないと考えています(もし発生したとしても、最悪従来のように縦にズレるだけですし)。

まとめ

今回は、@font-faceだけでNoto Sans JPの上下中央揃え問題に立ち向かう方法を紹介しました。

このテクニックはまだプロダクトに実践投入しておらず、もう少し検証する予定です。

しかしながら、この手法はパッと調べても出てこなかったので、皆さんの役に立ちそうだということでご紹介します。

ぜひ試してみてください。もしくは、筆者が気づいていない問題点に気づいた方はぜひ教えていただければと思います。

45

Go to list of users who liked

11
0

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45

Go to list of users who liked

11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?


[8]ページ先頭

©2009-2025 Movatter.jp