¿Opacidad de imagen de fondo CSS?

81

Relacionado con ¿Cómo le doy a un texto o una imagen un fondo transparente usando CSS? , pero ligeramente diferente.

Me gustaría saber si es posible cambiar el valor alfa de una imagen de fondo , en lugar de solo el color. Obviamente, puedo guardar la imagen con diferentes valores alfa, pero me gustaría poder ajustar el alfa dinámicamente.

Hasta ahora, lo mejor que tengo es:

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

Funciona, pero es voluminoso y feo, y estropea las cosas en diseños más complicados.

Niet the Dark Absol
fuente
1
¿Qué hay detrás de la imagen de fondo? ¿Un color sólido u otra imagen?
Eric
@Eric: No me refiero a ningún caso específico con esto, estoy tratando de encontrar una solución general al problema.
Niet the Dark Absol
1
@Kolink: Estoy tratando de pensar en un escenario en el que se requiera desvanecer una imagen de fondo.
Eric
Bueno, desarrollo juegos de navegador en línea, y hay algunas cosas que me gustaría hacer en las animaciones que necesitarían esta imagen de fondo de opacidad variable.
Niet the Dark Absol

Respuestas:

17

Si el fondo no tiene que repetirse, puede usar la técnica de sprites (puertas corredizas) donde coloca todas las imágenes con diferente opacidad en una (una al lado de la otra) y luego simplemente cambia de lugar con background-position.

O puede declarar la misma imagen de fondo parcialmente transparente más de una vez, si su navegador de destino admite varios fondos (Firefox 3.6+, Safari 1.0+, Chrome 1.3+, Opera 10.5+, Internet Explorer 9+). La opacidad de esas múltiples imágenes debería sumarse, cuantos más fondos defina.

Este proceso de combinación de transparencias se llama Alpha Blending y se calcula como (gracias @IainFraser):

αᵣ = α₁ + α₂(1-α₁)donde αoscila entre 0 y 1.

DanMan
fuente
10
Una advertencia a la técnica de fondos múltiples es que las opacidades se multiplicarán en lugar de sumarse. Si superpone dos imágenes con un 50% de opacidad, el resultado será una imagen con un 75% de opacidad. Agregue otro, la opacidad salta al 87.5%, otro 93.75%. Matemáticamente, la opacidad total se acerca, pero nunca llega al 100%. Sin embargo, en la práctica, gracias al redondeo, necesitaría una pila de 9 para llevar una imagen de 50% de opacidad al 100%.
Iain Fraser
3
Para aquellos con inclinaciones matemáticas, así es como stacked_opacity = current_opacity+((1-current_opacity)*single_opacity) calculan lo que sucederá al agregar otra imagen semitransparente a una pila con la opacidad general: Entonces, si nuestra opacidad actual es 0.25, agregar otra imagen nos dará 0.4375, por lo tanto; 0.25+((1-0.25)*0.25) = 0.4375 Agregar otro nos dará 0.578125, así; 0.4375+((1-0.4375)*0.25) = 0.578125
Iain Fraser
46

Puede hacer el fondo difuminado con contenido generado por CSS

Demostración en 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;
}

Pero no puede modificar la opacidad ya que no podemos modificar el contenido generado.

Sin embargo, puede manipularlo con clases y eventos css ( pero no estoy seguro de si se ajusta a sus necesidades )

por ejemplo

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

ACTUALIZAR

Puede usar transiciones css para animar la opacidad ( nuevamente a través de clases )

demostración en http://jsfiddle.net/gaby/WktFm/507/

Añadiendo

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

a la .container:beforeregla hará que la opacidad se anime a 1 en un segundo.

Compatibilidad

  • FF 5 ( quizás 4 también, pero no lo tengo instalado ) .
  • IE 9 falla ...
  • Los navegadores basados ​​en Webkit fallan ( Chrome lo admite ahora v26, tal vez versiones anteriores también, pero solo verifiqué con mi compilación actual ), pero están al tanto y están trabajando en ello ( https://bugs.webkit.org/show_bug.cgi?id= 23209 )

.. así que solo el último FF lo admite por el momento .. pero una buena idea, ¿no? :)

Gabriele Petrioli
fuente
1
Me parece muy bien en FF5, buen trabajo. Olvidé por completo que los pseudo elementos tienen la urlpropiedad, lo intenté usando backgroundy no pude resolver los problemas del índice z (contenido a continuación).
Wesley Murch
Se agradece la respuesta, pero teniendo en cuenta lo mal que funciona Firefox con otras cosas (pérdidas de memoria por todas partes, retraso horrible en JS, es casi tan lento como IE6, ciertamente más lento que IE7 ...) estaré buscando un navegador más cruzado solución.
Niet the Dark Absol
@WesleyMurch, ¿puedo solicitarle que eche un vistazo a una pregunta css, jquery sobre un tema diferente en 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);
}

Copiado de: http://robertnyman.com/2010/01/11/css-background-transparency-without-affecting-child-elements-through-rgba-and-filters/

Andy.Diaz
fuente
9
Quizás no fui lo suficientemente claro. Estoy buscando hacer una imagen de fondo parcialmente transparente.
Niet the Dark Absol
@NiettheDarkAbsol tenía claro que no quiere una "solución", pero proporcionó un ejemplo y SABE que la respuesta es "NO, NO PUEDE". Entonces, este ejemplo funciona para el escenario (que no está dando sino que rechaza) donde tiene un fondo sólido detrás de su imagen. Simplemente agregue otro fondo encima de su imagen, con el rgba a juego con el color de fondo. El "efecto" es que tu imagen se ve transparente. Deberías aceptar las respuestas con alegría o abrir otra pregunta porque esta se ha resuelto con "NO, no puedes"
sergio
3
@sergio Esta respuesta me dice cómo hacer que un color de fondo sea parcialmente transparente. Lo cual es genial, excepto que la pregunta, como dije, se trata de una imagen de fondo .
Niet the Dark Absol
13

Pruebe este truco ... use la sombra css con la opción (recuadro) y haga 200px de profundidad, por ejemplo

Código:

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

.

También para todos los navegadores:

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

y aumente el número para llenar su casilla :)

¡Disfrutar!

Saud Alfadhli
fuente
1
esto no funciona para lo que OP quiere, pero cumple mis requisitos perfectamente, ¡gracias!
RozzA
@rozzA el OP no indicó que había otra imagen de fondo. De hecho, solo quiso saber si es posible cambiar la opacidad del fondo y respondió: "NO". Este es un buen enfoque :) pero no es diferente de agregar un nuevo fondo con transparencia rgba.
sergio
6

Puede poner un segundo elemento dentro del elemento en el que desea tener un fondo transparente.

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

Luego, coloque el '.container-background' absolutamente para cubrir el elemento principal. En este punto, podrá ajustar la opacidad sin afectar la opacidad del contenido dentro de '.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;
}
Alex K
fuente
¿No es exactamente lo mismo que el "truco" que utilicé en la pregunta?
Niet the Dark Absol
1
Hmm ... supongo, pero no entiendo qué es lo que no funciona para ti. Utilizo este método y funciona muy bien.
Alex K
1
ES EXACTAMENTE como tu truco, pero debido a que eres reacio a dar un ejemplo y por tu comentario "@Eric: no me refiero a ningún caso específico con esto, estoy tratando de encontrar una solución general al problema" tú Parece claro que lo que desea no es un truco o una solución alternativa que pueda funcionar para ciertos escenarios (aunque está proporcionando uno), sino la respuesta simple, sea posible o no. Entonces, la respuesta correcta es "NO, no es posible según las especificaciones CSS actuales". Sus problemas parecen ser que algunos diseños resultan "complicados" para usted. Esta respuesta te lo complica.
Sergio
Quise decir exactamente como el ejemplo de OP.
sergio
3

Prueba esto

<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 Causando
fuente
Me encantaría ver que el degradado lineal permanezca en su posición, incluso si cambia la posición del fondo.
klewis
1

No puede editar la imagen mediante CSS. La única solución que se me ocurre es editar la imagen y cambiar su opacidad, o hacer diferentes imágenes con todas las opacidades necesarias.

Cokegod
fuente
Esta es la respuesta más directa, si olvidamos que el OP proporcionó una "alternativa", pero consideremos que comentó más tarde que "no quiere dar un ejemplo" (para proporcionar una alternativa). Entonces, considerando que solo quiere la respuesta, aquí está :)
sergio
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;
}

Hack con opacidad 0,99 (menos de 1) crea un contexto de índice z para que no pueda preocuparse por los valores globales del índice z. (Intente eliminarlo y vea qué sucede en la siguiente demostración donde el contenedor principal tiene un índice z positivo).
Si su elemento ya tiene un índice z, entonces no necesita este truco.

Demo .

usuario
fuente
@ bjb568 Sí, ese fue mi primer pensamiento. Pero en realidad no funciona como fondo translúcido, sino que actúa como primer plano translúcido. Intente agregar una imagen dentro del bloque o cambie el color del texto al color de fondo (blanco) y verá.
usuario
@ bjb568 Sí, en su ejemplo puede ver el fondo debería ser sobre la imagen interna. Intente aumentar la opacidad del elemento "fondo" y verá cómo la imagen interior se desvanece.
usuario
@ bjb568 ¿Alguna vez se preguntó por qué tenía que agregar no-repeat? Crees que tu versión está bien porque el elemento tiene un tamaño fijo que es igual al tamaño de la imagen bg, y porque no tienes ningún elemento padre con fondo (el color de fondo sería suficiente).
usuario
@ bjb568 Di un ejemplo completo. Si cree que tiene redundancia, comience con él e intente eliminar cualquier cosa. Verás que cada parámetro tiene su lugar. Si cree que ha encontrado otra técnica, publíquela como otra respuesta.
usuario
Me he preguntado. También puedo hacerlo sin trucos extraños. No repetir es para ... no repetir. Está bien. Entonces otra respuesta.
bjb568
1

Aquí hay otro enfoque para configurar el gradiente y la transparencia con CSS. Sin embargo, necesitas jugar un poco con los parámetros.

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 */
Stanislav
fuente
-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%;
  }

Por así decirlo, es el cuerpo :: después de lo que estás buscando. De esta manera, el código de su cuerpo no se modifica ni se altera, solo el fondo donde puede realizar cambios cuando sea necesario.

Ali Silva
fuente