📔
CSSでテキストが1行に収まるときだけ中央寄せする
ときどき1行に満たないテキストは中央寄せしたいが、1行以上になる場合は左寄せしたいことがある。これはCSSだけで簡単に実現できる。
こんなHTMLを用意してみる。短いテキストと長いテキスト、どちらも同じHTML構造になっている。
HTML
<p class="text">短い</p>
<p class="text">この文章はとにかく長いです。とても長いです。長すぎて大変です。長いです。長いんです。</p>
モダンな書き方
書き方は何パターンもあるが、例えばpモダンなCSSを使えば以下の2行で実現できる [1]。
.text {
margin-inline: auto;
max-inline-size: max-content;
}
max-inline-size: max-content
により「要素の最大サイズ = コンテンツのサイズ」となる。margin-inline: auto
はmargin-left: auto; margin-right: auto;
と同じような役割をしており[2]、要素を中央寄せするために指定する。
どちらのCSSプロパティもすでに主要ブラウザで問題なく使用できる。
別の書き方
古くからあるCSSプロパティを使って書くこともできる [3]。
CSS
.text {
display: table;
margin-left: auto;
margin-right: auto;
text-align: left; /* 親要素に text-align: center が効いている場合はこちらも */
}
仕組み
-
display: table
が指定された要素は、子(テキスト)に応じた幅になる。テキストが短ければ、要素幅も短い。 -
table
の要素に対してはmargin-left
とmargin-right
にauto
を指定してやれば、左右中央寄せになる。この部分はmargin-inline: auto
と書いてもOK -
text-align: left
になっていれば、テキストが折り返した場合には左寄せになる
-
@wild_onionさん、コメントありがとうございました。 ↩︎
-
一般的な左から右、上から下への書字方向の中で使った場合 ↩︎
Discussion
最初どんな仕組みなんだろう!?と思ったけど解説読んでみたら当たり前体操でした…
それでも過去にやりたかったときにパッと思いつかなかった気がするので、脳に刻み込んでおきたい
これ当たり前体操すぎて、僕も気づいたときにこれまでJSで頑張っていた労力を激しく後悔しました。
話がそれるのですが、実はZennではaxios-case-converter使ってます。これまで1度も問題が発生したことがなく超快適です。ありがとうございます🙏
めっちゃ亀ですけど
で余計なDOM(例だと.container)を減らして実現できたりします…
おー、素晴らしい。書き直しました。ありがとうございます。
2年前の記事ですが今だとこれでいけそうですね
コメントありがとうございます。加筆修正しておきました。
なお
inline-size
だと以下のようにボックスからはみ出してしまうことがあったので代わりにmax-inline-size
を使う形にしました。