はじめに
block 要素に margin
と padding
をそれぞれつけてみるとどうなるか。
See the Pen Untitled by KadoBloG (@KadoProG) on CodePen.
見ての通り、両者とも左側に同じ余白が挿入されており、この時点では特に違いがない。
そんなとき、あなたは迷ったらどちらを使うだろうか?
marginは外側、paddingは内側に余白が発生
まず結論を言うと、要素に対してmarginは外側、paddingは内側に余白が発生する。
直訳すると、margin
は、余白,欄外,余地という意味合いがあり、一般的な余白の使い方に近い。一方、padding
は、詰め物,芯という意味合いがあり、コンテンツの中に埋め物をするイメージである。
外側、内側による余白の仕様の違い
では、外側、内側という違いにより具体的に何が違うのかを解説する。
CSSスタイルの範囲
- 背景
- ボタンやアンカーリンクのクリック範囲
- borderの囲い
- 要素サイズ(width, height)に含まれるか
- box-sizingにより変化
margin
は上記に上げた項目には一切関わらない。逆に、padding
はこれらの影響を受け、背景・ボタンの範囲を制御できる。
margin | padding(デフォルト) |
---|---|
Qiitaのボタンは良い例で、現状仮にこれをmarginでやった場合と比較するとこうなる。
marginで実施すると、背景及びクリック範囲がかなり縮小しているのがわかる。ただし余白自体はかかっているため、表示位置は両者一緒。
隣同士の余白の取り扱い
次に、隣同士の余白の取り扱いの違いだ。試しに、左の要素には右に余白30px, 右の要素には左に余白10pxを与えてくっつけると仮定する。
実際に flex
等でくっつけると、marginでは10px分が重なって30pxの余白となっている。逆にpaddingは単純に加算され余白は40pxとなる。
marginは指定した最低限の距離を開ける
marginの概念について、人で例えると分かりやすい。10cm
と2m
(200cm)の社会的距離を担保したい人(HTML要素)がある場合、200cmが優先され、10cmは実質無視される。それがmarginである。
ただし例外もあり、marginはマイナスの値が可能で、-2m
, 2m
であれば実質0mとなり、更にマイナスの値を大きくすると、要素が重なる。
See the Pen padding-first-code-2 by KadoBloG (@KadoProG) on CodePen.
通常のWebアプリで使用されることはほぼないが、LPデザインで特殊な実装をする場合使うことがある。
paddingは優等生
一方padding
は、繰り返しになるが内側に余白が発生するため、外的要因を受けない。マイナスの値も適用できない。
See the Pen padding-first-code-5 by KadoBloG (@KadoProG) on CodePen.
padding
は背景を適用されるため、シンプルなボタンの装飾に非常に便利だ。また、コンテナ側にもpadding
を適用している。
結局どちらを使用すべきか
極論言ってしまうと、余白はpaddingだけで実装が可能であるし、逆にmargin
だけでも実装が可能である。
しかし、実際にコードを見ると、実装のしやすさでpadding
が使いやすいと言える。
paddingは潔い
See the Pen padding-first-code-7 by KadoBloG (@KadoProG) on CodePen.
もし仮に全てmargin
でやる場合、button
の中にspan
要素を付与し、そこにmargin
を付与すれば、同じボタンを実装できる。
ちなみにpadding
の場合はbutton
にpadding: 20px
だけで完了する。潔い。
全体のレイアウト調整はmarginを使ってはいけない
marginのみ | |
---|---|
paddingとflex |
横並びで、間に余白があるレイアウトを実装する場合、margin
で実装するのは現実的じゃない。
See the Pen padding-first-code-8 by KadoBloG (@KadoProG) on CodePen.
固定サイズではmargin
, padding
とも同じレイアウトを維持している。
しかし、Webサイトは異なる横幅に対応させる必要があるため、margin
を使用した場合、これ以外のサイズで表示が崩れる(チェックボックス押してプレビュー)。
ブラウザ・コンテナの横幅だけでなく、中の要素も1pxでも変更されれば、再びmargin
の変更が必要である。
対してpadding&flex
の方は、全く崩れることはない。上下はpadding
で実装し、横の隙間はflex, justfy-content: space-between
で実装可能だ。何より、コード量がpadding
のほうが少ない。
flex
の並び方は複数あるので、色々調べてみるのがオススメ!
もし先程のmargin
と同様に一定間隔を開けたい場合は、gap
を使用すると最低限の距離を開けつつ、コンテナ要素が自動的にサイジングされる!
シンプルな実装はmarginでもOK
WordPressで構成されたブログは、段落でmargin-bottom
が使用されている。margin
は、上下左右のみの付与も可能で、下部のみであれば、前述したmargin
重なり問題が発生しないため、直感的に実装できる。
marginで中央寄せ可能
margin: 0 auto;
(最初の0は上下の余白)のように指定をすることで、中央寄せが可能である。
ただし、その要素がblock要素で、親要素より小さいサイズを指定する必要がある。簡単なようで実は難しい。
また、単にテキストを中央寄せしたい場合はtext-align: center
を使用する方法もあるし、横並びで複数表示するときはflex
を使用する方法もある。
marginは細かい実装には不向き
ブログのように比較的統一されているレイアウトの場合、上記の実装で十分である。しかし、Webアプリなど、複雑な実装を必要とする場合、場所によってmargin
が異なる。
通常 | 入れ替え |
---|---|
例えば、「送信しますか?」のスタイルには、margin-top: 20px; margin-bottom: 0
を指定している。
しかし、中のレイアウトが入れ替わると、それだけでコンテナ内のCSSは全て書き換える必要がある。
可能な限りpadding, flex-boxを使用しよう
簡単な実装でない限りは、padding, flex-boxを使用することが無難となる。とはいえ実際のサイトがどうなっているかは、実際に見てみるのがオススメ。
Chromeであれば Ctrl/Cmd
+ Shift
+ C
で、要素の選択ができる画面となる。そこで、実際のHTMLがどのように余白表示されているか検証してみると良い。
某X やChatGPTは、ほぼpadding
及びflex
で構成されている。
要素は青、margin
はオレンジ、padding
は緑で閲覧できる。flex-boxの場合、紫の斜め線で閲覧できる。
参考記事