Nie, nie można tego zrobić, ponieważ opacitywpływa na cały element, w tym na jego zawartość, i nie ma możliwości zmiany tego zachowania. Możesz obejść ten problem za pomocą dwóch następujących metod.
Wtórny div
Dodaj kolejny divelement do kontenera, aby utrzymać tło. Jest to metoda najbardziej przyjazna dla różnych przeglądarek i będzie działać nawet w 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%;
}
Zobacz przypadek testowy na jsFiddle
: before i :: before pseudo-element
Inną sztuczką jest użycie pseudoelementów CSS 2.1 :beforelub CSS 3 ::before. :beforepseudoelement jest obsługiwany w IE od wersji 8, podczas gdy ::beforepseudoelement w ogóle nie jest obsługiwany. Miejmy nadzieję, że zostanie to naprawione w wersji 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;
}
Dodatkowe uwagi
Ze względu na z-indextwoje zachowanie będziesz musiał ustawić indeks z dla kontenera, a także negatyw z-indexdla obrazu tła.
Przypadki testowe
Zobacz przypadek testowy na jsFiddle: