Встановіть непрозорість фонового зображення, не впливаючи на дочірні елементи


214

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

Приклад

Для всіх посилань у нижньому колонтитулі потрібна спеціальна куля (фонове зображення), а непрозорість спеціальної кулі повинна становити 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%;
}


Відповіді:


119

Ви можете використовувати 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>


Це найкраще рішення!
Дзеніс Х.

93

Візьміть своє зображення в редактор зображень, зменшіть непрозорість, збережіть його як .png і використовуйте це замість цього.


8
Хм ... я просто downvoted, але подивитися на цей загальноприйнятому відповідь: stackoverflow.com/a/6502295/131809 upvoted 10 разів, і в значній мірі ідентичні.
Олексій

9
Це хороший варіант, не маю уявлення, чому так багато потоків. Якби я міг би підтвердити це двічі, я би. Дочірній елемент частково непрозорого батьківського елемента буде частково непрозорим, і повинен бути. Усі "обхідні шляхи" - це помилки, які з часом слід виправити.
RobW

6
@mystrdat Ви вже завантажуєте зображення, це не зайвий запит.
брад

2
@mystrdat Але він вже завантажує зображення стрілки. Ви не надали рішення, що не має зображення, тож це було моєю думкою. Він вже завантажує зображення зі стрілкою, воно може так само прийти в міру необхідності, що не буде зайвим запитом. Я не розумію, звідки ти родом.
брад

1
@brad Вибачаюсь, виявляється, я неправильно прочитав питання, коли перевірив ще раз.
mystrdat

42

Це працюватиме з кожним браузером

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/


Я думаю, вам потрібно змінити "цитати у наведеному вище коді на", щоб він працював при прямому скопіюванні.
nsantorello

6
чи є ця відповідь найкращим рішенням, яке люди знайшли на проблему: "як зробити так, щоб дочірній елемент не успадкував значення непрозорості батьківського елемента"? Мені потрібно, щоб дитина справді була дитиною .. і в документообігу ... а також не хочу вводити для цього javascript / flash; віддайте перевагу чистому CSS.
govinda

У мене 50% непрозорі батьківські <li> містять дочірні зображення, які я хочу 100% непрозорі. Встановлення <li> на position:relative;та img на position:absolute;НЕ дозволяє мені перекрити успадковану непрозорість на img, і я не можу використовувати абсолютне позиціонування для самих <li> (це безлад ;-). У Javascript я спробував imgs[i].style.opacity = '1';, але це також не працює, щоб змінити успадковану непрозорість. Якщо я правильно розумію, я також не можу використовувати rgba, оскільки мені потрібно впливати на самі зображення, а не лише на колір тла. У когось є рекомендація для мене?
govinda

26
Вся ця відповідь не має сенсу. Даний код, крім того, що саме те, що запитувач не хоче робити, оскільки він не працює , не відповідає опису чи посилання. Мені дуже важко зрозуміти, чому так багато людей було проти цього.
BoltClock

Якщо питання було "Як встановити 50% прозорість на елемент", це буде гарною відповіддю.
Lharby

29

Якщо ви використовуєте зображення як кулю, ви можете розглянути: перед псевдоелементом.

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

3
Фільтр - це лише рішення IE
Хусейн

1
Я думаю, що це, мабуть, найкраще рішення. Це чисте рішення CSS. Можливо також зламати підтримку IE7 за допомогою *zoom: expression( … );(див . Після і: перед тим, як css псевдоелектричні хаки для IE 7 ), але IE7 нарешті стає пасе.
тридцять


9
#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-індекс, то цей хак вам не потрібен.

Демонстрація цієї методики .


Чи знаєте ви, чому нам потрібно встановити значення непрозорості менше 1? Це рішення для крос-браузера?
zVictor

1
@zVictor так, це поведінка, стандартизована w3c. Див. Розуміння z-індексу CSS: контекст укладання .
користувач

4

На жаль, на момент написання цієї відповіді прямого способу це не існує. Тобі потрібно:

  1. використовувати напівпрозоре зображення для фону (набагато простіше).
  2. додайте додатковий елемент (наприклад, div) поруч із дітьми, яких ви хочете непрозорі, додайте до нього фон і після того, як зробити його напівпрозорим, розташуйте його за згаданими дітьми.

4

Інший варіант - підхід 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;   
}

3

Властивості "filter" потрібно ціле число для відсотка непрозорості замість подвійного, щоб працювати для IE7 / 8.

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

PS: Я публікую це як відповідь, оскільки ТАК потребує щонайменше 6 змінених символів для редагування.


2

Щоб дійсно точно налаштувати речі, рекомендую розмістити відповідні виділення в обгортках, орієнтованих на браузер. Це було єдине, що працювало для мене, коли я не міг отримати 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);
}

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


3
Не потрібно орієнтуватися на кожен браузер окремо, просто використовуйте префікси браузера всередині одного блоку вибору. З префіксами браузера браузер використовуватиме лише відповідне властивість CSS. З плином часу і синтаксис цього властивості стає стандартизованим, постачальники браузерів припинять підтримку префіксів і використовуватимуть властивість CSS без будь-якого префікса (наприклад, Firefox відмовився від підтримки -moz-border-radiusу Firefox 13 і просто шукає стандартну border-radiusвластивість зараз). IE7 та IE8 - це інша історія, але це просто IE :-p
тридендер

Я хотів би знати, хто за це проголосував і чому, будь ласка. Голосування марне без інформативного зворотного зв’язку. Мені б хотілося покращити свої відповіді. Якщо це було лише тому, що інформація застаріла, будь ласка, перевірте дату. :) Дякую.
код-суші

@ code-sushi: Якщо трансляція сталася приблизно в той самий час, що й ваш коментар, вважайте, що це можливо було з боку когось іншого, хто випадково погодився з коментарем третьої особи (зверніть увагу на відгуки самого коментаря). Я не голосував за вашу відповідь, але мушу погодитися - я хотів би додати, що 1) KHTML ніколи не побачить, -khtml-opacityтому що він не розуміє медіа-запит, і робить його марним 2) IE стабільніше, ніж ви думаєте; він не "підірветься" лише тому, що ви додаєте префікси, що не належать до IE, до правила, яке стосується IE. Проблема, коли ви зіткнулися з нею, повинна прийти з іншого місця.
BoltClock

Моя оригінальна відповідь була майже два роки тому, і голосування за відмову відбулося нещодавно, як і цього року. Мені було просто цікаво. Щодо коментарів IE, то вони стосувалися 7, коли для цього ще потрібна підтримка; Я майже впевнений, що зараз у більшості випадків нормально ігнорувати IE 7. Дякуємо за ваш відгук.
code-sushi

1

Якщо вам потрібно встановити непрозорість лише кулі, чому б вам не встановити альфа-канал безпосередньо в зображення? До речі, я не думаю, що існує спосіб встановити непрозорість фонового зображення за допомогою css, не змінюючи непрозорість всього елемента (і його дітей також).


1

Просто для доповнення до вищезазначеного ... ви можете використовувати альфа-канал з новими атрибутами кольорів, наприклад. rgba (0,0,0,0) ок, це чорний колір, але з нульовою непрозорістю, так що для батьків це не вплине на дитину. Це працює лише на Chrome, FF, Safari і .... Я худі О.

конвертувати свої шістнадцяткові кольори в RGBA


4
Це не буде працювати з тим, background-imageяк цього вимагає ОП.
Торстен Вальтер

1

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

Прозорість фону CSS, не впливаючи на дочірні елементи, через RGBa та фільтри

Звідти ви можете додати градієнтну підтримку тощо.


Ну, це не буде працювати безпосередньо. Вам потрібно буде поставити div як прозорий елемент із фоновим кольором: (255,255,255,0,5), наприклад
Francisco

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

Ви можете спробувати цей код. Я думаю, це буде спрацювати. Ви можете відвідати демонстрацію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.