こんにちは、荒木です。今日はreactやvue等でコンポーネントを実装する際にCSSではmargin
を使わないと聞くことがあると思います。その理由を簡単な例を通して見ていこうと思います。
例の前にまとめてをいうと、margin
を使うと修正コストが増えることが多いからです。
では以下のカードUIに画像とタイトルが含まれている例を見ていきます。
カードUI
右のキャプチャから分かるように、Title
はcontent
内にあり、margin
を使用して自身の位置を決定しています。
つまりこの状態は、content
が親要素ですが、Title
がその子要素の位置を決定しているわけではないと言えます。
現在のコンポーネントは次のようになっています。
<Card>
<Image />
<Content>
<Title />
</Content>
</Card>
予期しないレイアウト
先程の例では、margin
を使わない理由はわかりませんね。次にTitle
の上にTags
タグを追加してみます。
<Card>
<Image />
<Content>
<Tags />
<Title />
</Content>
</Card>
tag1
とtag2
を追加してみると、当然にTitle
からmargin
分が離れてしまいます。上のコンポーネント例を見ただけではTags
とTitle
が離れるような雰囲気は感じられません。本来は以下のようなレイアウトを予想しいるはずです。
コードからすぐに表示の様子がわからないのはよくないですし、Tags
を意図する場所に配置しようとするとTitle
の中身を修正しなければいけません。これがmargin
の良くない点だといえます。
右のキャプチャのようなpadding
を使用していれば、不要なコードの修正も予期しないレイアウトも避けられることが多くなるはずです。
まとめ
簡単な例ですが、親要素が子要素の位置を決めるようなCSSを書くと、修正が少なくなったりレイアウトの見通しがよくなるということが感じられたかもしれません。
margin
というのは子要素が親要素に影響を与えるので、逆のことをしてしまうから良くないことが起こることがあります。padding
だと親要素が子要素に影響を与えるので使っていきましょうってことでした。
今回は、要素の位置だけでしたが、子要素のサイズを親要素から指定するようにすると変更に強いコードがかけるので設計時に気をつけてみるのがおすすめです。