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

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

Пример

Для всех ссылок в нижнем колонтитуле требуется настраиваемый маркер (фоновое изображение), а непрозрачность настраиваемого маркера должна составлять 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% - и, похоже, нет способа сбросить непрозрачность дочерних элементов:

#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%;
}

person jmohr    schedule 14.02.2011    source источник
comment
stackoverflow.com/a/6502295/218125   -  person Cypher    schedule 22.03.2013
comment
связанный stackoverflow.com/q/806000/759452   -  person Adrien Be    schedule 27.02.2014


Ответы (15)


Вы можете использовать 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>

person Stickers    schedule 15.01.2017
comment
Действительно хороший трюк и именно то, что я искал, спасибо - person Mike; 28.11.2020
comment
Пожалуйста, @jmohr отметьте этот ответ как правильный. - person Despertaweb; 15.03.2021
comment
Этот ответ настолько умный, что я сначала упустил его из виду. Я не такой уж и умный .. Спасибо, что поделились. - person dibs; 19.07.2021

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

person 2ToneKenobi    schedule 02.08.2012
comment
Хм ... я только что проголосовал против, но посмотрите на этот принятый ответ: stackoverflow.com/a/6502295/131809 проголосовал за 10 раз, и в значительной степени идентичны. - person Alex; 07.11.2012
comment
Это хороший вариант, не знаю, почему так много голосов против. Если бы я мог проголосовать за это дважды, я бы сделал это. Дочерний элемент частично непрозрачного родительского элемента будет частично непрозрачным и должен быть таким. Все обходные пути - это ошибки, которые в конечном итоге следует исправить. - person RobW; 29.11.2012
comment
Это не лучший вариант, поскольку он запускает HTTP-запрос +1 и требует загрузки дополнительных данных. - person mystrdat; 11.12.2012
comment
@mystrdat Вы уже загружаете изображение, это не лишний запрос. - person brad; 22.02.2013
comment
@brad Вам вообще не нужно скачивать изображение, в том-то и дело. - person mystrdat; 25.02.2013
comment
@mystrdat Но он уже скачивает изображение стрелки. Вы не предоставили решение без изображения, так что это была моя точка зрения. Он уже загружает изображение стрелки, оно может быть получено по мере необходимости, что не будет дополнительным запросом. Я не понимаю, откуда вы. - person brad; 03.03.2013
comment
@brad Прошу прощения, оказалось, что я неправильно прочитал вопрос, когда проверил еще раз. - person mystrdat; 05.03.2013
comment
Это, конечно, сработает, но что касается непрозрачности, я бы проголосовал за использование изображения внутри отдельного span / div внутри тега li и просто применил к нему непрозрачность вместо решения выше (или почти всех из них здесь), как это оставляет открытыми некоторые прекрасные параметры анимации и не требует редактирования ресурсов жесткого кода. - person mystrdat; 05.03.2013
comment
Что делать, если вы работаете с динамически обновляемыми изображениями? Плохое решение. - person master_gracey; 11.07.2013
comment
А как насчет пользователей Linux? У нас нет фотошопа. Я отредактировал ваш ответ. :-) - person Ionică Bizău; 31.08.2013
comment
Это неправильный ответ. В некотором смысле это работает, но не позволяет поиграть с непрозрачностью, за исключением создания множества изображений. Это должно быть выполнено с помощью css. - person abalter; 21.09.2013
comment
С другой стороны, это очень полезно при создании модальных окон. - person cptnk; 11.02.2014
comment
Что ж, грустная, но прямая правда! - person Mark Lalor; 25.08.2015
comment
Это работает, но что, если он захочет использовать одно и то же изображение с двумя разными типами непрозрачности в зависимости от того, щелкнете вы по нему или нет? В вашем решении он будет использовать два изображения, замедляющих время загрузки страницы, если у него много изображений для этого, если бы мы использовали код, он мог бы использовать одно и то же изображение, но с разными уровнями непрозрачности. - person SeekLoad; 24.07.2020

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

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/

person Hussein    schedule 14.02.2011
comment
Я думаю, вам нужно изменить кавычки в приведенном выше коде на, чтобы он работал при прямом копировании. - person nsantorello; 06.02.2012
comment
является ли этот ответ лучшим решением, которое люди нашли для проблемы: как сделать так, чтобы дочерний элемент не наследовал значение прозрачности CSS родительского элемента? Мне нужно, чтобы ребенок действительно был ребенком .. и в потоке документов ... и также не хочу использовать для этого javascript / flash; предпочитаю чистый CSS. - person govinda; 14.05.2012
comment
У меня есть 50% непрозрачные родительские ‹li›, содержащие дочерние изображения, которые я хочу на 100% непрозрачными. Установка ‹li› на position:relative; и img на position:absolute; НЕ позволяет мне переопределить унаследованную непрозрачность img, и я не могу использовать абсолютное позиционирование для самих ‹li› (это беспорядок ;-). В Javascript я пробовал imgs[i].style.opacity = '1';, но это также не помогает переопределить унаследованную непрозрачность. Если я правильно понимаю, я также не могу использовать rgba, потому что мне нужно влиять на сами imgs, а не только на цвет фона. У кого-нибудь есть для меня рекомендации? - person govinda; 15.05.2012
comment
Весь этот ответ не имеет смысла. Данный код, помимо того, что является именно тем, что спрашивающий не хочет делать, потому что он не работает, не соответствует описанию или ссылке. Мне очень трудно понять, почему так много людей проголосовали за него. - person BoltClock; 31.08.2014
comment
Если бы вопрос был «Как установить 50% прозрачность элемента», это был бы хороший ответ. - person lharby; 25.04.2019

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

#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;
}
person Mr Griever    schedule 14.02.2011
comment
Фильтр - это только решение IE - person Hussein; 15.02.2011
comment
Думаю, это, наверное, лучшее решение. Это чистое решение CSS. Также возможно взломать поддержку IE7 с помощью *zoom: expression( … ); (см. : after и: before взлом псевдоэлементов css для IE 7), но IE7 наконец становится устаревшим. - person thirdender; 31.08.2013

Вы можете поместить изображение в 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/ < / а>

person Zied Hamdi    schedule 17.05.2014

#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-индекс, то этот прием вам не нужен.

Демонстрация этой техники.

person user    schedule 02.02.2014
comment
Вы знаете, почему нам нужно установить значение непрозрачности меньше 1? Это кроссбраузерное решение? - person zVictor; 03.05.2014
comment
@zVictor да, это стандартное поведение w3c. См. Понимание z-index CSS: контекст стекирования . - person user; 03.05.2014

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

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

Другой вариант - CSS Tricks вставки псевдоэлемента точного размера. оригинального элемента прямо за ним, чтобы имитировать непрозрачный фоновый эффект, который мы ищем. Иногда вам нужно установить высоту псевдоэлемента.

div {
  width: 200px;
  height: 200px;
  display: block;
  position: relative;
}

div::after {
  content: "";
  background: url(image.jpg);
  opacity: 0.5;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  position: absolute;
  z-index: -1;   
}
person kaleazy    schedule 10.01.2018

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

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

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

person lyubeto    schedule 21.02.2013

Чтобы по-настоящему настроить вещи, я рекомендую поместить соответствующий выбор в оболочки, ориентированные на браузер. Это было единственное, что у меня сработало, когда я не мог заставить 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);
}

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

person code-sushi    schedule 12.12.2012
comment
Нет необходимости настраивать таргетинг на каждый браузер отдельно, просто используйте префиксы браузера внутри одного блока селектора. С префиксами браузера браузер будет использовать только соответствующее свойство CSS. По прошествии времени и стандартизации синтаксиса этого свойства поставщики браузеров откажутся от поддержки префиксов и будут использовать свойство CSS без какого-либо префикса (например, Firefox отказался от поддержки -moz-border-radius в Firefox 13 и теперь просто ищет стандартное свойство border-radius. ). IE7 и IE8 - это другая история, но это просто IE :-p - person thirdender; 31.08.2013
comment
Я хотел бы знать, кто проголосовал против и почему, пожалуйста. Голосование бесполезно без информативной обратной связи. Я хотел бы иметь возможность улучшить свои ответы. Если это произошло только потому, что информация устарела, проверьте дату. :) Спасибо. - person code-sushi; 20.05.2014
comment
@ code-sushi: если голос против произошел примерно в то же время, что и ваш комментарий, подумайте, что это могло быть от кого-то другого, кто согласился с комментарием thirdender (обратите внимание на голоса за сам комментарий). Я не голосовал за ваш ответ, но должен согласиться - я хотел бы добавить, что 1) KHTML никогда не увидит -khtml-opacity, потому что он не понимает медиа-запрос, что делает его бесполезным 2) IE более стабилен, чем вы думаете ; он не взорвется только потому, что вы добавляете префиксы, отличные от IE, в правило, применимое к IE. Проблема в то время, когда вы с ней столкнулись, должна была возникнуть откуда-то еще. - person BoltClock; 31.08.2014
comment
Мой первоначальный ответ был получен почти 2 года назад, а голосование "против" произошло недавно, как в этом году. Мне было просто любопытно. Что касается комментариев IE, они относились к 7, когда они все еще нуждались в поддержке; Я почти уверен, что в наши дни в большинстве случаев можно игнорировать IE 7. Спасибо за ваш отзыв. - person code-sushi; 02.09.2014

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

person Minkiele    schedule 14.02.2011

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

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

person frontsideup    schedule 16.02.2011
comment
Это не будет работать с background-image по запросу OP. - person Torsten Walter; 03.08.2012

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

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

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

person Francisco    schedule 15.11.2012
comment
Ну, напрямую не пойдет. Вам нужно будет поместить div как родительский элемент с background-color: (255,255,255,0.5), например - person Francisco; 07.01.2015

мы можем выяснить это, не играя с непрозрачностью, просто используя цвет rgba

e.g "background-color: rgba(0,0,0, 0.5)"

Образец :

введите описание изображения здесь

Предыдущий CSS:

 .login-card {
  // .... others CSS
  background-color: #121e1b;
  opacity: 0.5;
}

Кому:

 .login-card {
      // .... others CSS
      background-color: rgba(0, 0, 0, 0.5);
    }
person Mabd    schedule 20.11.2020

#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;
    }

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

person Jakir Hossain    schedule 24.02.2015