CSSにおける2カラムレイアウトの構成

次のような2カラムレイアウトを作成してみましょう:

まずはページの基本構造を作成します:

html<div id="wrapper">
  <div id="header">
    header
  </div>
  <div id="container">
    <div id="content">
      content
    </div>
    <div id="sidebar">
      sidebar
    </div>
  </div>
  <div id="footer">
    footer
  </div>
</div>

次に、ラッパーにスタイルを適用して画面中央に配置します:

css#wrapper {
  width: 1000px;
  margin: 30px auto;
  border: 1px solid black;
}

次に、ヘッダーとフッターのスタイルを設定します:

css#header {
  height: 200px;
  border: 1px solid black;
}
#footer {
  height: 200px;
  border: 1px solid black;
}

ご覧の通り、ヘッダーとフッターに高さを設定しています。 これは、このレイアウトではコンテンツがないためです。 コンテンツがある場合は、高さを設定すべきではありません - 高さはコンテンツによって形成されます。

また、幅を設定していない点にも注意してください。 ヘッダーとフッターはブロック要素であるため、 幅は自動的にラッパーの幅と同じになります。

次に、テキストが境界に接しないように paddingを設定しましょう:

css#header {
  height: 200px;
  padding: 20px;
  border: 1px solid black;
}
#footer {
  height: 200px;
  padding: 20px;
  border: 1px solid black;
}

しかし、paddingがあると、ブロックのサイズに悪影響を及ぼします - 指定したサイズよりも大きくなってしまいます。 すべてのブロックの動作を変更して、paddingと境界線が ブロックを拡張しないようにしましょう:

css* {
  box-sizing: border-box;
}

次に、コンテンツとサイドバーを同じ行に配置する必要があります。 フレックスボックスを使用して実現しましょう:

css#container {
  display: flex;
}

コンテンツとサイドバーに幅を指定します。 この時、それらの幅の合計はラッパーの幅と等しくなければなりません:

css#content {
  width: 800px;
}
#sidebar {
  width: 200px;
}

サイドバーとコンテンツの間に余白を作りたいとします。 この場合、サイドバーにmarginを設定する必要があります。 そのためには、誰かからこのmargin用の幅を削る必要があります。 コンテンツから削り、それに応じてコンテンツの幅を減らしましょう:

css#content {
  width: 780px;
}
#sidebar {
  width: 200px;
  margin-right: 20px;
}

次に、要素にコンテンツがないため、高さを追加しましょう。 一つの要素に高さを追加するだけで十分です。 なぜなら、もう一方のフレックス要素は高さに合わせて調整されるからです(なぜでしょう?)。 コンテンツに高さを設定しましょう:

css#content {
  width: 780px;
  height: 700px;
}
#sidebar {
  width: 200px;
  margin-right: 20px;
}

コンテンツとサイドバーに残りのスタイルを追加しましょう:

css#content {
  width: 780px;
  height: 700px;
  padding: 20px;
  border: 1px solid black;
}
#sidebar {
  width: 200px;
  margin-right: 20px;
  padding: 20px;
  border: 1px solid black;
}

以上で、レイアウトは完成です。すべてのコードをまとめましょう:

html<div id="wrapper">
  <div id="header">
    header
  </div>
  <div id="container">
    <div id="sidebar">
      sidebar
    </div>
    <div id="content">
      content
    </div>
  </div>
  <div id="footer">
    footer
  </div>
</div>
css* {
  box-sizing: border-box;
}

#wrapper {
  width: 1000px;
  margin: 30px auto;
  border: 1px solid black;
}
#header {
  height: 200px;
  padding: 20px;
  border: 1px solid black;
}
#container {
  display: flex;
}
#content {
  width: 780px;
  height: 700px;
  padding: 20px;
  border: 1px solid black;
}
#sidebar {
  width: 200px;
  margin-right: 20px;
  padding: 20px;
  border: 1px solid black;
}
#footer {
  height: 200px;
  padding: 20px;
  border: 1px solid black;
}
Задание 1
Задание 2