Agregar opacidad de desvanecimiento circular (efecto viñeta) a las imágenes en CSS


Quiero dar opacidad circular a una imagen usando CSS.

Sé que puedo lograr opacidad en imágenes como esta:

.circle img {
    opacity: 0.4;
    filter: alpha(opacity=40);
}

Sé que puedo lograr imágenes circulares como esta:

.circle {
    border-radius: 50%;
    display: inline-block;
}
.circle img {
    border-radius: 50%;
    display: block;
}

De alguna manera quiero fusionar las dos cosas anteriores y aplicar la opacidad solo para los bordes de la imagen, por lo que el centro de la imagen no obtiene casi nada de la etiqueta de opacidad. He buscado durante horas pero no he encontrado nada.

Sin opacidad: http://jsfiddle.net/8w6szf84/47

Con opacidad: http://jsfiddle.net/8w6szf84/48 / -> mala opacidad, quiere que solo los bordes se desvanezcan...

¿Necesito usar Javascript en esto? Alguna sugerencia?

Author: balintpekker, 2014-12-24

6 answers

Ok, entonces lo que podemos hacer es crear un elemento :after que será igual al tamaño del padre. Usando esto podemos establecer un degradado de fondo que hará que aparezca como la imagen se desvanece en el fondo de color sólido.

Nota: En este ejemplo he hecho el elemento degradado un poco más grande y lo moví sobre 1px para evitar que aparezca un borde alrededor de él. Desde aquí puedes perder el tiempo para obtener el efecto perfecto que deseas.

.circle {
    border-radius: 50%;
    display: inline-block;
    position: relative;
}
.circle img {
    border-radius: 50%;
    display: block;
    border:1px solid #fff;
}
.circle:after {
    content: "";
    display: block;
    width: 100%;
    height: 100%;
    background: radial-gradient(ellipse at center, rgba(255,255,255,0) 0%,rgba(255,255,255,1) 70%,rgba(255,255,255,1) 100%);
    border-radius: 50%;
    position: absolute;
    top: 0; left: 0;
}
<div class="circle">
    <img src="http://placeimg.com/200/200/any" />
</div>

Editar: Aquí hay otra versión sin establecer un alto o ancho y deshacerse del borde que se causa si se usa 100% de padre. Como Vucko señaló, no necesitamos los valores negativos para la posición, pero podemos usar un border alrededor del img en su lugar.

JsFiddle Here

 34
Author: Ruddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-15 11:08:40

También puede usar una sombra de caja

.shadow {
  border-radius: 50%;
  display: inline-block;
  position: relative;
}
.shadow img {
  border-radius: 50%;
  display: block;
  border: 1px solid #fff;
}
.shadow:after {
  content: "";
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  position: absolute;
  top: 0;
  left: 0;
  box-shadow: inset 10px 24px 40px 0px white, 
    inset -10px -24px 40px 0px white, 
    inset 20px -10px 40px 0px white, 
    inset -20px 10px 40px 0px white;
}
<div class="shadow">
  <img src="http://placeimg.com/200/200/any" />
</div>
 7
Author: Vitorino fernandes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 18:15:23

Podrías usar dos (de las mismas) imágenes y tener la superior más pequeña y transparente.

.circle-opaque {
    border-radius: 50%;          /* Make it a circle */
    display: inline-block;       
    position: absolute;          /* Able to position it, overlaying the other image */
    left:0px;                    /* Customise the position, but make sure it */
    top:0px;                     /* is the same as .circle-transparent */
    z-index: -1;                 /* Makes the image sit *behind* .circle-transparent */
}
.circle-opaque img {
    border-radius: 50%;          /* Make it a circle */
    z-index: -1;
}
.circle-transparent {
    border-radius: 50%;          /* Make it a circle */
    display: inline-block;       
    position: absolute;          /* Able to position it, overlaying the other image */
    left: 0px;                   /* Customise the position, but make sure it */
    top: 0px;                    /* is the same as .circle-transparent */
    z-index: 1;                  /* Makes the image sit *on top of* .circle-transparent */
}
.circle-transparent img {
    width: 200px;
    opacity: 0.4;                /* Make the second image transparent */
    filter: alpha(opacity=40);   /* For IE8 and earlier; optional */
    z-index: 1;                  /* And on top of the first */
}
<div class="circle-opaque">
    <img src="http://www.catchannel.com/images/articles/0805/orange-kitten-200px.jpg" />
</div>
<div class="circle-transparent">
    <img src="http://www.catchannel.com/images/articles/0805/orange-kitten-200px.jpg" />
</div>

Http://jsfiddle.net/joe_young/20y832r7 /

 6
Author: joe_young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-09 14:42:36

Aquí hay una versión modificada de La respuesta de Ruddy excepto que el diámetro del gradiente coincide con el ancho (o la altura) de la imagen en lugar de la diagonal. El radio del borde no es necesario. el 80% de la imagen se muestra tal cual, el 20% restante se desvanece de transparente a blanco.

.circle {
  display: inline-block;
  position: relative;
}
.circle img {
  display: block;
}
.circle:after {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-image: radial-gradient(circle closest-side at center,
    rgba(255, 255, 255, 0) 0,
    rgba(255, 255, 255, 0) 80%, 
    rgba(255, 255, 255, 1) 100%
  );
}
<div class="circle">
  <img src="http://www.catchannel.com/images/articles/0805/orange-kitten-200px.jpg">
</div>

Tenga en cuenta que los gradientes radiales se dibujan desde el centro especificado; mientras que las sombras de caja se dibujan desde los bordes; por lo tanto, ambos producen resultados diferentes.

 2
Author: Salman A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:39

Aunque este enfoque no es tan limpio como otros (posiblemente debido a la falta de tiempo), creo que podría ser limpiado. Sin embargo, solo usa sombras de caja para lograr el aspecto en el que estás pensando. (Gradientes radiales posiblemente serían preferidos, aunque si necesita un respaldo, esto podría ser una opción)

div {
  height: 300px;
  width: 300px;
  background: url(http://placekitten.com/g/300/400);
  border-radius: 50%;
  box-shadow: 
    inset -5px -5px 100px white, 
    inset 0 0 90px white, 
    inset 0 0 80px white, 
    inset 0 0 70px white, 
    inset 0 0 60px white, 
    inset 0 0 50px white, 
    inset 0 0 40px white, 
    inset 0 0 30px white, 
    inset 0 0 20px white, 
    inset 0 0 10px red; 
}
<div></div>
 1
Author: jbutler483,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 10:05:21

Me gusta simple, por lo que lo siguiente podría ser suficiente:

.circle {
  background-image: radial-gradient(ellipse at center center, rgba(0, 0, 0, 0) 0%, rgba(255, 255, 255, 1) 70%, rgba(255, 255, 255, 1) 100%);
  display: inline-block;
}
.circle img {
  border-radius: 50%;
  mix-blend-mode: lighten;
}
<div class="circle">
  <img src="http://www.catchannel.com/images/articles/0805/orange-kitten-200px.jpg" />
</div>
 0
Author: Robert McKee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-13 22:01:16