max-widthが効かない時の原因と解決方法を解説します。
原因は基本的に下記の2パターンです。
- tbody、tr(ならびにtable-row-group、table-row)に適用しようとしている
- 非置換のインライン要素に適用しようとしている
以下でそれぞれ解説します。
tbodyとtrにはmax-widthは効かない
max-width
はtbody
とtr
(ならびにそれらと似た挙動をするtable-row-group
とtable-row
)には適用できません。
そのため、tbody
やtr
以外の要素にmax-width
を指定する必要があります。
例えばテーブル全体の横幅の上限を指定したければtable
に、セルに指定したければth
やtd
にmax-width
を当てれば解決できます。
非置換のインライン要素にはmax-widthは効かない
max-width
は非置換のインライン要素には適用できません。
非置換要素とは、<…>…</…>で囲んだテキスト要素が他のものに置換されずにブラウザに表示されるタイプのタグを指します。(例えばspanなら<span>...</span>
で囲んだテキストがそのまま表示されます)
それに対して置換要素は、例えばimg
なら画像、video
なら動画、といったかたちで別の何かが表示されます。
インライン要素と言ったときにイメージするほとんどのタグは非置換要素であり、これらにはmax-width
が効きません。
これは考えてみれば自然なことです。なぜなら非置換のインライン要素にはそもそもwidth
が指定できないからです。
非置換のインライン要素にmax-width
を指定したい場合、その要素をinline-block
にすれば実現できます。
IE11にはmax-widthが効かないバグがある
筆者の閲覧環境で直接確認できたものではありませんが、IE11では親要素がdisplay: table-cell;
になっている場合にmax-width
が効かないバグがあるようです。(参考:IE11バグ display table, table-cell 内で max-width が効かない)
これを解決するには親要素にtable-layout: fixed
必要があるとのことです。