【初学者向け】floatの解除方法

floatの解除方法についての記事です。<font color="red">**後続の要素にclear:both;**</font>をすることは皆さんご存知かと思いますが、そもそも後続要素がない場合などがあると思います。その場合の方法を紹介します。
※一応初学者向けに書いてます。

## コード紹介
初学者さんは一緒にコードをいじりながらやると、floatの理解もできていいかと思います。使用画像を以下に置いておきます。

![chara1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/d75e1bb2-eb02-6bc3-7a18-22ec2d3136e4.jpeg)

```html:html
<section>
  <h2>ハトくん、おそらをとぶのまき</h2>
  <img src="./img/chara1.jpeg" alt="ハトくんの画像">
  <p>floatをしていないテキストは地面びっしりとくっついているイメージです。 </p>
</section>
```

```css:css
body{
  background: beige;
}
section{
  background: aquamarine;
  width: 500px;
  margin: 0 auto;
  padding: 50px;
  position: relative;
}
h2{
  margin: 0;
  margin-bottom: 50px;
  text-align: center;
  font-family: "Nico Moji";
}
img{
  width: 200px;
}
section p:first-of-type{
  background: chocolate;
  padding: 10px 0;
  color: white;
  font-weight: bold;
}
```

コードと素材が用意できたら、画面を確認します。ちなみに<font color="red">**リセットCSSなしです。**</font>

![スクリーンショット 2020-12-12 17.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/c6aa4b2a-46d9-e5eb-8ac5-8dae80692fed.png)

そしたら画像とテキストを横並べにします今回は題材でもある`float`を使います。

```css:css(追加箇所のみ表示)
img{
  width: 200px;
  float: left;
  margin-right: 50px;
}
```

![スクリーンショット 2020-12-12 16.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/1faaece5-679c-07e8-3604-f5ec9f535ea4.png)

そうするとどうでしょう？段落要素が画像の後ろへ回り込んでいるのがわかりますか？
`float`をかけた画像は要素そのもが<font color="red">**浮いている**</font>と言う状態です。
この浮いてるっていう表現が非常に初学者泣かせな表現なのですが、<font color="red">**数学で言うところのZ軸です。**</font>理系の方この表現でわかりますよねｗ？

![float.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/155ead59-8ce8-1f39-8888-e55d26f4a1be.jpeg)

図を頑張って作りました。縦と横、そして奥行きの方向があることがわかりますのでしょうか？
`float`をかけるとこの奥行きの方向に要素が動ようなイメージになります。
もう１つイメージを紹介します。

![float-animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/c501fd55-cdb8-540e-f2f2-9bc2944d7780.gif)

これは画像にアニメーションを追加して、`float`要素が浮いてることを表現しました。
アニメーションの途中で、段落要素の背景（茶色）が見えるのがわかりまりますか？これは段落要素が画像の後ろへ回り込んだことを示しています。

さてここからが本題です。浮いてしまったが故に、画像が要素の外にはみ出てしまってます。これを解消する方法を次の章で紹介します。

## floatの解除

#### clearfixを使う。
まず昔からの手法で、clearfixというCSSの合わせ技みたいなのを使います。
擬似要素と言うのを使います。今回の場合`clear:both;`をかければ、はみ出た部分を元に戻すことができそうですが、肝心の`clear:both;`をかける要素がありません。
なので<font color="red">**擬似的に要素を作成します。**</font>

やり方としては、`section`にクラスを追加し、追加したクラスにclearfixを書いていきます。

```html:html
<section class="cf">
  <h2>ハトくん、おそらをとぶのまき</h2>
  <img src="./img/chara1.jpeg" alt="ハトくんの画像">
  <p>floatをしていないテキストは地面びっしりとくっついているイメージです。 </p>
</section>
```

```css:css
.cf:after{
  content: "";
  display: block;
  clear: both; 
}
```

図解化するとこんな感じになります。

![float2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/86c9c060-7416-b8c4-6244-4d9970eb4629.jpeg)

これで枠内に収まりました。

![float後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/102202c1-c08a-6b46-c70d-108a53d00119.png)

#### overflow:hidden;を使う。
多少制限はありますが、これが一番楽なやり方です。
※先程のclearfixは消して下さい。

```html:html
<section>
  <h2>ハトくん、おそらをとぶのまき</h2>
  <img src="./img/chara1.jpeg" alt="ハトくんの画像">
  <p>floatをしていないテキストは地面びっしりとくっついているイメージです。 </p>
</section>
```

```css:css
section{
  background: aquamarine;
  width: 500px;
  margin: 0 auto;
  padding: 50px;
  overflow: hidden;
}
```

`clearfix`が後続の要に対して使うのに対し、`overflow`は親要素に対して使用します。
`overflow:hidden;`は、はみ出た要素を隠すのに使いますが、実はもう１つ特性があります。

![float.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/155ead59-8ce8-1f39-8888-e55d26f4a1be.jpeg)

こちらの説明で、Z軸つまり奥行きがあると言うことを説明しましたが、`overflow:hidden;`には<font color="red">**付けた要素の奥行きを作成することができます。**</font>

`section`が平面から<font color="red">**立体的な箱になった**</font>というとわかりやすいでしょうか？これを図解化しました。

![float3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/b0d93863-cab5-c41e-d7f6-dede5fb2cc7f.jpeg)

このように`overflow:hidden;`をかけた要素が変化していったことがわかるかと思います。

## 最後に
floatの解除方法の応用編みたいになりましたが、どちらも非常によく使われている手法なので覚えておくといいでしょう。

今回はおまけとして、アニメーションを加えた最終的なコードを載せておきますので、是非参考にして下さい。お疲れ様でした。

```html:html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>float-animation</title>
  <link href="https://fonts.googleapis.com/earlyaccess/nicomoji.css" rel="stylesheet">
  <!-- CSS -->
  <link rel="stylesheet" href="./css/style.css">
</head>
<body>
<section>
  <h2>ハトくん、おそらをとぶのまき</h2>
  <img src="./img/chara1.jpeg" alt="ハトくんの画像">
  <p>floatをしていないテキストは地面びっしりとくっついているイメージです。 </p>
  <p class="comment">ふわ<br>ふわ</p>
  <p class="comment">びし！</p>
</section>
</body>
</html>
```

```css:css
@charset "UTF-8";
body{
  background: beige;
}
section{
  background: aquamarine;
  width: 500px;
  margin: 0 auto;
  padding: 50px;
  position: relative;
  overflow: hidden;
}
/* .cf:after{
  content: "";
  display: block;
  clear: both; 
} */
h2{
  margin: 0;
  margin-bottom: 50px;
  text-align: center;
  font-family: "Nico Moji";
}
@keyframes fly{
  0%{transform: scale(0.9);}
  100%{transform: scale(1.1);}
}
img{
  width: 200px;
  float: left;
  margin-right: 50px;
  animation: fly 1s infinite alternate;
}
@keyframes sound-effect{
  0%{
    top: 150px;
    left: 250px;
    transform: rotate(30deg);
    opacity: 0;
  }
  50%{
    top: 150px;
    left: 240px;
    transform: rotate(30deg);
    opacity: 1;
  }
  51%{
    top: 150px;
    left: 250px;
    transform: rotate(30deg);
    opacity: 0;
  }
  52%{
    top: 100px;
    left: 0px;
    transform: rotate(-30deg);
    opacity: 0;
  }
  100%{
    top: 100px;
    left: 10px;
    transform: rotate(-30deg);
    opacity: 1;
  }
}
section p.comment:nth-of-type(2){
  position: absolute;
  animation: sound-effect 3s infinite;
  font-family: "Nico Moji";
  font-size: 30px;
  color: gray;
  text-shadow: 1px 1px 5px white, -1px -1px 5px white, 0 0 10px white;
}
@keyframes shaking{
  0% {transform: translate(0px, 0px) rotateZ(0deg)}
  1% {transform: translate(2px, 2px) rotateZ(1deg)}
  2% {transform: translate(0px, 2px) rotateZ(0deg)}
  3% {transform: translate(2px, 0px) rotateZ(-1deg)}
  4% {transform: translate(0px, 0px) rotateZ(0deg)}
  5% {transform: translate(2px, 2px) rotateZ(1deg)}
  6% {transform: translate(0px, 2px) rotateZ(0deg)}
  7% {transform: translate(2px, 0px) rotateZ(-1deg)}
  8% {transform: translate(0px, 0px) rotateZ(0deg)}
  9% {transform: translate(2px, 2px) rotateZ(1deg)}
  10% {transform: translate(0px, 2px) rotateZ(0deg)}
  11% {transform: translate(2px, 0px) rotateZ(-1deg)}
  12% {transform: translate(0px, 0px) rotateZ(0deg)}
  100% {transform: translate(0px, 0px) rotateZ(0deg)}
}
section p:first-of-type{
  background: chocolate;
  padding: 10px 0;
  color: white;
  font-weight: bold;
}
section p.comment:last-of-type{
  position: absolute;
  top: 65px;
  right: 20px;
  font-size: 40px;
  color: red;
  text-shadow: 1px 1px 5px yellow, -1px -1px 5px yellow, 0 0 10px yellow;
  font-family: "Nico Moji";
  animation: shaking 1s infinite;
}

```

![完成品.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/470adb6a-8564-6517-4fbc-7025b1792f09.gif)