Непрозорість фонового зображення CSS?


81

Пов’язане з тим, як надати тексту чи зображенню прозорий фон за допомогою CSS? , але дещо інший.

Я хотів би знати, чи можна змінити альфа-значення фонового зображення , а не лише колір. Очевидно, що я можу просто зберегти зображення з різними значеннями альфа, але я хотів би мати можливість динамічно регулювати альфу.

На сьогодні найкраще, що я маю, це:

<div style="position: relative;">
    <div style="position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px;
                      background-image: url(...); opacity: 0.5;"></div>
    <div style="position: relative; z-index: 1;">
        <!-- Rest of content here -->
    </div>
</div>

Це працює, але громіздко і негарно, і псує речі в більш складних макетах.


1
Що стоїть за фоновим зображенням? Суцільний колір, чи інше зображення?
Ерік

@Eric: Я не маю на увазі жодного конкретного випадку з цим, я намагаюся знайти загальне рішення проблеми.
Niet the Dark Absol

1
@Kolink: Я намагаюся придумати сценарій, коли потрібно вицвітання фонового зображення.
Ерік

Ну, я розробляю онлайн-ігри для браузерів, і я хотів би зробити кілька речей в анімації, які потребували б цього фонового зображення зі змінною непрозорістю.
Niet the Dark Absol

Відповіді:


17

Якщо фон не потрібно повторювати, ви можете скористатися технікою спрайт (розсувні двері), коли ви розміщуєте всі зображення з різною непрозорістю в одне (поруч одне з одним), а потім просто переміщуєте їх за допомогою background-position.

Або ви можете оголосити одне і те ж частково прозоре фонове зображення кілька разів, якщо ваш цільовий браузер підтримує кілька фонів (Firefox 3.6+, Safari 1.0+, Chrome 1.3+, Opera 10.5+, Internet Explorer 9+). Непрозорість цих кількох зображень повинна складатися, чим більше фонів ви визначаєте.

Цей процес поєднання прозорих плівок називається Alpha Blending і обчислюється як (завдяки @IainFraser):

αᵣ = α₁ + α₂(1-α₁)де αколивається від 0 до 1.


10
Одним застереженням до технології багатошарового фону є те, що непрозорість буде збільшуватись, а не додавати разом. Якщо накласти два зображення на 50% непрозорості, результатом буде одне зображення на 75%. Додайте ще одну, непрозорість зросте до 87,5%, ще одну 93,75%. Математично загальна непрозорість наближається, але насправді ніколи не досягає 100%. На практиці, однак, завдяки округленню, вам знадобиться стек 9, щоб довести зображення непрозорості 50% до 100%.
Iain Fraser

3
Для математично схильних, ось як ви розробляєте, що додавання чергового напівпрозорого зображення до стеку зробить для загальної непрозорості: stacked_opacity = current_opacity+((1-current_opacity)*single_opacity) Отже, якщо наша поточна непрозорість становить 0,25, додавання іншого зображення дасть нам 0,4375, таким чином; 0.25+((1-0.25)*0.25) = 0.4375 Додавання іншого дасть нам 0,578125, таким чином; 0.4375+((1-0.4375)*0.25) = 0.578125
Іен Фрейзер

46

Ви можете зробити зникле тло за допомогою вмісту, створеного CSS

Демонстрація за адресою http://jsfiddle.net/gaby/WktFm/508/

Html

<div class="container">
        contents
</div>

Css

.container{
    position: relative;
    z-index:1;
    overflow:hidden; /*if you want to crop the image*/
}
.container:before{
    z-index:-1;
    position:absolute;
    left:0;
    top:0;
    content: url('path/to/image.ext');
    opacity:0.4;
}

Але ви не можете змінити непрозорість, оскільки нам заборонено змінювати згенерований вміст ..

Ви можете маніпулювати цим за допомогою класів та CSS-подій ( але не впевнені, чи відповідає він вашим потребам )

наприклад

.container:hover:before{
    opacity:1;
}

ОНОВЛЕННЯ

Ви можете використовувати переходи css для анімації непрозорості ( знову ж таки через класи )

демонстрація на http://jsfiddle.net/gaby/WktFm/507/

Додавання

-webkit-transition: opacity 1s linear;
-o-transition: opacity 1s linear;
-moz-transition: opacity 1s linear;
transition: opacity 1s linear;

до .container:beforeправилу зробить непрозорості одухотворені до 1 в одну секунду.

Сумісність

  • FF 5 ( можливо, також 4, але не встановлено. )
  • IE 9 не вдається ..
  • Веб-браузери на базі Webkit виходять з ладу ( Chrome підтримує його зараз v26 - можливо, і більш ранні версії, але щойно перевірив мою поточну збірку ), але вони знають і працюють над цим ( https://bugs.webkit.org/show_bug.cgi?id= 23209 )

.. отже, на даний момент це підтримує лише остання версія FF .. але приємна ідея, ні? :)


1
Мені виглядає досить приємно в FF5, приємна робота. Я зовсім забув, що псевдоелементи мають urlвластивість, я спробував за допомогою backgroundі не зміг вирішити проблеми із z-index (вміст внизу).
Wesley Murch

Відповідь вдячна, але враховуючи, наскільки погано Firefox працює з іншими речами (повсюдно витікає пам’ять, жахливе відставання в JS, це майже так само повільно, як IE6, безумовно повільніше, ніж IE7 ...), я буду шукати більш крос-браузер рішення.
Niet the Dark Absol

@WesleyMurch, може я просити вас , щоб подивитися на CSS, Jquery питання на іншу тему на stackoverflow.com/questions/14137378 / ...
Istiaque Ahmed

24
.class {
    /* Fallback for web browsers that doesn't support RGBa */
    background: rgb(0, 0, 0);
    /* RGBa with 0.6 opacity */
    background: rgba(0, 0, 0, 0.6);
}

Скопійовано з: http://robertnyman.com/2010/01/11/css-background-transparency-without-affecting-child-elements-through-rgba-and-filters/


9
Можливо, я був недостатньо чіткий. Я прагну зробити фонове зображення частково прозорим.
Niet the Dark Absol

@NiettheDarkAbsol ви чітко заявили, що не хочете "обхідного шляху", але навели приклад і ЗНАЄТЕ, що відповідь "НІ ВИ НЕ МОЖЕТЕ". Отже, цей приклад працює для сценарію (який ви не даєте, а відхиляєте), коли у вас є тверде тло за вашим зображенням. Просто додайте ще одне тло на верхній частині вашого зображення, при цьому rgba відповідає кольору задньої частини. "Ефектом" є те, що ваше зображення виглядає прозорим. Ви повинні прийняти відповіді з радістю або відкрити інше питання, тому що це питання вирішено за допомогою "НІ, ви не можете"
Серхіо

3
@sergio Ця відповідь підказує мені, як зробити колір фону частково прозорим. Що чудово, за винятком того, що питання - як я вже заявив - стосується фонового зображення .
Niet the Dark Absol

13

Спробуйте цей фокус .. використовуйте css shadow з опцією (вставка) і зробіть, наприклад, глибину 200px

Код:

box-shadow: inset 0px 0px 277px 3px #4c3f37;

.

Також для всіх браузерів:

-moz-box-shadow: inset 0px 0px 47px 3px #4c3f37;
-webkit-box-shadow: inset 0px 0px 47px 3px #4c3f37;
box-shadow: inset 0px 0px 277px 3px #4c3f37;

і збільште число, щоб заповнити поле :)

Насолоджуйтесь!


1
це не працює для того, що хоче OP, але чудово відповідає моїм вимогам, дякую !!
RozzA

@rozzA ОП не заявив, що на задньому плані є інше зображення. Насправді він лише хотів дізнатися, чи можна змінити непрозорість фону, і відповів: "НІ". Це хороший підхід :), але не відрізняється від додавання нового фону з прозорістю rgba.
Серхіо

6

Ви можете помістити другий елемент всередину елемента, на якому ви хочете мати прозорий фон.

<div class="container">
    <div class="container-background"></div>
    <div class="content">
         Yay, happy content!
    </div>
</div>

Потім зробіть '.container-background' позиціонованим абсолютно для покриття батьківського елемента. На цьому етапі ви зможете регулювати його непрозорість, не впливаючи на непрозорість вмісту всередині '.container'.

.container {
    position: relative;
}
.container .container-background {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background: url(background.png);
    opacity: 0.5;
}
.container .content {
    position: relative;
    z-index: 1;
}

Хіба це не зовсім те саме, що "хак", який я використав у питанні?
Niet the Dark Absol

1
Хм ... Я гадаю, але я не розумію, що для вас не працює. Я використовую цей метод, і він чудово працює.
Alex K

1
ЦЕ ТОЧНО як ваш хакер, але оскільки ви не хочете наводити приклад і своїм коментарем "@Eric: Я не маю на увазі жодного конкретного випадку з цим, я намагаюся знайти загальне рішення проблеми", здається ясним щодо того, що ви хочете, - це не хак чи обхідний шлях, який може спрацювати для певних сценаріїв (хоча ви надаєте такий), а скоріше проста відповідь, можливо це чи ні. Тож правильна відповідь: "НІ, це неможливо за чинними специфікаціями CSS". Ваші проблеми, здається, деякі макети призводять до "ускладнення" для вас. Ця відповідь де-ускладнює це для вас.
Серхіо

Я мав на увазі саме такий приклад, як OP.
Серхіо

3

Спробуйте це

<div style="background: linear-gradient( rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) ), url(/image.png);background-repeat: no-repeat; background-position: center;"> </div>


Хотілося б, щоб лінійний градієнт залишався в положенні, навіть якщо ви змінили фонове положення.
klewis

1

Ви не можете редагувати зображення за допомогою CSS. Єдине рішення, яке я можу придумати, - це відредагувати зображення та змінити його непрозорість, або зробити різні зображення з усіма необхідними непрозоростями.


Це більш пряма відповідь, якщо ми забудемо, що ОП надав "альтернативу", але вважаємо, що він прокоментував пізніше, що "не хоче наводити приклад" (надати альтернативу). Тож враховуючи, що він просто хоче відповіді, ось вона :)
Серхіо

1
#id {
  position: relative;
  opacity: 0.99;
}

#id::before {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -1;
  background: url('image.png');
  opacity: 0.3;
}

Злом з непрозорістю 0,99 (менше 1) створює контекст z-index, тому ви можете не турбуватися про глобальні значення z-index. (Спробуйте видалити його і подивіться, що станеться в наступній демонстрації, де батьківська обгортка має позитивний z-індекс.)
Якщо ваш елемент вже має z-index, то вам цей хак не потрібен.

Демо .


@ bjb568 Так, це була моя перша думка. Але це насправді не працює як напівпрозорий фон, а замість цього виступає як напівпрозорий передній план. Спробуйте додати зображення всередині блоку або змініть колір тексту на колір тла (білий), і ви побачите.
користувач

@ bjb568 Так, у вашому прикладі ви можете побачити фоновий фон над внутрішнім зображенням. Спробуйте збільшити непрозорість елемента "фон", і ви побачите, як внутрішнє зображення зникає.
користувач

@ bjb568 Ви ніколи не замислювались, чому вам довелося додавати no-repeat? Ви вважаєте, що ваша версія нормальна, оскільки елемент має фіксований розмір, який дорівнює розміру зображення bg, і тому, що у вас немає батьківського елемента з фоном (достатньо буде фонового кольору).
користувач

@ bjb568 Я навів ґрунтовний приклад. Якщо ви вважаєте, що у нього надмірність, почніть із цього і спробуйте щось видалити. Ви побачите, що кожен параметр має своє місце. Якщо ви вважаєте, що знайшли інший прийом, опублікуйте його як іншу відповідь.
користувач

Я дивувався. Я також можу це робити без дивних хаків. No-repeat - це ... це не повторення. Добре, гаразд. Тоді ще одна відповідь.
bjb568

1

Ось ще один підхід до налаштування градієнта та прозорості за допомогою CSS. Вам потрібно трохи пограти з параметрами.

background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, transparent)),url("gears.jpg"); /* Chrome,Safari4+ */
background-image: -webkit-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* Chrome10+,Safari5.1+ */
background-image:    -moz-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* FF3.6+ */
background-image:     -ms-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* IE10+ */
background-image:      -o-linear-gradient(top, transparent, transparent),url("gears.jpg"); /* Opera 11.10+ */
background-image:         linear-gradient(to bottom, transparent, transparent),url("gears.jpg"); /* W3C */

-1
body {
  ' css code that goes in your body'
}

body::after {
  background: url(yourfilename.jpg);
  content: "";
  opacity: 0.6;
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
  z-index: -1;   
  width:auto;
  height: 100%;
  }

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

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