CSSのwidth: 100%;のより良い代替手段として、stretchキーワードが実はかなり便利です
Post on:2024年11月21日
幅いっぱいの要素から左右のマージンを引きたいときに、こういうCSSを使用すると思います。width: calc(100% - 48px);
便利なCSSですが、マージンを計算する必要があり、デザインの変更があった際はCSSも変更する必要もあります。
そこでstretch
キーワードを使用すると、便利です。要素はオーバーフローせずに使用可能なスペースいっぱいに表示され、マージンの計算も必要なくなります。
The stretch keyword: a better alternative to width: 100% in CSS?
by Ollie Williams
下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。
はじめに
div
やp
など、HTMLのブロック要素はデフォルトで利用可能な幅いっぱいを占めるように伸びます。水平方向にmargin
を与えると、水平方向のスクロールバーは発生しません。これは非常に便利なデフォルトの挙動です。
しかし、他の多くの要素はデフォルトで全幅ではありません。幅いっぱいにするには、CSSのwidth: 100%;
を使用します。新しい代替案を見る前に、width: 100%;
が便利な例をいくつか見てましょう。
width: 100%;が便利な例
画像のデフォルトのサイズは、埋め込まれた画像本来のサイズによって定義されます。オーバーフローを防ぐには、大きな画像にはwidth: 100%;
にする必要があります。
button
やselect
などのインライン要素を全幅にしたい場合は、width: 100%;
を設定する必要があります。
width: 100%;
に設定されている要素に左または右にmargin
を与えると、オーバーフローが発生し、水平スクロールバーが発生します。
この水平スクロールバーは、calc()
を使用してmargin
の値を全幅から引くことで解決できます。たとえば、左右のmargin
が24px
の場合、下記のようにするとうまくいきます。
1 2 3 4 |
button { width: calc(100% - 48px); margin-inline: 24px; } |
ただし、デザインが変更され、margin
の値も変更することになった場合は、calc()
の計算も変更する必要があります。現在ではこれを完全に回避できる簡単な方法があります。それがstretch
キーワードです。
width: stretch;の使い方
width: stretch;
を使用すると、前述のCSSは下記のようになります。
1 2 3 4 |
button { width: stretch; margin-inline: 24px; } |
width: stretch;
を設定すると、他の要素がdiv
やp
などの要素と同様に自動動作を採用できます。つまり、利用可能な幅を占めるように伸縮すると同時に、問題なくマージンを使用できます。
実際の動作は、デモページをご覧ください。
width: 100%;
だけだとオーバーフローし、width: calc(100%-48px);
は期待通りに動作します。そして、width: stretch;
も期待通りに動作します。width: auto;
は全幅にはなりません。
See the Pen
width: stretch; by coliss (@coliss)
on CodePen.
stretchのサポートブラウザ
stretch
キーワードは、すべてのブラウザで動作します。というか、かなり前からサポートされています。ただし、ベンダープレフィックスが必要です。
1 2 3 |
width: -webkit-fill-available; width: -moz-available; width: stretch; |
stretch
キーワードのサポートブラウザは、下記の通りです。
stretch
キーワードは最終的に標準化され、近いうちにベンダープレフィックスなしで使用できるようになるでしょう。
参考: Intent to prototype: CSS 'stretch' sizing keyword
今のところ、すべてのブラウザでサポートされているのはwidth
だけです。min-width
やmax-width
に対して-moz-available
や-webkit-fill-available
を使用することは、FirefoxやSafariではサポートされていません。また、Firefoxでは-moz-available
はheight
で機能しません。Chromeはflex-basis
の値として-webkit-fill-available
をサポートしていません。
width: auto;についての補足
width: auto;
を理解するのに苦労したことがあるのなら、stretch
を理解することで半分が理解できます。auto
はフォームコントロールのような要素ではfit-content
にマップされ、div
のような要素ではstretch
にマップされます。
auto
キーワードについて詳しくは、下記をご覧ください。
sponsors