Cross-browser PNG background
Muitas vezes temos problemas para implementar transparência (PNG ou filtro de transparência) com sucesso em todos os browsers sem muita dor de cabeça. Reuni aqui uma forma que acredito seja eficaz porque está tudo no mesmo CSS e não precisa de JavaScript.
O CSS
#box {
background-image: url(../img/boxBg.png) !important;
background-image: none;
filter: none !important;
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader
(src='img/boxBg.png',sizingMethod='scale');
position: static;
}
O HTM
<div id="box">
<p>Conteúdo aqui</p>
</div>
Supondo que você trabalhe com a seguinte árvore de diretórios:
/css/box.css
/img/boxBg.png
/index.htm
Vamos analisar cada linha do CSS:
background-image: url(../img/boxBg.png) !important;- Define a imagem de fundo do elemtento, no caso o div, e o
!importantdefine que esta linha é a definição debackground-imageque vai prevalecer sobre todas as outras declarações desse atributo. Note que o Internet Explorer (IE) 6.0 e anteriores ignora o!importantse tiver alguma declaração do mesmo atributo depois dessa linha.
O caminho da imagem quando você usa ela em um .css nobackground-imageé relativo ao arquivo .css. background-image: none;- Filtro para o IE 6.0 e anteriores. Como ele ignora o
!importantda linha acima ele não vai mostrar a imagem de fundo no elemento. filter: none !important;- O, recém lançado, IE 7.0 já trabalha com o comportamento padrão do
!importantno CSS. Se não existir essa linha, ele vai renderizar dois PNG’s um sobre o outro, já que essa nova versão já tem suporte para PNG de 24bits. filter: progid:DXImageTransform.Microsoft.AlphaImageLoader
(src='img/boxBg.png',sizingMethod='scale');- Mais uma linha para IE 6.0. Ele vai ignorar o
!importantda linha anterior e vai usar o filtro para exibir o PNG com todos os níveis de transparência.
O caminho da imagem quando você usa ela em um .css nofilteré relativo à página que você está chamando.
No filtroAlphaImageLoadervocê têm três opções para o atributosizingMethod:sizingMethod='image'- mantém a imagem do tamanho original, ele “estoura” o tamanho do elemento se a imagem for maior que elesizingMethod='scale'- redimensiona a imagem pra caber dentro do elemnto, distorcendo ela se for necessáriosizingMethod='crop'- corta a imagem do tamanho do elemento
position: static;- Quando o IE 6.0 aplica o filtro, ele renderiza todo o conteúdo e o elemtento fica “chapado” como se fosse uma imagem. Links (a), campos de formulário (input) e outros elementos, perdem o seu comportamento padrão e os eventos não funcionam para o elemento. Para resolver esse problema usamos
position: static;que contorna essa falha de renderização. Se for necessário posicionar o elemento na tela vai ser necessário colocá-lo dentro de um container (div) e este elemento “pai” pode ter a posição absoluta ou relativa na tela.
Essa solução tem se mostrado ideal nos projetos que tenho trabalhod. Foi testado no Firefox 1.5, Internet Explorer 5.5; 6.0; 7.0 e Opera 9.0, todos rodando Windows XP. Fico agradecido se alguém conseguir testar em outros sistemas operacionais, pricipalmente Macintosh.
Daniel Racca said,
December 18, 2006 @ 16:00
Olá amigo, eu testei aqui e não funcionou..
Se copio e colo o código no IE simplesmente não amostra fundo algum.
Ou se apresento apenas o background e o filter, ele até aparece o fundo mas com aquele bom e velho verde-claro do IEca.
Tem como você fazer um exemplo pra min?
Desde já agradeço! Se sua técnica der certo, todos meus problemas acabaram!
thiago freitas said,
February 7, 2007 @ 13:58
Olá!!! Mto obrigado pela ajuda!!! Quebrou uma árvore!!! Mas tenho um problema: mesmo utilizando o atributo “position:static” os links, botões e inputs ficam inacessíveis.
Alguma sugestão?
nuno neves said,
September 11, 2007 @ 13:24
boas! eu tambem testei e não consigo ter acesso aos elementos do div (mesmo com a técnica “position: static;”.
Existe alguma outra técnica que se possa usar?
Lucas Pedroza said,
April 8, 2008 @ 00:29
Funciona!!!!
Ao contrário dos Crtls-Cs e Crtls-Vs, que comentaram o meu funcionou…amanhã vou testar no IE 7, se não funcionar vai tomar pedala…hahaha
Abs
Carlos Soler said,
May 9, 2008 @ 16:07
Funciona mesmo!
Só podia ser uma dica do programador sensível!
Abraço!