desenvolvimento para web

CSS float: considerações, dicas e macetes para bons layouts na web

Entender o correto funcionamento e a dinâmica da propriedade CSS “float” é fundamental para o desenvolvimento e estruturação de bons layouts para web. Saber usar corretamente float em web sites e projetos web, em geral, é de extrema importância, já que, basicamente, é através das regras CSS que utilizam float que é possível compor layouts sem o uso de tabelas (tableless), o que traz inúmeros benefícios, como economia no tempo de carregamento, adequação às normas W3C e, consequentemente, um aumento de performance, em geral.

Este é um artigo traduzido do original “All About Floats“, do blog CSS-Tricks, e a tradução foi feita com autorização do autor.

O que é “Float”?

Float é uma propriedade CSS de posicionamento. Se você está familiarizado com projetos para mídia impressa, você pode pensar, de forma semelhante, numa imagem em um layout onde o texto a circunda quando necessário.

Exemplo de Float Left e Float Right em uma página da web.

No design para web, uma imagem inserida continua a fazer parte do fluxo da página. Isto significa que, se forem feitas alterações no tamanho ou se elementos ao seu redor mudarem, a página irá automaticamente ser reajustada (“reflow“). Isso difere da página onde os elementos são posicionados de forma absoluta. Elementos posicionados de forma absoluta são removidos do fluxo da página web. Elementos posicionados absolutamente não afetarão quaisquer outros elementos da página, quer estes estejam em contato, ou não.

Para que são usados os floats?

Além de simples exemplos, como posicionar uma imagem ao lado de um bloco de texto, floats são usados para criar layouts para web.

Layout web feito com floats.

Floats são igualmente úteis para layouts de pequenas instâncias. Veja, por exemplo, esta parte de uma web page:

Exemplo de trecho de web site usando floats.

Esses tipos de layouts podem ser manipulados usando posicionamento absoluto dentro de posicionamento relativo, mas elementos que flutuam (propriedade CSS “float”) são mais flexíveis. Vamos supor que o tamanho da imagem de um avatar precise ser alterado. Com floats, o box pode ser reestruturado para acomodar um tamanho maior, enquanto um posicionamento absoluto criaria problemas:

Trecho de layout web com posicionamento absoluto.

Problemas com floats

Floats são frágeis”. Eles são cheios de “contratempos” e cross-browser quirks. Talvez o mais significativo seja a necessidade de “limpar” floats (propriedade CSS “clear”) em algumas situações. Primeiro, vejam alguns exemplos de porque alguns floats precisam ser “limpos” e, depois, como fazer esta “limpeza”.

Arrumar o float para ajustar a altura do elemento pai

Elementos que contêm elementos float não calculam sua altura como é de se esperar. De fato, se o elemento pai contém apenas elementos flutuadores, navegadores vão renderizar a altura em zero (como se fosse “height:0“).

Elemento pai com tilte.

Se você der um “clear” antes de fechar a tag do elemento pai, você conserta isso.

Elemento pai com float correto.

Limpar o float para começar uma nova linha

Vamos dizer que você tem uma série de elementos flutuantes.

Série de floats.

Então, digamos que você quer criar uma pausa nesta grade de elementos, a fim de iniciar uma nova linha. Porque, você sabe, iss faz sentido apenas visualmente falando.

Série de floats com clear left.

Dando “clear” somente à esquerda ou à direita

Os dois exemplos acima são exemplos genéricos de como fazer o uso de “clear” para fazer a “limpeza”, ou seja, dar clear tanto à direita, quanto à esquerda. Porque floats podem ser tanto à direita, como à esquerda, e você pode, evidentemente, dar um float somente à esquerda ou somente à direita. Isso pode ser útil quando fazer a limpeza de ambos os lados (“clear:both“) seja problemático.

Exemplo de uso de Float Right e Clear Right.

Se tivesse sido dado um clear em ambos os lados (“clear:both“) no exemplo acima, a segunda imagem teria sido empurrada para baixo, onde termina o bloco de texto.

Diferentes técnicas de clear

Assim como tudo em CSS, há mais de um jeito para fazer isso.

Usando “clear” exatamente onde você precisa

A propriedade CSS “clear” faz exatamente o que “diz na caixa”. O problema reside em onde e como aplicar um elemento à página com a propriedade clear correta.

Esta técnica é maravilhosa, já que ela funciona bem sem a necessidade de códigos supérfluos. No entanto, ela às vezes falha em sites dinâmicos. E se, por exemplo, você teve que acrescentar um novo elemento de página acima do rodapé e, consequentemente, abaixo dos outros conteúdos da página? Agora você precisaria dar um clear neste elemento ao invés de no rodapé. Muitas vezes é mais fácil pensar sobre onde é preciso dar um clear ao invés de em qual elemento é preciso dar um clear.

O método da DIV vazia:

...parte de elemento flutuante.
</div>
 
<div class="clear"></div>
 
<p> ... ahhhh, recebi um "clear"! </p>

CSS:

div.clear { clear: both; }

“overflow:auto” no elemento pai

É difícil explicar o motivo, mas a aplicação da propriedade CSS “overflow:auto” no elemento pai fará com que sua altura seja calculada corretamente. Ele irá se expandir para englobar os elementos flutuadores (floats) ao invés de “dar pau”. Isso pode ser muito útil e é muito “limpo”, mas tem alguns inconvenientes. O maior deles é que, frequentemente, não faz sentido usar a regra CSS no elemento pai. Pense nas vezes em que você precisa dar um clear em vários elementos que têm um elemento pai em comum; nesse caso, isso não vai ajudá-lo.

Outro problema é que você pode querer usar a propriedade “overflow” para outros fins. E se você quiser esconder o overflow de uma div, em especial? Você não pode. Você terá que englobar a div com outra div para conseguir isso.

O hackclearfix” (dar o clear com a pseudo-classe “:after”)

Embora antigo, o artigo do positioniseverything sobre como usar uma pseudo-classe CSS para dar o clear ainda é válido. Explicando rapidamente, a técnica consiste em adicionar um pouco de conteúdo depois do elemento. Este pouco de conteúdo (um espaço, geralmente) é que faz o clear funcionar, mas fica oculto do visitante.

Aqui está um código, aplicado em uma classe CSS para qualquer elemento que precise de um clear:

/* This needs to be first because FF3 is now supporting this */
.clearfix {display: inline-block;}
 
.clearfix:after {
content: " ";
display: block;
height: 0;
clear: both;
font-size: 0;
visibility: hidden;
}
 
/* Hides from IE-mac \*/
* html .clearfix { height: 1%; }
.clearfix { display: block; }
/* End hide from IE-mac */

O artigo citado alerta que a técnica já está ficando velha e fala sobre “overflow:auto“. Eu não compartilho da opinião de que a técnica está ficando ultrapassada. Esta é completamente diferente da outra técnica de overflow. Com a “clearfix“, você aplica a classe no próprio elemento, não no elemento pai. Isso significa que você pode usá-la mesmo quando não se trata de um elemento pai, isto significa que poderá continuar a usá-la, ainda que não exista um elemento pai que faça sentido, e aplicá-la pensando onde o elemento com float precisa de um clear.

Outro problema com float: empurrões para baixo (“pushdown“)

Esta questão merece uma atenção especial, porque frequentemente as pessoas têm problemas com questões de “empurrões”. Olhando novamente o exemplo dado no início deste artigo, a div do conteúdo principal flutua à esquerda da div da barra lateral. Esta é uma estrutura comum em muitos blogs.

Quer sejam elementos fixos ou fluidos, ambas as DIVs têm uma largura especificada. Eles supostamente comportam-se como elementos flutuantes, ou seja, se um elemento dentro da área do conteúdo principal tem a largura maior que toda esta área (por exemplo, uma imagem muito larga) ele simplesmente se extende através e cobre qualquer coisa que esteja “no caminho”. A forma como o IE6 trata isso é bem diferente. Se um elemento tem a largura maior que a de seu elemento pai, no IE6 a barra lateral vai ser simplesmente empurrada para baixo (“pushdown“), quebrando completamente o layout.

Pushdown de div no IE6.

A solução? A melhor solução é não colocar elementos com largura maior que a de seu elemento pai. Para se protejer melhor, e se seu layout funciona de outra forma (não especifique alturas!), você pode trabalhar com “overflow:hidden” para esconder algo que seja preciso. Ainda há outra solução, que seria usar posicionamento absoluto para posicionar a barra lateral mais à direta. Lembre-se, entretanto, que posicionamento absoluto retira o elemento do fluxo da página – algo para se levar em consideração.

Há algum tempo saiu no A List Apart um artigo sobre fazer um “falso” posicionamento absoluto, Faux Absolute Positioning, que é uma leitura interessante e aborda uma nova técnica de layout que traz inúmeros benefícios do posicionamento absoluto, conservando o fluxo da página e não indo de encontro à “fragilidade” dos elementos com float.

“Quirks” sobre elementos float

Outra coisa para se lembrar quando se lida com IE6 é que, se você aplicar uma margem (CSS “margin”) no mesmo sentido que o float (“left” ou “right”), ela deve ser o dobro da margem.

Para o IE7, existe um pequeno truque sobre sua maneira peculiar de não respeitar margens inferiores (CSS “margin-bottom”) em elementos filhos dentro de objetos flutuantes.

39 interações em "CSS float: considerações, dicas e macetes para bons layouts na web"

  1. Gevã Schaefer12/07/2008 

    Parabéns por este mega-artigo Tárcio! Meus alunos vão adorar!

  2. Paulo Faustino13/07/2008 

    Excelentes ensinamentos Tárcio. Fantástico artigo amigão! :D

  3. Tárcio Zemel14/07/2008 

    @ Gevã Schaefer

    Legal, Gevã! Depois me conta o que eles acharam! ;-)

    @ Paulo Faustino

    Muito obrigado, Paulo, mas os créditos vão para o Chris Coyier; eu só traduzi… rsrs… Abraços!

  4. Cayo Medeiros aka. y14/07/2008 

    Grande tutorial e parabéns pelo blog; é realmente muito bom. ^^

    Abraços!

  5. Tárcio Zemel15/07/2008 

    @ Cayo Medeiros aka. yogodoshi

    Obrigado pelos elogios e pela referência que fez ao desenvolvimento para web em seu blog! Assinei o feed do blog do yogodoshi para "trocarmos figurinhas"! ;-)

    Abraços!

  6. bfms22/07/2008 

    Bom artigo :)

    Estou a par do assunto e trabalho neste tema. Achei que para quem está por fora e não percebe muito do assunto, facilmente ficará mais culto com este post, parabéns :)

  7. Tárcio Zemel23/07/2008 

    @ bfms

    Muito obrigado pelas considerações, Bruno! Realmente foi minha intenção ajudar ao traduzir este excelente artigo sobre CSS floats.

    Grande abraço a apareça!

  8. Patrick03/08/2008 

    to com problemas no meu site relativo a posicionamento. Se puder me ajudar ficarei grato.

  9. Tárcio Zemel03/08/2008 

    @ Patrick

    Oi, tudo bem? Qual o problema que você está, colega?

  10. Pedro Rogério06/10/2008 

    Muito bom o artigo, tenho que tirar o chapéu pra você!!!

  11. Tárcio Zemel06/10/2008 

    @ Pedro Rogério

    Muitíssimo obrigado pela consideração, Pedro!

    Abraços e obrigado pela audiência! ;-)

  12. McJ HD06/11/2008 

    Mano, essas esplicações são foda mesmo!!!

    Esclareceram muitas de minhas dúvidas.

    Valeu!!!

  13. gadarf21/04/2009 

    Legal, comigo só funcionou usando um div vazio para dar o clear. O bug explorer 6 é complicado.

  14. Tárcio Zemel22/04/2009 

    @ McJ HD

    Que bom que as informações foram de serventia! Abraços!

    @ gadarf

    O importante é que deu certo! IE6 realmente é problemático… Por isso aderi à Campanha Atualize seu Navegador! :-D

  15. wmontoza03/08/2009 

    Muito bom artigo, me tirou muitas duvidas.

    "Bom navegador" "IE 6…"

    Hilariante

  16. Tárcio Zemel03/08/2009 

    @ wmontoza

    Que bom que lhe foi útil! Volte sempre! ;-)

  17. Rodrigo28/08/2009 

    Muito bom artigo, o melhor que já li sobre float. Parabéns!

  18. Tárcio Zemel28/08/2009 

    @ Rodrigo

    Obrigado, Rodrigo! Que bom que gostou da tradução que fiz; realmente o artigo é excelente! Assine o feed do desenvolvimento para web que em breve outros bons artigos vão vir! ;-)

    Abraços!

  19. Gustavo03/11/2009 

    Bom texto!

  20. Isabel29/12/2009 

    Parabéns pelo artigo!! Era exatamente o que eu estava procurando. Estou iniciando no ramo e estava com muitas dificuldades em posicionar o layout do site, mas agora com tuas dicas, acho que vou conseguir resolver o problema.

    Abraços

  21. Tárcio Zemel30/12/2009 

    @Gustavo, @Isabel

    Obrigado! Que bom que gostaram, espero que seja útil e voltem sempre!

  22. Alexandre Broggio29/01/2010 

    Bem interessante o artigo vlw

  23. Daniela30/06/2010 

    Excelentes explicações! Me ajudou muito!

    Abraço,

  24. Tárcio Zemel01/07/2010 

    @ Alexandre Broggio,

    @ Daniela

    Que bom que o artigo foi útil! Aguardo vocês nos próximos artigos! ;-)

  25. Aldo06/08/2010 

    Muito boas as dicas. Serão de grande valia.

    Técnicas de CSS são sempre bem vindas.

    Valeu meu caro!

  26. Danilo Ramos22/10/2010 

    Cara, muitas vezes tinha esse problema do item 3.1, mas me explica uma coisa, como assim dar um “clear”? isso é um valor CSS ?

  27. Tárcio Zemel24/10/2010 

    Eu é que agradeço pela participação! Abraços!

  28. Tárcio Zemel24/10/2010 

    Na verdade, o "clear" é uma propriedade do CSS. Dê uma olhada na documentação oficial do W3C sobre o clear que você vai entender, melhor! :-)

  29. Tárcio Zemel23/11/2010 

    Que bom que gostou! Se tiver sugestões para outros artigos, basta sugerir. Abraços!

  30. Deives28/01/2011 

    Eai, muito bom o artigo !

    Vc mencionou o problema "empurrada para baixo"… já faz um tempo que utilizo "CSS Reset" incluindo uma classe "clearfix", mas do nada os elementos que recebem essa classe passaram a colocar um espaçamento branco abaixo (margem? sei lá…)

    Verifiquei se os elementos encontrados dentro do elemento pai estão com uma largura inferior e estão, a maioria nem tem largura especificada… alguém sabe mais sobre esse problema?

    Agradeço,
    Vlw!

  31. Tárcio Zemel04/02/2011 

    Só vendo as regras deste arquivo juntamente com as regras utilizadas nas demais CSSs que estão sendo usadas, realmente não é um trabalho rápido… De qualquer maneira, você pode tentar sobreescrever algumas regras para fazer funcionar.

    Abraços!

  32. Clã Celestial Blog30/10/2011 

    Legal, artigo muito completo.

  33. Cristiano R. Braga16/01/2012 

    Simples , mas necessário. Parabéns.

Comente!

O ideal é uma interface bonita e funcional, porém é melhor ter uma interface feia e funcional do que uma bonita não funcional.

Francis Rosário