【CSS】paddingで高さが変わる原因と対処法|box-sizingが効かないときの解決策

【CSS】paddingで高さが変わる原因と対処法|box-sizingが効かないときの解決策 HTML/CSS

要素に padding を指定したら、意図せず高さや幅が膨らんでしまった経験はありませんか?これは CSS の「ボックスモデル」の仕組みによるもので、特に box-sizing の指定が効いていないときに起こりやすい現象です。この記事では、padding が高さを押し広げる原因と、それを防ぐための実装方法を詳しく解説します。

なぜ padding で高さが変わるのか

CSS のデフォルトでは box-sizing: content-box; が適用されます。この場合、widthheight は「内容領域(content box)」だけを指し、padding や border は含まれません。そのため、padding を追加すると高さ・幅が実寸より膨らんでしまいます。

.box {
  width: 200px;
  height: 100px;
  padding: 20px;
  background: lightblue;
}

上記の要素は高さ 100px として指定されていますが、実際には 100px + padding-top + padding-bottom = 140px になってしまいます。

解決策1:box-sizing: border-box を指定する

最も一般的な対処法は box-sizing: border-box; を指定することです。この設定では widthheight に padding と border を含めるようになり、サイズが膨らむのを防げます。

.box {
  width: 200px;
  height: 100px;
  padding: 20px;
  box-sizing: border-box;
  background: lightgreen;
}

これにより、見た目上は常に指定した幅・高さを維持できます。多くの CSS リセットやフレームワークでは、全要素に対して box-sizing: border-box; を指定するのが一般的です。

*, *::before, *::after {
  box-sizing: border-box;
}

解決策2:高さを固定せずに自動調整する

高さを固定値で指定する代わりに、height: auto; を利用すれば padding を含めて自然に高さが伸びるようになります。コンテンツが可変の場合はこちらの方が適しています。

.box {
  width: 200px;
  padding: 20px;
  height: auto; /* 高さは中身に応じて変化 */
  background: lightcoral;
}

解決策3:min-height を活用する

高さを最低限確保しつつ、padding や中身の増減に応じて伸縮させたい場合は min-height を使う方法があります。

.box {
  width: 200px;
  min-height: 100px;
  padding: 20px;
  box-sizing: border-box;
  background: lightyellow;
}

box-sizing が効かないときのチェックポイント

box-sizing: border-box; を指定したのに思った通りに動かない場合、以下を確認しましょう。

  • セレクタの優先度が低く、他のスタイルに上書きされていないか
  • ユーザーエージェントスタイルや外部ライブラリで content-box に戻されていないか
  • iframe 内や Shadow DOM 内など、適用範囲が限定されていないか

まとめ

padding で高さが変わるのは、CSS のデフォルトが content-box だからです。これを防ぐには box-sizing: border-box; を利用し、場合によっては高さを固定せず automin-height を使うのが効果的です。サイト全体で統一したサイズ管理を行うために、リセット CSS として *, *::before, *::after { box-sizing: border-box; } を指定しておくのがおすすめです。