Tutorial de CSS > Criando um layout com CSS a partir do zero > Parte 6

6. Floats


Floats (flutuadores) pode ser um conceito enganoso para fazer você perder a cabeça. Basicamente um float é um elemento que é alinhado contra os lados esquerdo ou direito do seu contêiner. Para maiores detalhes, leia maxdesigns in depth introduction to floats. (em inglês).

No caso deste website, nós vamos fazer flutuar (float) nossa div#sidebar-a à direita, com a largura de 280px. Adicione o seguinte à sua CSS:

        #sidebar-a {
            float: right;
            width: 280px;
            background: darkgreen;
        }

Você agora fez flutuar com sucesso sua primeira div, e você agora deve ter uma página que se parece com isso:

Clique para aumentar

Somente para o propósito de testes, substitua o texto do conteúdo da div para o seguinte:

        <div id="content">
            Lorem ipsum dolor sit amet, consectetuer 
            adipiscing elit. Nullam gravida enim ut risus. 
            Praesent sapien purus, ultrices a, varius ac, suscipit ut, enim. 
            Maecenas in lectus. Donec in sapien in nibh rutrum gravida.
            Sed ut mauris. Fusce malesuada enim vitae lacus euismod vulputate.
            Nullam rhoncus mauris ac metus.
            Maecenas vulputate aliquam odio. Duis scelerisque justo a pede. 
            Nam augue lorem, semper at, porta eget, placerat eget, purus. 
            Suspendisse mattis nunc vestibulum ligula.
            In hac habitasse platea dictumst.
        </div>

Note que o texto rola no conteúdo da div flutuante, como visto abaixo:

Clique para aumentar

Mas isto não é o que nós queremos. Nós queremos que o conteúdo da div seja distribuído através da div sidebar, a qual tem seu lado direito contra o lado esquerdo da barra lateral.

Um jeito fácil de conseguir isto num layout flutuante como esse, é colocar uma margem direita na nossa div content que tenha a mesma largura de nossa barra lateral, nesse caso 280px. Isto vai empurrar o canto direito do conteúdo fora do canto direito do page-container.

        #content {
            margin-right: 280px;
            background: green;
        }

Ótimo, nós quase conseguimos fazer nosso layout flutuante funcionar. Mas há uma coisa a mais que devemos considerar... O que acontece se a div sidebar ficar mais alta que a div content?

Vamos ver. Copie e cole este texto na div sidebar:

        <div id="sidebar-a">
            Lorem ipsum dolor sit amet, consectetuer 
            adipiscing elit. Nullam gravida enim ut risus. 
            Praesent sapien purus, ultrices a, varius ac, suscipit ut, enim. 
            Maecenas in lectus. Donec in sapien in nibh rutrum gravida.
            Sed ut mauris. Fusce malesuada enim vitae lacus euismod vulputate.
            Nullam rhoncus mauris ac metus.
            Maecenas vulputate aliquam odio. Duis scelerisque justo a pede. 
            Nam augue lorem, semper at, porta eget, placerat eget, purus. 
            Suspendisse mattis nunc vestibulum ligula.
            In hac habitasse platea dictumst.
        </div>
Clique para aumentar

Isto não é o que queremos, afinal. A razão do rodapé não ter se movido pra baixo é porque a sidebar está "flutuada" à direita.

Explicação: Por padrão, qualquer elemento flutuante não empurrará para baixo elementos que estejam abaixo deles. Isto por que elementos flutuantes não são considerados parte do "fluxo" do documento. É como se eles estivessem em uma outra camada, "flutuando" acima dos outros elementos, e por causa disso não podem afetar suas posições.

E o que nós podemos fazer para contornar este problema? Introduzir a propriedade clear da CSS.

Adicione isto à sua folha-de-estilos:

        #footer {
            clear: both;
            background: orange;
            height: 66px;
        }

Quando um elemento tem sua propriedade clear atribuída, se ele entrar em contato com um elemento flutuante, ele é colocado exatamente abaixo de onde o flutuante termina. Você pode especificar se ele é afetado somente por flutuadores esquerdos ou direitos, neste caso nós poderíamos utilizar tanto right ou both. Nós vamos utilizar clear: both somente por segurança.

Clique para aumentar