Layout de duas colunas para site em CSS

Vamos criar um layout de duas colunas do seguinte tipo:

Para começar, vamos criar a estrutura básica da página:

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>

Agora vamos aplicar estilos ao wrapper, alinhando-o ao centro da tela:

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

Agora vamos definir os estilos do header e do footer:

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

Como você pode ver, estamos definindo uma altura para o header e o footer. Fazemos isso porque, no nosso esquema, eles não têm conteúdo. Se houvesse conteúdo, não seria necessário definir a altura dos blocos - ela seria formada pelo seu conteúdo.

Note também que não estamos definindo a largura para eles. Isso acontece porque o header e o footer são elementos de bloco e sua largura será automaticamente igual à largura do wrapper.

Vamos agora adicionar padding a eles, para que o texto não fique colado nas bordas:

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

No entanto, a presença do padding afetará negativamente os tamanhos dos blocos - eles ficarão maiores do que o especificado. Vamos mudar o comportamento de todos os blocos para que o padding e as bordas não expandam nossos blocos:

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

Agora precisamos colocar o conteúdo e a sidebar na mesma linha. Vamos fazer isso usando flexbox:

css#container {
  display: flex;
}

Vamos especificar a largura do conteúdo e da sidebar. A soma de suas larguras deve ser igual à largura do wrapper:

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

Suponha que queremos criar um espaçamento entre a sidebar e o conteúdo. Neste caso, precisamos aplicar um margin à sidebar. Com isso, teremos que "arrancar" a largura desse margin de algum lugar. Vamos "arrancar" do conteúdo, reduzindo correspondentemente sua largura:

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

Agora vamos adicionar altura, já que nossos elementos não contêm conteúdo. É suficiente adicionar altura apenas a um elemento, pois o segundo elemento flex se ajustará em altura (por quê?). Vamos definir a altura para o conteúdo:

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

Vamos adicionar os estilos restantes ao conteúdo e à sidebar:

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

Pronto, nosso layout está finalizado. Vamos juntar todo o código:

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