Colunas transparentes Cross Browser

Postado por: Pedro Rogério em

Colunas transparentes Cross Browser

Transparência é um efeito que, infelizmente, não têm obtido muito uso na web durante a sua história. Uma das maiores razões para isso é a falta de apoio para PNGs com canais alfa no IE6. Isso está começando a mudar com IE 7 e Firefox, ganhando mais e mais terreno nos sistemas Windows.

A maioria dos desenvolvedores web já deve estar ciente de que é possível utilizar PNGs com canais alfa, mas isso contempla vários problemas e não funciona muito bem quando você adiciona conteúdo em cima deles.

Existe uma maneira de tornar os conteúdos transparentes, usando a tag opacity e um código proprietário de opacidade para o Internet Explorer. O problema é como esta propriedade CSS se baseia, onde todos os filhos herdam a transparência também, que muitas vezes não é o efeito desejado.

Sabendo tudo isto, como vamos criar colunas transparentes que possam trabalhar em todos os navegadores? E se pudéssemos usar a propriedade de opacidade, mas ainda tem o conteúdo opaco?

Isso é possível utilizando algumas técnicas de posicionamento em CSS. O que vamos fazer é ter um elemento pai que contenha 2 filhos. Um fundo transparente que ocupa toda a largura e altura do pai, e um filho que contenha o conteúdo. Dessa forma podemos ter um fundo transparente, enquanto o conteúdo permanece opaco.

Vamos ao trabalho

A base da marcação que iremos utilizar é a seguinte:

<div id="column-1" class="container">
  <div class="overlay"></div>
  <div class="content">
    <h2>Content</h2>
  </div>
</div>

Em primeiro lugar queremos definir o emeneto container com position: relative; e float: left; isso permite-nos utilizar posicionamento absoluto e faz com que o elemento pai possa conter vários filhos.

#column-1 {
  position: relative;
  float: left;
  width: 500px; /* lembre-se de definir uma largura */
}

Agora vamos cuidar da transparência.

.overlay{
  position: absolute;
  top: 0; /* Necessário definir a posição */
  bottom: 0;  /* irá cobrir o elemento pai */
  left: 0;
  width: 100%;
  background: #000;
  opacity: 0.65;
  -moz-opacity: 0.65; /* Browsers baseados no motor Gecko */
  filter:alpha(opacity=65); /* Para IE6 e 7 */
}

Ok. Agora vamos aplicar algum estilo ao conteúdo. É importante definir alguma largura fixa.

#column-1 .content {
    width: 460px;
    padding: 20px;
}

Ok, quase tudo já foi feito. Como você deve ter notado (se você está me seguindo), o texto é colocado sob a cobertura transparente. Para corrigir isso, devemos definir o conteúdo com position: relative;

.content {
  position: relative;
}

Ok, agora ele funciona em todos os browsers exceto o IE6. Vamos corrigir isso. Digite o seguinte expressão CSS:

/* Faça o uso do hack * html para que só o IE6 entenda essa regra */
* html #column-1 .overlay {
  height: expression(document.getElementById("column-1").offsetHeight);
}

Se você planeja utilizá-lo em um site ativo, você pode utilizar conditional comments ao invés do kack estrela. Mas para este exemplo isso será suficiente.

Desvantagem

É também digno de nota que não vai funcionar no IE6 se o JavaScript estiver desativado. Outra desvantagem é que cada coluna tem seu próprio ID e sua própria regra CSS para IE6. Não podemos viver com isso.

Conclusão

E aí está! Aqui você pode ver um exemplo funcional. Colunas transparentes Cross Browser.

Esse post é uma tradução do post original do blog: Bits & Pixels.

Posts Relacionados

Confira também outros artigos interessantes postados aqui no blog.

Gostou desse post?

Assine o nosso Feed RSS, siga-nos no Twitter, ou simplesmente nos recomende a seus amigos!

Sobre Pedro Rogério

Pedro Rogério é desenvolvedor web por paixão, não saberia fazer melhor outra coisa. Além de escrever para o CSS no Lanche também escreve para o Pinceladas da Web, blog com assuntos gerais sobre desenvolvimento web.

10 Responses to “Colunas transparentes Cross Browser”

  1. Cara, muito bom. Tentei isto no passado, mas não consegui no IE6 não.

    Genial. Será muito útil. Um abração.

  2. Leonardo disse:

    Poxa, muito bom isso!

    Na boa, aquela parte de fazer a div ocupar a outra, mesmo com ela aumentando o tamanho foi muito boa.

    position: absolute;
    top: 0; /* Necessário definir a posição */
    bottom: 0; /* irá cobrir o elemento pai */
    left: 0;
    width: 100%;

    Não tinha pensado nisso!

    :)

  3. Dav7 disse:

    Boas!

    Só agora descobri este blog, e vou ler mais para ver se encontro a solução para o meu problema :(

  4. Neto disse:

    Valeu pela dica, já irei utilizar!!!

  5. Rafael Veloso disse:

    Muito bacana mesmo, e como vc falou, quem nunca sofreu com isso no ie6. Eu sempre falo e vou continuar falando, o importante não é saber e sim aonde encontrar.

    um abraço valeu pela dica.

  6. LeoCaseiro disse:

    Aproveita o embalo e posta uma técnica para deixar o PNG transparente no IE6!

    Vai ajudar bastante gente!

    Abs

  7. Zico disse:

    VLWWWWW.. era exatamente o q eu precisava

  8. battisti disse:

    E o CSS no lanche ajudando de novo um programadores PHP que não tem o menor talento com CSS!

    Valeu camarada!

  9. M. Ramos disse:

    Cara, salvou a pátria, valeu!

Leave a Reply