Установите непрозрачность фонового изображения, не затрагивая дочерние элементы.

Можно ли установить непрозрачность фонового изображения, не влияя на непрозрачность дочерних элементов?

Пример

Все ссылки в нижнем колонтитуле нуждаются в специальной марке (фоновое изображение), а непрозрачность настраиваемой пули должна быть 50%.

HTML

<div id="footer">
    <ul>
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
        <li><a href="#">Link 3</a></li>
        <li><a href="#">Link 4</a></li>
        <li><a href="#">Link 5</a></li>
    </ul>
</div>  

CSS

#footer ul li {
    background: url(/images/arrow.png) no-repeat 0 50%;
}  

Что я пробовал

Я попытался установить непрозрачность элементов списка на 50%, но затем непрозрачность текста ссылки также составляет 50% - и, похоже, непрозрачность дочерних элементов не представляется reset:

#footer ul li {
    background: url(/images/arrow.png) no-repeat 0 50%;
    /* will also set the opacity of the link text */        
    opacity: 0.5;
}

Я также пытался использовать rgba, но это не влияет на фоновое изображение:

#footer ul li {
    /* rgba doesn't apply to the background image */
    background: rgba(255, 255, 255, 0.5) url(/images/arrow.png) no-repeat 0 50%;
}

Ответ 1

Возьмите изображение в редактор изображений, уменьшите непрозрачность, сохраните его как .png и используйте это вместо.

Ответ 2

Это будет работать с каждым браузером

div {
 -khtml-opacity:.50; 
 -moz-opacity:.50; 
 -ms-filter:"alpha(opacity=50)";
  filter:alpha(opacity=50);
  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
  opacity:.50; 
}

Если вы не хотите, чтобы прозрачность влияла на весь контейнер и его детей, проверьте это обходное решение. У вас должен быть абсолютно позиционированный ребенок с относительно позиционированным родителем.

Проверьте демоверсию http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/

Ответ 3

Если вы используете изображение в качестве пули, вы можете рассмотреть: перед псевдоэлементом.

#footer ul li {
}

#footer ul li:before {
    content: url(/images/arrow.png);
    filter:alpha(opacity=50);
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
    opacity:.50;
}

Ответ 4

Вы можете использовать CSS linear-gradient() с rgba().

div {
  width: 300px;
  height: 200px;
  background: linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.5)), url("https://i.imgur.com/xnh5x47.jpg");
}
span {
  background: black;
  color: white;
}
<div><span>Hello world.</span></div>

Ответ 5

Вы можете поместить изображение в div: after или div: before и установить непрозрачность на этом виртуальном div

div:after {
  background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/owl1.jpg);
  opacity: 0.25;
}

найдено здесь http://css-tricks.com/snippets/css/transparent-background-images/

Ответ 6

#footer ul li {
  position: relative;
  opacity: 0.99;
}

#footer ul li::before {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -1;
  background: url(/images/arrow.png) no-repeat 0 50%;
  opacity: 0.5;
}

Взлом с непрозрачностью .99 (менее 1) создает z-индексный контекст, поэтому вы не можете беспокоиться о глобальных значениях z-индекса. (Попробуйте удалить его и посмотреть, что произойдет в следующем демо, где родительская обложка имеет положительный z-индекс.)
Если ваш элемент уже имеет z-индекс, вам не нужен этот хак.

Демонстрация этого метода.

Ответ 7

К сожалению, во время написания этого ответа для этого не существует нет прямого пути. Вам необходимо:

  • используйте полупрозрачное изображение для фона (намного проще).
  • добавьте дополнительный элемент (например, div) рядом с дочерними элементами, который вам нужен непрозрачным, добавьте в него фон и сделав его полупрозрачным, расположите его позади упомянутых детей.

Ответ 8

Чтобы действительно настроить мелодию, я рекомендую разместить соответствующие подборки в оболочках с таргетингом на браузер. Это было единственное, что сработало для меня, когда я не мог заставить IE7 и IE8 "хорошо играть с другими" (поскольку в настоящее время я работаю в компании-разработчике программного обеспечения, которая продолжает их поддерживать).

/* color or background image for all browsers, of course */            
#myBackground {
    background-color:#666; 
}
/* target chrome & safari without disrupting IE7-8 */
@media screen and (-webkit-min-device-pixel-ratio:0) {
    #myBackground {
        -khtml-opacity:.50; 
        opacity:.50;
    }
}
/* target firefox without disrupting IE */
@-moz-document url-prefix() {
    #myBackground {
        -moz-opacity:.50;
        opacity:0.5;
    }
}
/* and IE last so it doesn't blow up */
#myBackground {
    opacity:.50;
    filter:alpha(opacity=50);
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
}

У меня могут быть избыточности в приведенном выше коде - если кто-то хочет очистить его дальше, не стесняйтесь!

Ответ 9

Свойству "filter" требуется целое число для процента непрозрачности вместо double, чтобы работать для IE7/8.

filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);

P.S.: Я отправляю это как ответ, так как для редактирования требуется как минимум 6 измененных символов.

Ответ 10

Если вам нужно установить непрозрачность только на пулю, почему бы вам не установить альфа-канал прямо в изображение? Кстати, я не думаю, что есть способ установить непрозрачность фонового изображения с помощью CSS без изменения непрозрачности всего элемента (и его детей тоже).

Ответ 11

Просто чтобы добавить к выше... вы можете использовать альфа-канал с новыми атрибутами цвета, например. rgba (0,0,0,0) ok, так что это черное, но с нулевой прозрачностью, так как родитель не влияет на ребенка. Это работает только на Chrome, FF, Safari и... Я тонкий O.

конвертировать шестнадцатеричные цвета в RGBA

Ответ 12

Я нашел довольно хороший и простой учебник по этой проблеме. Я думаю, что он отлично работает (и хотя он поддерживает IE, я просто говорю своим клиентам использовать другие браузеры):

прозрачность фона CSS без влияния на дочерние элементы, через RGBa и фильтры

Оттуда вы можете добавить поддержку градиента и т.д.

Ответ 13

#footer ul li
     {
       position:relative;
       list-style:none;
     }
    #footer ul li:before
     {
       background-image: url(imagesFolder/bg_demo.png);
       background-repeat:no-repeat;
       content: "";
       top: 5px;
       left: -10px;
       bottom: 0;
       right: 0;
       position: absolute;
       z-index: -1;
       opacity: 0.5;
    }

Вы можете попробовать этот код. Я думаю, что это сработает. Вы можете посетить демонстрацию