Categorias

Arquivos

A propriedade que faltava

Postado em Julho 17th, 2007 por Alexandre Magno

CSS

Para quem trabalha com Float, as vezes há a necessidade de colocar o layout em uma DIV que podemos chamar de container. Ela é responsável por controlar mais duas divs que funcionam como uma coluna no Layout onde tudo se encaixa em uma estrutura simples e objetiva, como o Holy Grail (nome dado ao layout típico de um cabeçalho, três colunas).

O problema surge quando esse container não abriga as DIVs internas no Firefox quando se usa float, deixando layout como na figura abaixo:

Overflow Bug no Firefox

Nesta visualização, há um container amarelado(que não aparece), uma div cinza flutuando à esquerda, uma div azul claro flutuando à direita.

O código CSS está logo abaixo:

 
#container {
 
  width: 300px;
  height: auto;
  margin: auto;
  border: 1px solid black;
  background-color: #FFFFCC;
 
}
 
#esquerda {
 
  width: 100px;
  float: left;
  background-color: #CCCCCC;
  border: 1px solid red;
 
}
 
#direita {
 
  width: 196px;
  float: right;
  background-color: #CCCCFF;
  border: 1px solid gray;
 
}

Como a altura do container está escolhida para auto, ela deveria se comportar fechando em uma só box as caixas internas, mas ela fica quase inperceptível, se não fosse a borda de 1px que faz aparecer, mostrando-a como o Firefox interpreta de maneira errada, se você olhar no IE, verá algo do tipo:

Overflow Bug no Firefox

Desta vez não foi o IE que não se comportou da maneira esperada. Bem, se isto pode ser considerado um Bug, há contradições, pois muitos odeiam admitir que o Firefox falharia, mas o comportamento esperado seria este, pois a div container está com o código abaixo:

 
<div id="container">
<div id="esquerda">aqui ficará o conteúdo da esquerda</div>
<div id="direita">aqui ficará o conteúdo da direita</div>
</div>
 

Assim, se a div tivesse sido fechada logo após sua abertura, estaria certa a visualização do firefox.

Se a altura do Box "mestre" não for auto, ele irá se expandir até aquela altura, ou seja, você teria que colocar a altura do tamanho da maior página, o que seria uma solução problema, por que você teria que mudar toda vez este valor quando mais conteúdo é esperado.

E a solução?

Um simples propriedade deixa a visualização esperada no Firefox e não alterna nada no IE 6 e 7.

Apenas adicione a div que servirá como container overflow: auto e este box irá se expadir até o fim da div com maior altura se não for dada nenhuma margem.

Assim, o código do CSS do container ficará assim:

 
#container {	width: 300px;
 
 height: auto;
 
 margin: auto;
 
 border: 1px solid black;
 
 background-color: #FFFFCC;
 
 overflow: auto;
 
}

Sobre o overflow: auto

Esta propriedade que resolveu uma grande dor de cabeça tem a seguinte especificação na W3C:

Geralmente, o conteúdo de um box é geralmente confinado nos limites de conteúdo deste box. Em certos casos, este box pode "transbordar", significando que seu conteúdo fique parte ou completamente fora do box

Portanto, esta propriedade garante que o conteúdo irá contornar os boxs internos até seu final, não deixando nenhuma parte "sobrando".

Esta propriedade já deveria ser padrão no firefox, mas precisa ser especificada para funcionar como esperado. Ou seja, ela é precisa ficar explícita.

Esse é um grande problema, pois na maioria dos layouts este tipo de configuração precisa ser empregada.

No entanto, se não for bem calculada e planejada as dimensões, por esta propriedade estar explícita, ao ultrapassar os limites, o box que possui estar propriedade apresenta sua própria barra de rolagem para permitir que se chegue aos seus contornos. Portanto, cuidado na hora de usá-la. Sempre certifique-se que as dimensões estão corretas.

Espero mais uma vez ter sido útil e comentem, me diga se acham isto um bug, se já teve problemas com esta propriedade. Sintam-se a vontade para falar, afinal, estamos aqui para falar das soluções de problemas que nos pegam de surpresa na hora que caímos nos standards.


Comentários

Assine o RSS para comentários

isaac nathan comentou:

18th Julho, 2007 às 7:00 pm

colocar display:table na div #container

não fale assim do firefox ;(

abçs

admin comentou:

19th Julho, 2007 às 10:56 am

Muito boa sua saída para este problema. Mas o ideal seria não precisar de nada, vacilo do Firefox, afinal, ninguém é perfeito. Enquanto o Firefox dá uma dorzinha de cabeça, o IE dá uma grande enxaqueca…

tmferreira comentou:

19th Julho, 2007 às 12:10 pm

Bem legal isso, Alexandre.
Antes eu usava uma div “rodapé” (mesmo sem conteúdo) com clear: both.

Dá certo, mas é um elemento a mais sem necessidade.

admin comentou:

19th Julho, 2007 às 12:33 pm

Nisso eu não tinha pensado. Realmente cria um trabalho a mais. A dica do Isaac de usar display: table também é muito boa. Agora você tem duas opções. Abraço…

Micox comentou:

24th Julho, 2007 às 2:55 am

Grande solução.
Pra resolver esta parada aí já passei por 3 (que coincidentemente foram citadas aqui nos comments hehe):

1) display: table - não use, dá bugs às vezes.
2) elemento fantasma com clear both - não legal pois tem que mexer no HTML por conta de um efeito visual. Visual tem que ser só no CSS.
3) Esta solução que o chess postou para fazer o elemento fantasma via CSS e não via HTML -

Agora esta aqui acho que vai ser boa.

Micox comentou:

24th Julho, 2007 às 2:58 am

Ops. O opera não gostou muito não heheh
Mas tudo bem. É uma boa solução.

admin comentou:

24th Julho, 2007 às 10:19 am

Aê Micox, o Opera aceita esta propriedade sim, se apareceu a barra de rolagem, tente ajustar a largura, altura e padding, aplique uma borda só para ver se ela está ultrapassando, ao usar o Overflow: auto você tem que tomar cuidado com as dimensões… abraço…

TheChessMan comentou:

24th Julho, 2007 às 11:41 am

É mais uma alternativa, mas ainda prefiro a minha, que o micox citou aí em cima :P

Opera não se dá bem com overflow’s.

Isaac Nathan comentou:

6th Agosto, 2007 às 11:15 pm

Eu, pelo menos, nunca tive problema com display:table, depende da combinação de regras css que fez, alguns preferem umas, outros optam por outras que no final resultam na mesma, mas na hora de dar pau fazem a diferença. CSS tem muito mistério :S

Marcelo Alves comentou:

29th Outubro, 2007 às 5:27 pm

nossa, já tive q fazer malabarismos por causa desse problema. valeu pela dica

Mathias comentou:

13th Novembro, 2007 às 12:41 am

Valeu pela dica! Acabou de me livrar de uma dor de cabeça pq eu não queria mais usar o elemento fantasma e estava me batendo pra descobrir uma forma melhor de resolver o problema… funcionou bem pra mim no IE e Firefox… ainda não testei nos demais.

O display: table não funcionou muito legal mas não experimentei adaptar as demais propriedades e ver o efeito delas c/ esta propriedade…

Mais uma vez, obrigado à todos pelas dicas.
Abraços.

admin comentou:

13th Novembro, 2007 às 9:35 am

Que isso cara, estamos às ordens, este problema realmente atrapalha muito no desenvolvimento, é uma situação inesperada. Você planeja na teoria e na prática não dá certo. O CSS é cheio destes “truques” e infelizmente parece que vai ser assim por muito tempo ainda… um grande abraço…

Nathalie comentou:

24th Março, 2010 às 10:57 am

Parabens pela iniciativa!
Me ajudou bastante com esse post, muito obrigado mesmo!
Ficarei no aguardo de novos posts, pq sempre é bom uma informação útil como essa!
Abraço

Alexandre Magno comentou:

24th Março, 2010 às 2:16 pm

@Nathalie: fico feliz que tenha ajudado! Com certeza virão novos posts…

Deixe seu comentário

Os seguintes campos estão incorretos ou faltando

  • Listagem dos campos faltando
(Não será publicado) * Campos obrigatórios