CSS:100%なの?autoなの?widthについて考える


最終更新日:2020.3.7
Pocket

こんにちはゆずこです。

レスポンシブサイトを作るとき、widthをautoにするか100%にするか、というかそれぞれの違いってなんなの!というお悩みを持つコーダーさんは少なくないと思います。

「100%でもautoでもなんか横幅いっぱいになるけど!?」っていう。

 

なんとなく一緒に見えますが、実はなにげに結構違うんです。

 

まずは実際の挙動を見る

実際にそれぞれのパターンを書いてみました!

グレー部分を親要素として、中にピンクのボックス(width: 100%チーム)とブルーのボックス(width: autoチーム)を置いてます。

各行のCSSの条件は書いてあるとおりです。

 

width: 100%を見る

width: 100% の1つめは、赤い枠線(border)が若干背景からはみ出していますね。

また、2つめも、padding分大幅にはみ出しています。

検証ツールで見るとこんな感じ。

左右にpaddingを20pxずつ書いているのと、border1pxぶんが合わさって、
padding左右40px + border左右2px の合計42pxぶん、widthが大きい状態になってしまっています。

 

marginもおなじく、指定されたmarginぶん横にずれていますね。

 

なんではみ出してしまうのか

width: 100% の「100%」というのは、「親要素に対して100%」の値が付与されます。

今回の場合、要素自体が親要素のグレー部分と横幅と同じ「800px」を所有していて、

且つ、同じく「要素の内側」に追加されるpaddingとborderぶん、横幅が加算されてしまったんです。

 

width: auto はmarginもpaddingもborderも含めた状態で今自分が保有できる幅いっぱいを確保する

一方width: autoは、すべての状態で親要素であるグレーの枠内に収まっています。

これは、width: auto はmarginもpaddingもborderぶんも含めた状態で、最大で保有できるwidthの値を決めてくれます。

基準となるのはこちらも親要素の幅です。

勝手に親要素に合わせてくれるので便利な子です。

 

ただ、width: autoだと「margin: 0 auto」での中央寄せができないので注意しましょう。

 

border-boxって?

全体的にwidth: 100%のほううまくいってなくない!?と思う中、

一つだけうまくいっているレイアウトがあります。

上から4つめ、「width100% + padding + border-box」です。

border-boxとは、box-sizingプロパティの値のひとつですが、

「要素の内側であるborderやpaddingを含めた状態で、指定されたwidthに収まるようにする」という役割をもっています。

ちなみに初期値はcontent-boxです。(これだとpaddingやborderがはみ出す)

 

結局何を使えばいいの?

個人的には親要素いっぱいに領域を確保したい場合は width: 100% + box-sizing: border-box を愛用しています。

ただ、box-sizingプロパティはレガシーブラウザには対応していないという欠点(?)があります。

IE7で見るとこんな感じ。さっきまで効いてたbox-sizing効いてない!

逆に言えばIE8以上であれば効くので、対応ブラウザによって使い分ければいいと思います。

というかIEは基本的に11以上、なんならサポート外でもいいと思っています、これ以外にもCSSの制約が多すぎる

 

「width: 100%の中、marginのやつがうまくいってないじゃん」と思いますが、

こんなものは本来グレーの背景の内側にpaddingを仕込んでやればいいんです、もちろんbox-sizing: border-box付きで。

 

width: 100%とautoの違いなんだっけーといった際には、この記事を見て思い出していただければと思います★

 

Pocket