CSS background-image-opacity?

82

Связано с Как сделать текст или изображение прозрачным фоном с помощью 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+). Непрозрачность этих нескольких изображений должна складываться, чем больше фонов вы определяете.

Этот процесс объединения прозрачностей называется альфа-смешением и рассчитывается как (спасибо @IainFraser):

αᵣ = α₁ + α₂(1-α₁)где αнаходится в диапазоне от 0 до 1.

DanMan
источник
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 Generated Content

Демо на 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-индексом (содержимое ниже).
Wesley Murch
Ответ оценен, но, учитывая, насколько плохо Firefox работает с другими вещами (повсюду утечки памяти, ужасное отставание в JS, он почти такой же медленный, как IE6, определенно медленнее, чем IE7 ...), я буду искать более кросс-браузерный решение.
Niet the Dark Absol
@WesleyMurch, могу я попросить вас взглянуть на вопрос css, jquery по другой теме на stackoverflow.com/questions/14137378/…
Istiaque Ahmed 04
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 с опцией (inset) и сделайте глубокий 200 пикселей например

Код:

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.
sergio
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.
sergio
4

Попробуй это

<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>

JM Причинение
источник
Хотелось бы, чтобы линейный градиент оставался на месте, даже если вы измените положение фона.
klewis
1

Вы не можете редактировать изображение через CSS. Единственное решение, которое я могу придумать, - это отредактировать изображение и изменить его непрозрачность или создать другие изображения со всеми необходимыми значениями непрозрачности.

Cokegod
источник
Это более прямой ответ, если мы забудем, что OP предоставил «альтернативу», но учтите, что он позже прокомментировал, что он «не хочет предоставлять пример» (чтобы предоставить альтернативу). Так что, учитывая, что он просто хочет ответ, вот он :)
серджио
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-индекса, поэтому вы можете не беспокоиться о глобальных значениях z-индекса. (Попробуйте удалить его и посмотрите, что произойдет в следующей демонстрации, где родительская оболочка имеет положительный z-индекс.)
Если у вашего элемента уже есть z-index, то этот прием вам не нужен.

Демо .

пользователь
источник
@ bjb568 Да, это была моя первая мысль. Но на самом деле он не работает как полупрозрачный фон, вместо этого он действует как полупрозрачный передний план. Попробуйте добавить изображение внутри блока или изменить цвет текста на цвет фона (белый), и вы увидите.
пользователь
@ bjb568 Ага, в вашем примере вы можете видеть фон, который должен быть поверх внутреннего изображения. Попробуйте увеличить непрозрачность элемента «фон», и вы увидите, как внутреннее изображение блекнет.
пользователь
@ bjb568 Вы когда-нибудь задумывались, почему вам нужно было добавить no-repeat? Вы думаете, что ваша версия в порядке, потому что элемент имеет фиксированный размер, равный размеру изображения bg, и потому что у вас нет родительского элемента с фоном (достаточно background-color).
пользователь
@ bjb568 Я привел подробный пример. Если вы считаете, что в нем есть избыточность, начните с него и попробуйте что-нибудь удалить. Вы увидите, что у каждого параметра есть свое место. Если вы думаете, что нашли другую технику, опубликуйте ее как другой ответ.
пользователь
Я задавался вопросом. Я тоже могу обойтись без странных хаков. Нет повторения для ... это не повторение. Хорошо. Тогда еще один ответ.
bjb568 04
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%;
  }

Так сказать его тело :: после того, как вы ищете. Таким образом, код вашего тела не изменяется или изменяется только фон, где вы можете вносить изменения при необходимости.

Али Сильва
источник