No, questo non può essere fatto poiché opacityinfluisce sull'intero elemento incluso il suo contenuto e non c'è modo di alterare questo comportamento. Puoi aggirare questo problema con i due metodi seguenti.
Div. Secondario
Aggiungi un altro divelemento al contenitore per mantenere lo sfondo. Questo è il metodo più compatibile con tutti i browser e funzionerà anche su 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%;
}
Vedi il test case su jsFiddle
: before e :: before pseudo-elemento
Un altro trucco è usare gli pseudo-elementi CSS 2.1 :beforeo CSS 3 ::before. :beforepseudo-elemento è supportato in IE dalla versione 8, mentre lo ::beforepseudo-elemento non è supportato affatto. Si spera che questo venga risolto nella versione 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;
}
Note aggiuntive
A causa del tuo comportamento z-indexdovrai impostare uno z-index per il contenitore e un negativo z-indexper l'immagine di sfondo.
Casi test
Vedi il test case su jsFiddle: