Para uma cor de plano de fundo semitransparente simples, as soluções acima (imagens CSS3 ou bg) são as melhores opções. No entanto, se você quiser fazer algo mais sofisticado (por exemplo, animação, vários planos de fundo etc.), ou se não quiser confiar no CSS3, tente a "técnica do painel":
.pane, .pane > .back, .pane > .cont { display: block; }
.pane {
position: relative;
}
.pane > .back {
position: absolute;
width: 100%; height: 100%;
top: auto; bottom: auto; left: auto; right: auto;
}
.pane > .cont {
position: relative;
z-index: 10;
}
<p class="pane">
<span class="back" style="background-color: green; opacity: 0.6;"></span>
<span class="cont" style="color: white;">Hello world</span>
</p>
A técnica funciona usando duas "camadas" dentro do elemento do painel externo:
- um (o "verso") que se ajusta ao tamanho do elemento do painel sem afetar o fluxo do conteúdo,
- e um (o "cont") que contém o conteúdo e ajuda a determinar o tamanho do painel.
O position: relative
painel no é importante; informa a camada traseira para ajustar ao tamanho do painel. (Se você precisar que a <p>
tag seja absoluta, altere o painel de a <p>
para a <span>
e envolva tudo isso em uma <p>
tag de posição absoluta .)
A principal vantagem dessa técnica sobre as similares listadas acima é que o painel não precisa ter um tamanho especificado; conforme codificado acima, caberá na largura total (layout normal do elemento de bloco) e apenas na altura do conteúdo. O elemento do painel externo pode ser dimensionado da maneira que desejar, desde que seja retangular (ou seja, o bloco embutido funcionará; o embutido simples não funcionará).
Além disso, oferece muita liberdade para o plano de fundo; você pode colocar realmente qualquer coisa no elemento back e não afetar o fluxo do conteúdo (se você quiser várias subcamadas em tamanho real, verifique se elas também têm posição: absoluta, largura / altura: 100%, e superior / inferior / esquerda / direita: automático).
Uma variação para permitir o ajuste de inserção de segundo plano (via parte superior / inferior / esquerda / direita) e / ou fixação de segundo plano (através da remoção de um dos pares esquerdo / direito ou superior / inferior) é usar o seguinte CSS:
.pane > .back {
position: absolute;
width: auto; height: auto;
top: 0px; bottom: 0px; left: 0px; right: 0px;
}
Como está escrito, isso funciona no Firefox, Safari, Chrome, IE8 + e Opera, embora o IE7 e o IE6 exijam CSS e expressões extras, IIRC, e na última vez que verifiquei, a segunda variação de CSS não funciona no Opera.
Pontos a observar:
- Os elementos flutuantes dentro da camada de contenção não serão contidos. Você precisará garantir que elas sejam limpas ou contidas de outra forma ou que escapem do fundo.
- As margens vão no elemento do painel e o preenchimento continua no elemento cont. Não use o oposto (margens no preenchimento ou preenchimento no painel) ou você descobrirá curiosidades como a página sempre sendo um pouco mais larga que a janela do navegador.
- Como mencionado, a coisa toda precisa ser em bloco ou em linha. Sinta-se livre para usar
<div>
s em vez de <span>
s para simplificar seu CSS.
Uma demonstração mais completa, mostrando a flexibilidade dessa técnica, usando-a em conjunto com display: inline-block
e com os auto
& width
s / s específicos min-height
:
.pane, .pane > .back, .pane > .cont { display: block; }
.pane {
position: relative;
width: 175px; min-height: 100px;
margin: 8px;
}
.pane > .back {
position: absolute; z-index: 1;
width: auto; height: auto;
top: 8px; bottom: 8px; left: 8px; right: 8px;
}
.pane > .cont {
position: relative; z-index: 10;
}
.debug_red { background: rgba(255, 0, 0, 0.5); border: 1px solid rgba(255, 0, 0, 0.75); }
.debug_green { background: rgba(0, 255, 0, 0.5); border: 1px solid rgba(0, 255, 0, 0.75); }
.debug_blue { background: rgba(0, 0, 255, 0.5); border: 1px solid rgba(0, 0, 255, 0.75); }
<p class="pane debug_blue" style="float: left;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left; display: inline-block; width: auto;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
<p class="pane debug_blue" style="float: left; display: inline-block; width: auto; min-height: auto;">
<span class="back debug_green"></span>
<span class="cont debug_red">
Pane content.<br/>
Pane content.
</span>
</p>
E aqui está uma demonstração ao vivo da técnica usada extensivamente: