ボックスレイアウトの基本をマスターしてサクッとwebページを作れるようになろう	


## 背景とゴール

最近のwebサイトは、ページ内を複数のボックス要素を作り、それらをレイアウトの沿って敷き詰めるのが流行っているようです。

そこで、ボックスのレイアウトで良く使うテクニックを勉強して、簡単にwebサイトを作れるようになろう。というのが目的です。

## まずはボックスを横に並べてみる

### step1. とりあえず、縦に4つ並んだボックスを用意します

![スクリーンショット 2015-10-23 08.02.18.png](https://qiita-image-store.s3.amazonaws.com/0/23276/8b5cc643-e574-3819-4015-8f642a01dc2c.png "スクリーンショット 2015-10-23 08.02.18.png")


```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>ボックスの例</title>
  <link rel="stylesheet" href="css/box.css">
</head>
<body>
  <div class="box1">box1</div>

  <div class="box2">box2</div>
  <div class="box3">box3</div>

  <div class="box4">box4</div>
</body>
</html>
```

各ボックスをわかりやすく表示する為にボーダーをつけてます。
また、`box-sizing: border-box`を指定する事で、パディングとボードも幅と高さに含めるようにしてます。

```scss
div {
  border: solid 8px red;
  box-sizing: border-box;

  text-align: center;
  line-height: 100px;
  font-weight: bold;
  font-size: 60px;
}
```

### step2. box2とbox3を横並びにしてみる

やり方は非常に簡単。
.box2と.box3をさらにdivで囲んで、中の2つfloatingさせてしまえばOKです。

```scss
.box2, .box3 {
  float: left;
  border-color: yellow; }
```


![スクリーンショット 2015-10-23 08.04.04.png](https://qiita-image-store.s3.amazonaws.com/0/23276/cfd6d547-2328-daad-eeeb-7eefa2aebe0b.png "スクリーンショット 2015-10-23 08.04.04.png")

#### box2とbox3の横にbox4が入り込む理由

ボックスレイアウトを行う上でfloatは必須ですが、
このfloatに関する考え方は非常に大事です。
floatを指定したボックスは、その名の通り「フローティングボックス(浮動ボックス)」という特殊なボックスとして扱われます。
つまり、他のボックスからは「存在しないもの」として扱われるため、
今回の場合だと、box4はbox2とbox3の後ろに入り込んでいる訳です。

※ これを防ぐには `clear: both` という指定を行ってフローティングを解除する必要があります。

#### step3. フローティングを解除して、box4を後ろに入り込まないようにしてみる

このように、floatingさせてるボックスを囲んでいるボックスのafter要素を↓のようにしてフローティングを解除する方法は良く使います。

```scss
.boxA {
  border: none;
  &:after {
    content: "";
    display: block;
    clear: both;
  }
}
```

![スクリーンショット 2015-10-23 08.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/23276/707ab168-e034-b97d-8bb8-ebcd6fa5b3e9.png "スクリーンショット 2015-10-23 08.19.44.png")


#### step4. box2とbox3を横幅いっぱいに広げてみる

box2とbox3を横幅いっぱいに広げてみたいですね。
それぞれの幅を50%にしてみましょう

```scss
.box2, .box3 {
  float: left;
  border-color: yellow;
  width: 50%;  /** 横幅50% **/
  }
```

![スクリーンショット 2015-10-23 08.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/23276/4c75ace1-b10a-8218-1a5f-72f6f6d5ea9d.png "スクリーンショット 2015-10-23 08.21.41.png")

できました。簡単ですね。

## ボックスを横並びにさせるコツのまとめ

* 横並びにしたいボックスを囲むボックス(boxA)を作る
* 横並びにしたいボックスをfloatingさせる
* 囲んだボックス(boxA)のafter要素を使ってfloating解除する

### おまけ

ここまでできたら、2つだけじゃなく、3個も4個も横並びにするのも簡単ですね。
基本はすべて上と同じです。

```html
  <div class="boxA">
    <div class="box1">box1</div>
    <div class="box2">box2</div>
  </div>

  <div class="boxA">
    <div class="box3">box3</div>
    <div class="box4">box4</div>
  </div>

  <!-- 3分割 -->
  <div class="boxA">
    <div class="box5">box5</div>
    <div class="box6">box6</div>
    <div class="box7">box7</div>
  </div>

  <!-- 4分割 -->
  <div class="boxA">
    <div class="box8">box8</div>
    <div class="box9">box9</div>
    <div class="box10">box10</div>
    <div class="box11">box11</div>
  </div>
```

```sass
.box1, .box2, .box3, .box4 {
  float: left;
  border-color: yellow;
  width: 50%;
}

.box5, .box6, .box7 {
  float: left;
  border-color: blue;
  width: 33.3333%; // 3分割
}

.box8, .box9, .box10, .box11 {
  float: left;
  border-color: green;
  width: 25%; // 4分割
  font-size: 30px;
}

// boxAのスタイルは前と同じ
.boxA {
  border: none;
  &:after {
    content: "";
    display: block;
    clear: both;
  }
}
```

![スクリーンショット 2015-10-23 08.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/23276/3f1eede9-2461-133d-acb0-920a49fad293.png "スクリーンショット 2015-10-23 08.27.43.png")

ここまでに使ったコードはgistにあげておきました。

https://gist.github.com/rikiMuneoka/03db3693bd073287789c

## カラム落ちについて

このようにボックスの横並びを使っていると、横幅の合計が100%を超える場合が出てきます。
その場合、カラム落ちといって、100%に収まらなかったボックスに関しては改行されて表示される事になります。

試しに、3分割にしたボックスを横幅50%にしてみましょう。
合計150%で100%を超えるのでカラム落ちを再現出来ます。

```sass
.box1, .box2, .box3 {
  float: left;
  border-color: yellow;
  width: 50%;
}

.boxA {
  border: none;
  &:after {
    content: "";
    display: block;
    clear: both;
  }
}
```

![スクリーンショット 2015-10-23 08.56.42.png](https://qiita-image-store.s3.amazonaws.com/0/23276/78f059ff-5862-3dc0-1cb8-f3984f1e5e2e.png "スクリーンショット 2015-10-23 08.56.42.png")

横幅が100%に収まりきらなくなったbox3が改行されて表示されていますね。
これがカラム落ちです。

#### box3の幅を100%にしてみる

カラム落ちが発生した場合でも、落ちてしまったカラムの幅を100%に指定すればヨコ幅いっぱいに表示することができます。

```sass
.box1, .box2, .box3 {
  float: left;
  border-color: yellow;
  width: 50%;
}

.box3 {
  width: 100%;
}
```


![スクリーンショット 2015-10-23 09.00.13.png](https://qiita-image-store.s3.amazonaws.com/0/23276/d9c12acd-39c3-bad2-4753-3b68e3db7377.png "スクリーンショット 2015-10-23 09.00.13.png")

## 片方のボックスの横幅を固定するテクニック

今回は、box2とbox3を横並びにして、
box2の横幅を300pxに固定し、box3の横幅を可変にしてみたいと思います。

よく使う例では、横幅を可変にするボックスのfloatを解除し、横幅をautoにする方法です。

```sass
.box2 {
  float: left;
  border-color: yellow;
  width: 300px;
}

.box3 {
  float: none;
  border-color: yellow;
  width: auto;
}
```

![スクリーンショット 2015-10-23 09.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/23276/23eff232-b8a0-edd7-d7e4-22b66fca192b.png "スクリーンショット 2015-10-23 09.08.00.png")


こんな感じですね。
ブラウザの横幅を広げたり縮めたりするとbox3の横幅がぐいぐい動くと思います。

ただ、これだと実はbox3はbox2の後ろに入り込んでる形になっています。
確認するためには、box３の中に文字要素などをたくさん入れるとか、思い切りブラウザを縮めてみるとわかります。

![スクリーンショット 2015-10-23 09.09.59.png](https://qiita-image-store.s3.amazonaws.com/0/23276/64ef6373-a1ed-aaf7-8bde-bc19ba1541bc.png "スクリーンショット 2015-10-23 09.09.59.png")


こんな感じで、box3はbox2の後ろに入り込んでいるのです。

### box3をbox2の後ろに入り込まないようにする

方法は簡単で、box2の横幅がわかっているので、box3のmargin-leftを指定してあげれば良いだけですね。

```sass
.box3 {
  float: none;
  border-color: yellow;
  width: auto;
  margin-left: 300px;
}
```

![スクリーンショット 2015-10-23 09.11.39.png](https://qiita-image-store.s3.amazonaws.com/0/23276/244209fb-6197-72b8-1d89-d8c641e92cf5.png "スクリーンショット 2015-10-23 09.11.39.png")

box3の文字が大きすぎてはみ出しちゃってますが、
後ろに入り込まなくなっているのは確認出来ると思います。

## じゃあ、こんどはbox3(要は右側の要素)の横幅を固定してみます

まずはbox3の横幅を300pxに固定して、
box2の横幅を100%にしてみます。

```html
  <div class="box1">box1</div>

  <div class="boxA">
    <div class="box2">
      <p>
      box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2box2
      </p>
    </div>

    <div class="box3">box3</div>
  </div>

  <div class="box4">box4</div>
```

```sass
.box2 {
  /* 文字が大きすぎるとわかりづらいので小さく表示してます */
  line-height: 1.5;
  font-size: 14px;
  text-align: left;
  word-wrap: break-word;
    
  float: left;
  width: 100%;

}

.box3 {
  float: left;
  width: 300px;
}
```

![スクリーンショット 2015-10-27 20.01.32.png](https://qiita-image-store.s3.amazonaws.com/0/23276/97963cd6-d11f-fd51-688f-c9b600fc61cf.png "スクリーンショット 2015-10-27 20.01.32.png")


こんな感じになります。

#### box2とbox3を横並びにさせたい

ここで、box3の横幅は300pxで固定とわかっているので、box2に `margin-right: -300px` と指定して上げることで、box2とbox3を横並びにすることが出来ます。

```sass
.box2 {
  /* 文字が大きすぎるとわかりづらいので小さく表示してます */
  line-height: 1.5;
  font-size: 14px;
  text-align: left;
  word-wrap: break-word;
    
  float: left;
  width: 100%;
  margin-right: -300px;
}

```

![スクリーンショット 2015-10-27 20.03.41.png](https://qiita-image-store.s3.amazonaws.com/0/23276/177c9068-2028-7f1d-be2f-bfb0d18f503e.png "スクリーンショット 2015-10-27 20.03.41.png")

横並びにすることは出来たのですが、今度はbox2の文字がbox3に入り込んでしまっています。
そこで、box2にpadding-rightをとって見ます。

```sass
.box2 {
  /* 文字が大きすぎるとわかりづらいので小さく表示してます */
  line-height: 1.5;
  font-size: 14px;
  text-align: left;
  word-wrap: break-word;
    
  float: left;
  width: 100%;
  margin-right: -300px;
  padding-right: 300px;
}
```

![スクリーンショット 2015-10-27 20.08.32.png](https://qiita-image-store.s3.amazonaws.com/0/23276/6c439a0f-3898-3d2c-acae-00f3ec32f078.png "スクリーンショット 2015-10-27 20.08.32.png")

いい感じに出来ました。


## 実際にコーディングしてみる