Não, isso não pode ser feito desde opacity
afeta todo o elemento, incluindo seu conteúdo, e não há como alterar esse comportamento. Você pode contornar isso com os dois métodos a seguir.
Div secundário
Adicione outro div
elemento ao contêiner para manter o plano de fundo. Este é o método mais compatível com vários navegadores e funcionará até mesmo no IE6.
HTML
<div class="myDiv">
<div class="bg"></div>
Hi there
</div>
CSS
.myDiv {
position: relative;
z-index: 1;
}
.myDiv .bg {
position: absolute;
z-index: -1;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: url(test.jpg) center center;
opacity: .4;
width: 100%;
height: 100%;
}
Veja o caso de teste no jsFiddle
: before e :: before pseudo-elemento
Outro truque é usar os pseudo-elementos CSS 2.1 :before
ou CSS 3 ::before
. :before
O pseudo-elemento é compatível com o IE a partir da versão 8, enquanto o ::before
pseudo-elemento não tem suporte. Esperamos que isso seja corrigido na versão 10.
HTML
<div class="myDiv">
Hi there
</div>
CSS
.myDiv {
position: relative;
z-index: 1;
}
.myDiv:before {
content: "";
position: absolute;
z-index: -1;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: url(test.jpg) center center;
opacity: .4;
}
Notas Adicionais
Devido ao comportamento de z-index
você terá que definir um índice z para o contêiner, bem como um índicez-index
para a imagem de fundo.
Casos de teste
Veja o caso de teste no jsFiddle: