Нет, это невозможно, так как opacityвлияет на весь элемент, включая его содержимое, и нет возможности изменить это поведение. Вы можете обойти это двумя следующими способами.
Вторичный div
Добавьте divв контейнер еще один элемент, чтобы удерживать фон. Это наиболее удобный для разных браузеров метод, который будет работать даже в 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%;
}
См. Тестовый пример на jsFiddle
: before и :: before псевдоэлемент
Еще одна уловка - использовать псевдоэлементы CSS 2.1 :beforeили CSS 3 ::before. :beforeпсевдоэлемент поддерживается в IE начиная с версии 8, а ::beforeпсевдоэлемент не поддерживается вообще. Надеюсь, это будет исправлено в версии 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;
}
Дополнительные примечания
Из-за поведения z-indexвам нужно будет установить z-index для контейнера, а также отрицательный z-indexдля фонового изображения.
Тестовые примеры
См. Тестовый пример на jsFiddle: