CSSの「max-width」が効かない時に確認してほしい4つのこと
2022/08/25
max-width
は、要素の最大幅を指定するためのCSSプロパティです。
主にレスポンシブ時など、要素が大きくなり過ぎないようにしたい時に使用されます。
しかし、状況によって上手く機能しない…なんてことも。
そこで今回は、max-width
が効かないケースとその原因、対応策を紹介します。
もくじ
1.max-widthの基本的な使い方
まず、max-width
の基本的な使い方と効果をおさらいしておきましょう。
max-width
の主な用途は、閲覧デバイスや画面の横幅が変わった時に、要素が「大きくなり過ぎない」ようにすることです。
例えば、以下のようなHTMLとCSSがあるとします。
1 |
<div class="sample"></div> |
1 2 3 4 5 6 |
.sample { width: 80%; height: 500px; margin: 30px auto; background-color: #4682b4; } |
.sample
のwidth
が80%
に指定(2行目)されていることに着目してください。
入れ子になっていない(親要素がない)ため、.sample
の横幅は画面に対して常に80%を保ちます。
例えばスマホのような縦長の画面では、横幅を80%にし真ん中に配置(4行目)することで、両脇に適度なスペースを空けることができます。
しかし、PCで画面いっぱいにブラウザを広げると、横幅80%のコンテンツはちょっと大き過ぎると思います。
このような場面で、コンテンツがある程度まで大きくなったら、それ以上大きくならないよう指示するためのプロパティがmax-width
です。
CSSに以下の行を追記してみましょう。
1 2 3 4 5 6 7 |
.sample { max-width: 600px; width: 80%; height: 500px; margin: 30px auto; background-color: #4682b4; } |
width
を80%
に指定(3行目)すると同時に、max-width
を600px
に指定(2行目)することで.sampleの横幅は(どんなに広い画面で閲覧しても)600pxを超えなくなります。
一方、スマホ等の狭い画面のデバイスで閲覧する際には、きちんと80%に保たれるためレイアウトが崩れる心配もありません。
2.max-widthとmin-widthの違い
max-width
と反対の機能を持つプロパティとしてmin-width
があります。
max-width
が「大きくなり過ぎないようにする」ためのプロパティであるなら、min-width
は「小さくなり過ぎないようにする」ためのプロパティと言えるでしょう。
例えば、前掲のHTMLに以下のようなCSSが適用されていると仮定します。
1 2 3 4 5 6 |
.sample { width: 50%; height: 500px; margin: 30px auto; background-color: #4682b4; } |
width
が50%
に指定(2行目)されていることに注目してください。
この場合、PCのような広い画面では適切な大きさに見えますが、スマホの狭い画面では小さ過ぎるかもしれません。
ここで、以下のようにmin-widthを追加することで、最低限確保しておきたい横幅を指定することができます。
1 2 3 4 5 6 7 |
.sample { min-width: 300px; width: 50%; height: 500px; margin: 30px auto; background-color: #4682b4; } |
widthを50%に指定(3行目)すると同時に、min-widthを300pxに指定(2行目)することで.sample
の横幅を(どんなに狭い画面で閲覧しても)300pxを下回ることはありません。
一方、PC等の広めの画面で閲覧する際には、きちんと50%の横幅をキープしたまま表示されます。
3.max-widthが効かない時の原因と対策
max-width
はWEBサイトのレスポンシブ化に一役買うプロパティですが、状況によってうまく機能しない場合もあります。
うまく機能しない主な原因として、以下の5点を挙げることができます。
- インライン要素に適用している
- floatが設定されている
- paddingやborderが付加されている
- tbody(table-row-group)やtr(table-row)要素に適用している
- IE11の不具合
では、各原因と対策について解説します。
3-1.非置換のインライン要素に適用している
インライン要素にはwidth
を指定できないものが多く、max-width
も同様に利きません。
これらが効かないのは「span
」や「a
」「b
」など開始タグと終了タグで囲まれた、テキストが表示されるタイプのもの(非置換要素)です。
一方、テキストではなく要素特有のコンテンツが表示される「img
」「input
」「iflame
」等の置換要素にはmax-width
を指定することができます。
max-width
が効かない時は、まず非置換のインライン要素に適用していないか確認してみましょう。
3-1.floatが設定されている
要素にfloatが設定されていると、max-width
はうまく機能しないことがあります。
例えば、以下のHTMLとCSSを確認してください。
1 2 |
<div class="sample_1">サンプル1</div> <div class="sample_2">サンプル2</div> |
1 2 3 4 5 6 7 8 9 10 11 12 |
.sample_1 { max-width: 200px; height: 200px; background-color: #4682b4; } .sample_2 { max-width: 200px; height: 200px; float: left; background-color: #ff6347; } |
.sample_1
,.sample_2
ともにmax-width
とheight
を指定して、色を加えただけのボックスです。
ただし.sample_2
にはfloat
が追加されています。
両者を見比べてみると違いは一目瞭然です。
上図のように、float
を設定した.sample_2
のみmax-width
が効いていません。
これはfloatが設定された要素は、内容(テキストなど)の大きさによって横幅が可変してしまう…という特性を持っているからです。
この場合の対策として、widthを追加してあげると良いでしょう。
1 2 3 4 5 6 7 |
.sample_2 { max-width: 200px; width: 100%; height: 200px; float: left; background-color: #ff6347; } |
.sample_1と条件を同じにしたいので、ボックス要素のデフォルト値である100%
に指定(3行目)しています。
結果は下図の通りです。
max-width
が正常に機能していることがわかります。
3-2.paddingやborderが付加されている
要素のpadding
やborder
に値が付加されていると、max-width
で指定した横幅よりも大きくなる場合があります。
例えば、以下のCSSを確認してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.sample_1 { max-width: 200px; height: 200px; background-color: #4682b4; } .sample_2 { max-width: 200px; height: 200px; padding: 10px; border: 5px solid #ff6347; background-color: #ff6347; } |
結果は下図の通りです。
padding
とborder
を適用した.sample_2
だけがmax-width
の横幅からハミ出ているのがわかります。
というのも、通常padding
とborder
の値は横幅に含まれないからです。
そのため、厳密にはmax-width
は効いているものの、それにpadding
とborder
の空間が肉付けされているため、想定よりも大きく表示されるのです。
上記の場合、padding
が左右に10pxずつ、border
が5pxずつ指定されているため、計30pxが横幅に加算されています。
これを解消するために、以下のコードを追加してください。
1 2 3 4 5 6 7 8 |
.sample_2 { max-width: 200px; height: 200px; padding: 10px; border: 5px solid #ff6347; background-color: #ff6347; box-sizing: border-box; } |
box-sizing
とは、要素の幅(width
)と高さ(height
)にpadding
とborder
を含めるか否かを決めるプロパティです。
このプロパティの初期値がcentent-box
になっているため、失敗例ではpadding
とborder
の値分が加算されてしまっていたのです。
上記のようにborder-box
に指定(7行目)することによって、要素の横幅と高さの中にpadding
とborder
を含めることができるようになります。
3-3.tbody(table-row-group)やtr(table-row)要素に適用している
テーブルの列全体に最大幅を設けたい時、列を構成するtbody
またはtr
にCSSを指定してしまいがちです。
例えば、以下のような感じにです。
1 2 3 4 |
tr { width: 80%; max-width: 600px; } |
しかし、tr
にはmax-width
はもちろんwidth
も反映されません。
上記のtr
をtbody
に変更しても結果は同じです。
列全体の横幅を調整したい場合は、tbody
やtr
ではなくtable
に指定すると上手く行きます。
1 2 3 4 |
table { width: 80%; max-width: 600px; } |
ちなみに、テーブル内の各セルにあたるtd
にはmax-width
を指定することが可能です。
3-4.IE11の不具合
また、IE11の不具合としてテーブルのtd
にもmax-width
が機能しない…という報告があります。
この場合は、table
要素にtable-layout: fixed
を指定することで改善できるようです。
まとめ
今回はmax-widthが効かない時の原因と対処方法について説明しました。
押さえておきたいポイントは以下の通りです。
- 「
span
」や「a
」「b
」などの非置換のインライン要素にはmax-width
は効かない float
が有効になっている要素にはwidth
とセットで指定しようpadding
やborder
によってサイズが合わない場合は、box-sizing: border-box
を指定しよう- テーブル全体の最大幅を調整する場合は
tbody
やtr
ではなくtable
に - IE11の不具合で
td
の最大幅が反映されない場合はtable
にtable-layout: fixed
を指定しよう