複数行テキストをtext-align:center
にしたとき、「。」や「、」で右端が短く見え、行ごとにセンターがズレたように感じる――。本記事は、その原因と、現場で効果の高い対処法を“コピペ可”のコード付きでまとめた実用ガイドです。
なぜズレて見えるのか(原因)
プロポーショナル幅(可変幅)の日本語フォントでは、句読点(。や、)の占有幅が小さいため、行末が短く見えます。行の見かけの左右バランスが崩れ、複数行の中央が揃っていないように感じます。
これはテストです。
これはテストです
上の行の「。」分だけ右端が短く見える → つまり中央寄せがズレたように感じるという現象です。
実際には中央揃えでも、視覚中心がズレるため「不揃い」に見える、というのが本質です。
対処法カタログ(結論から):状況別おすすめ
① 見た目を最優先でサクッと整える
- ダミースペース(見えない1文字)を先頭に足す:
<span class="pad"> </span>
- または疑似要素
::before
でクラス1つ付与 - 行単位の
text-indent
で微調整
② レイアウト品質を設計から整える
text-align-last:center
×text-align:justify
- 日本語Webフォントの選定(例:Noto Sans JPなど)
- 等幅フォント(見出し以外やコード周りで)
- 最後の手段:SVG/画像化(見出しロゴ等限定)
メリット・デメリット一覧
方法 | メリット | デメリット / 注意 |
---|---|---|
ダミースペース(.pad ) |
フォント・ブラウザ差に強く、視覚中心を狙って補正可能。行単位で制御しやすい。 | HTML要素が増える。調整幅は手動。アクセシビリティに配慮(visibility:hidden は読み上げられないが要素は増える)。 |
::before 疑似要素 |
HTMLを汚さずに一括適用。クラス付与のみで運用が楽。 | 対象行の指定判断が必要。内容に“不可視文字”が入ることを設計で把握。 |
text-indent 微調整 |
CSSだけで素早く微調整可。 | 行ごとの差異には弱い。複数行すべてが同じズレとは限らない。 |
text-align-last:center |
複数行テキストの整いが良くなる。最後行だけ中央寄せ。 | justify 依存で文字間隔に差が出る可能性。ブラウザ差あり。 |
フォント選定 | 根本的な見栄え改善。デザイン維持。 | プロジェクトのブランド制約あり。端末フォント事情の影響を受ける。 |
等幅フォント | 確実に端が揃う。 | 本文には固く見える。見出しデザインに不向きなことが多い。 |
SVG/画像化 | 完全固定。デザイン通りに再現。 | SEO・可搬性の低下。更新コスト増。テキスト選択不可。 |
実装レシピ(コピペOK)
1) ダミースペース(推奨・手っ取り早い)
左端に「見えない1文字分」を追加して視覚中心を押し出す。1ch
単位を使うとフォントサイズ連動で扱いやすい。
<!-- HTML -->
<p class="center"><span class="pad"> </span>これはテストです。</p>
<!-- CSS -->
.center{ text-align:center; }
.pad{ display:inline-block; width:1ch; visibility:hidden; }
必要に応じて width:0.6ch ~ 1.2ch
で微調整。句読点の種類やフォントにより最適値が変わります。
2) 疑似要素でクリーンに(HTMLを汚さない)
<!-- HTML -->
<p class="center center-adjust">これはテストです。</p>
<!-- CSS -->
.center{ text-align:center; }
.center-adjust::before{
content:" "; /* 全角スペース */
display:inline-block;
width:1ch; /* 適宜 0.8ch などに */
visibility:hidden; /* 視覚的には空白だけを確保 */
}
3) 句読点だけに余白を足す(右端を伸ばす)
行末の句読点にマージンを付与して左右の見た目バランスを取る。
<!-- HTML -->
<p class="center">これはテストです<span class="dot">。</span></p>
<!-- CSS -->
.center{ text-align:center; }
.dot{ display:inline-block; margin-right:0.25em; } /* 0.15em ~ 0.35em で調整 */
4) text-indent
で行全体をオフセット
.center-indent{
text-align:center;
text-indent:0.2em; /* 右へ少し押す。0.1em ~ 0.3em で調整 */
}
5) text-align-last:center
で複数行の整い改善
.justify-last-center{
text-align:justify;
text-align-last:center;
}
6) フォント選定(Noto Sans JP など)
.noto{ font-family:"Noto Sans JP",sans-serif; }
.mono{ font-family:"Noto Sans Mono",monospace; } /* 必要に応じて */
7) 最終手段:SVG/画像化
ブランド見出しやKVのキャッチコピー等、ピクセル単位で固定したい箇所のみ推奨。本文は非推奨。
デモ用スニペット(まとめて試す)
<div class="demo noto">
<p class="center">(A)通常の中央揃え:これはテストです。</p>
<p class="center"><span class="pad"> </span>(B)ダミースペース:これはテストです。</p>
<p class="center center-adjust">(C)::before版:これはテストです。</p>
<p class="center">(D)句読点余白:これはテストです<span class="dot">。</span></p>
<p class="center-indent">(E)text-indent:これはテストです。</p>
<p class="justify-last-center">(F)justify+last:これはテストです。これはテストです。</p>
<p class="mono center">(G)等幅フォント:これはテストです。</p>
</div>
デモでは 1ch
を基準にしています。見栄えの最終調整は 0.8ch ~ 1.2chあたりを目安に。
アクセシビリティと保守性のポイント
- 不可視要素の管理:
visibility:hidden
は読み上げ対象外だが、要素は増える。重要文言には多用しない。 - コンテンツ依存の補正:1行目だけ句読点、2行目はなし…のように行ごとに最適値が異なることを設計で把握。
- レスポンシブ:フォントサイズ変化に合わせて
ch
orem
を採用し、メディアクエリで微調整を許容。 - 差分適用:
::before
方式は対象行にだけクラスを付け、スタイルの意図をコードコメントに残す。
現場ワークフロー:迷ったらこの順で
- まずはフォント選定(Noto Sans JP 等)でズレ感が軽減するか確認。
text-align-last:center
の採用可否を検討(本文の複数行で有効)。- 見出しや短文の目立つズレはダミースペース(
.pad
or::before
)。 - 微差なら
text-indent
で一括補正。 - ブランド表現が最重要ならSVG/画像化で完全固定(範囲限定)。
FAQ
Q. 全ページに一括で効かせたい。
「見出しレベル(h2
等)だけ」や「特定のセクションだけ」にスコープしたユーティリティクラスを作成しましょう。誤適用を避け、保守性を担保できます。
Q. 句読点直後の約物(!?」)でもズレる?
約物・括弧類もフォント設計で狭い場合があり、見た目のズレ要因になり得ます。行末側にマージンを与えるか、先頭ダミースペースで相殺するのが簡便です。
Q. 英文混在の時は?
ch
単位は欧文の「0」の幅基準であり、和文と混在すると体感が変わります。微調整の前提で使い、最終はデザインレビューで詰めましょう。
チートシート(貼って使えるユーティリティ)
/* 中央揃え */
.center{ text-align:center; }
/* 先頭ダミースペース(行単位に付与) */
.center-adjust::before{
content:" ";
display:inline-block;
width:1ch; /* 調整: 0.8ch ~ 1.2ch */
visibility:hidden;
}
/* 行末句読点に余白(必要な箇所だけ <span class="dot">。</span>) */
.dot{ display:inline-block; margin-right:0.25em; }
/* 複数行整え(本文向け) */
.justify-last-center{ text-align:justify; text-align-last:center; }
/* 微調整 */
.center-indent{ text-align:center; text-indent:0.2em; }
/* フォント */
.noto{ font-family:"Noto Sans JP",sans-serif; }
.mono{ font-family:"Noto Sans Mono",monospace; }
まとめ
- ズレの正体は句読点の“見かけ幅”。レイアウトは合っていても視覚中心がズレる。
- 最速はダミースペース(
.pad
や::before
)で先頭を押し出す。 - 本文は
text-align-last:center
やフォント選定で設計から整える。 - 微差は
text-indent
、行末の約物ならマージン追加。 - ブランド最優先の見出しはSVG/画像も検討(範囲限定・SEO配慮)。
最終的な見え方はフォント・環境依存です。0.8ch〜1.2chの範囲で決め打ちし、デザインレビューでOKを取りにいくのが実務の最短ルート。
※参考にされる場合は自己責任でお願いします。