テキスト中央配置のアイコン付きボタンはinline-gridが最適

CSSでアイコン付きボタンを実装するとき、アイコンをabsolute
で配置したり、flexbox
で横並びにする方法はよく見かけます。
しかしこれらの方法では、画面幅が狭くなったときにテキストが想定より早く折り返されてしまうという問題が起こりがちです。
そこで注目したいのが、inline-grid
を使ったアプローチです。
今回は、このinline-grid
を活用して「テキストの中央位置がずれないアイコン付きボタン」の最適解を探っていきたいと思います。
アイコン付きボタンの完成系
See the Pen アイコン付きボタン(テキスト中央配置) by hisa (@hisaaashi) on CodePen.
ポイントは以下の指定です。
.button {
display: inline-grid;
grid-template-columns: 1fr auto 1fr;
}
inline-grid
を使い、grid-template-columns
でアイコン、テキスト、アイコンという3つの領域を確保しています。
- 左の
1fr
… テキストを中央に押し込むための余白 - 中央の
auto
… ボタンのテキスト本体 - 右の
1fr
… アイコン用のスペース
左の余白は、空の擬似要素を使っています。

画面幅が狭くなっても、空の擬似要素が先に縮むため、テキストはギリギリまで折り返されません。

気になる方は、右下のツマミで幅を可変させてみてください。
absoluteやFlexboxの欠点
absolute
やFlexbox
での実装は、狭い画面幅でテキストとアイコンが重ならないように左右に大きめの余白を持たせる必要があります。
そのため、アイコンが大きい場合や、テキストの量が多い場合だと、想定より早く折り返されてしまう欠点があります。

inline-grid
での実装では、この欠点がなくなり、可能な限りテキストは完全中央配置されます。
Q&A
- gridではなくinline-gridなのはなぜ?
-
インライン要素にすることで、
width: auto
でテキストに合わせて最適なボタンサイズにでき、横に並べることも容易になるからです。 - アイコンとの間にgapを使わないのはなぜ?
-
gapを使用すると左の擬似要素にも適用されるため、テキストの左に余分な空白ができてしまいます。gapが小さい場合は大きな問題ではありませんが、アイコンにmarginを持たせた方がベターです。
- アイコンをテキストのすぐ横に配置したい
-
アイコンの
justify-self: end
をjustify-self: start
にしてください。 - アイコンを左端にできますか?
-
HTMLのアイコンとテキストを逆に配置します。CSSの
::before
を::after
に変更して、アイコンをjustify-self: start
にしてください。 - アイコンは擬似要素で作成しても良いですか?
-
はい、問題ないです。
- Flexboxではダメですか?
-
どのパターンであっても柔軟性のことを考えると
inline-grid
を利用した方が良いと思います。
まとめ:GridLayoutを使おう
以前はFlexBoxばかり使っていましたが、GridLayoutを使うようになってレイアウトに困ることはほぼなくなりました。
慣れるまで少し難しく感じますが、基本を覚えておけば今後の実装の時短につながるかと思います。

カスタマイズに困ったらお気軽にご相談を!
- 「ちょっとしたCSSの調整だけお願いしたい」
- 「不具合を直してほしい」
料金は3,000円〜、お支払いはPayPay・Amazonギフトカードなど柔軟に対応してます🤔
お気軽にコメントどうぞ