Magical Margin Tips



今回はMarginの特徴を上手く理解し、
活用するためのテクニックをお伝えしたいと思います :thumbsup_tone1:

## 【Ice Break :ice_cream: 】 Margin と Paddingの違いついて
これ、CSS触る人は大抵ぶつかる問題ですね :sweat_smile:
おそらく数年前の私もぶつかってたと思います :information_desk_person_tone1:
MarginとPaddingを間違って使用してしまうと
レイアウトが恐ろしいことになってしまったり:ghost:

そんなハードルの高さを払拭するために
最近某知事が【Social Distance】を良く連発されていますので、
それに例えようと思います:point_up_tone1:

私達の間にはパーソナルスペースという
他人に近付かれると不快に感じる空間が存在しています。

[※参考サイト](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9)


パーソナルスペースで例えるならば、
Marginが社会距離でPaddingが個体距離にあたります。
つまり【Social Distance】というのは
CSSでいうならば【Margin】を空けろということになります :wink: 


......っていう話をさっき思いついたので適当に書いてみました :yum:

真面目に説明すると、
Paddingは**私の領域**、Marginは**私とあなたの距離感**なんですね。
もしくはPaddingは**内側**、Marginは**外側** :pencil: 
お隣さんでMarginが干渉し合うのは、個々に付けられると思っていても、
お互いの空間を共有し合う事があるからでしょうか...... :thinking: 

という独特のCSS ruleが存在しますので、Margin不慣れな方は
【**one way(単一方向) Margin**】を心がけるようにしましょう :sparkles: 
(上につけるなら他のお隣さんも上だけ、下につけるなら他のお隣さんも下だけ)


## Margin Tips :sparkles: 
さて本題ですが、今回はMarginの特徴を上手く理解し、
活用するためのテクニックをお伝えしたいと思います :thumbsup_tone1:

Marginの特性を理解し、上手く活用できるようになれば
あなたも一人前のCSS使いと言えるでしょう :point_up_tone1: 

### 1. Negative Margin
知ってるか......Marginって負の値も使えるんだぜ......

っていうのがNegative Marginです。
Marginに負の値を入れることによって、
正の値を入れたときと逆に要素を動かすことができます。

こういうスマホサイトのデザインに遭遇したとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/fc8eea62-daf8-2080-16dc-eb62b1d29196.png)


写真以外はみんなコンテンツ幅の中に収まっているのがわかるでしょうか？

わかりやすいように線を引いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/476da1c4-d8da-f51b-b261-c6aa760cbe3f.png)


ビジュアルをダイナミックに見せるため、写真をコンテンツ幅からはみ出させる手法は
ウェブデザインでよく遭遇することがあります。
こういうデザインをコーディングする場合、写真以外の要素にそれぞれコンテンツ幅用の余白を入れていては少し面倒ですよね:sweat: 
CSSの行数もかさんでしまいます。
できるなら親に一回入れるだけで済ましたい......

そんなあなたにおすすめなのがNegative Marginです :sparkles: 
こんなふうに書けば......

```css:style.css

/* 親 */
.parent {
  padding-left: 10px;
  padding-right: 10px;
}
/* コンテンツ幅を無視したい要素 */
.visual {
  margin-left: -10px;
  margin-right: -10px;
}

```
写真だけはコンテンツ幅を無視し、
他の子要素はきっちりコンテンツ幅の中に収めることができます。
イレギュラーな要素がある際におすすめな手法です:wink: 

※コンテンツ幅の余白などの数値は、他のページで使用する可能性が高いので
変数に入れて使うようにしたほうが分かりやすいですヨ :point_up_tone1: 

#### 他にも
隣人が前の要素に食い込むような
オシャレなデザインにも活用することができますよ :lipstick: 
(この場合はお知らせ部分のmargin-topにNegative Margin)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/1b54b207-f612-890d-d035-d1e14b2436cf.png)


### 2. Marginの相殺
お隣さん同士の社会距離がぶつかりあった瞬間......そこで戦いが生まれます......
勝ち残れるのは、より多くの距離(Margin)を積んだ者だけ......

っていうのがMarginの相殺です :star2: 

:question: 突然ですが、問題です :question: 
お隣さん同士のブロック要素(Aさん、Bさん)がお互いmarginを積んだとします。
Aさんはmargin-bottomに20px, Bさんはmargin-topに30px積みました。
さて二人の距離はどれくらい空くでしょうか？


:arrow_down: :arrow_down: :arrow_down: 

:a: 正解は30pxです。50pxにはならないので注意です :warning: 
(ちなみにborderを引いておくと戦闘回避することもできます :runner_tone3:  )

詳しくはこちらの説明が分かりやすいです :clap_tone1:
https://coliss.com/articles/build-websites/operation/css/about-collapsing-margins.html

さて、このMarginの相殺ですが、一体何の役に立つのかと思う方もいるでしょう。

実はこの相殺、どの要素が入るかわからない場合に使うととても便利なんです :bulb: 
CMS(ContentManageSystem)を使用する際に役立つことがあります。

WordPressやWiki投稿サイトなどでは、投稿者が自由に要素を組むことができます。
その際にすべての要素にそれぞれmargin-top, margin-bottomを入れておけば、
多い方の余白が相互の距離感を踏襲するので、
いちいち要素感の距離を計算して指定する必要がなくなります :kissing_heart: 

```css:style.css
h2 {
  /* pの後にh2が来たときは相互間の余白は20pxに統合 */
  margin-top: 20px;
  margin-bottom: 10px;
}

p {
  margin-top: 10px;
  margin-bottom: 10px;
}

```

そういったサイトをコーディングする際は、
是非Marginの相殺テクニックを使用してみてください！


### 3. おまけの応用編(疑似要素 × Negative Margin)

デザインデータを貰って、

さぁCSS書くぞー！

......あれ？
測ったとおりに数値を入れたのになんか要素間の余白めっちゃ空いてない......？
といった経験はないでしょうか？

ピンとこない方は、
下記例を御覧くださいまし :eyes: 

#### Marginの無い状態での要素間の挙動
##### 理想
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/c72d61df-c878-b0d6-964e-c9885cc97bf2.png)

##### 現実
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498647/1be968b5-3f0f-adcf-f921-19c1eeec3ed5.png)

おわかりいただけただろうか......

marginを指定していないにもかかわらず要素間に微妙な空きが開いてしまっています。

原因はline-height(行間)があるからかもしれません......:sunglasses: 

これではデザインデータの余白を正しく測ることもできず、
デザインの精度が落ちてしまう事態に.....:cry: 

そこで下記の記事で使用するテクニックがとてもわかりやすく、
役に立つので紹介します :point_up_tone1: 

https://yuyakinoshita.com/blog/2020/01/20/line-height-crop/

記事に記載のある通り、見出しに擬似要素を使用する場合は
上手くline-heightを削ることができないどころか、
装飾に悪影響を及ぼす可能性もあるので注意が必要です :warning: 
段落パーツで使用すると、測った通りの余白でデザインの再現ができるので
一石二鳥なテクニックですよ:laughing: 
疑似要素を使い出したCSSユーザーにはぜひ実践してほしいテクニックです！


以上がMarginを使いこなすための技でした :star2: 

少しでもMarginの特性を理解していただけたら幸いです:relaxed: