Bordes definidos con desenfoque de filtro CSS3

79

Estoy difuminando algunas imágenes con este código

img {
  filter: blur(5px);
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
}

Sin embargo, los bordes de la imagen también se vuelven borrosos. ¿Es posible difuminar la imagen manteniendo los bordes definidos? ¿Como una imagen borrosa o algo así?

colmtuite
fuente

Respuestas:

103

Podrías ponerlo en <div>con overflow: hidden;y configurar <img>en margin: -5px -10px -10px -5px;.

Manifestación: jsFiddle

Salida

CSS

img {
    filter: blur(5px);
        -webkit-filter: blur(5px);
        -moz-filter: blur(5px);
        -o-filter: blur(5px);
        -ms-filter: blur(5px);
    margin: -5px -10px -10px -5px;
}

div {
    overflow: hidden;
}
​

HTML

<div><img src="http://placekitten.com/300" />​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​</div>​​​​​​​​​​​​
Pensando rígido
fuente
1
@Moppy Eso no funciona en Chrome 23 / OS X para mí. Creo que marginse requiere.
ThinkingStiff
1
@Moppy Porque imgestá dentro de divy blurestá desbordando los límites de div. La overflow: hidden;corta.
ThinkingStiff
10
¿Qué pasa con la basura en la parte inferior de JSFiddle? No veo por qué GA rastrear un JSFiddle es necesario ...
Bojangles
1
@Bojangles, la "basura" en la parte inferior de la imagen en jsfiddle está en la imagen misma .
uberdog
3
¿Hay alguna forma de hacer esto para una imagen de fondo? La idea es crear una imagen de fondo borrosa con texto en ella
Guy
57

Pude hacer que esto funcionara con el

transform: scale(1.03);

Propiedad aplicada sobre la imagen. Por alguna razón, en Chrome, las otras soluciones proporcionadas no funcionarían si hubiera algún elemento principal relativamente posicionado.

Consulte http://jsfiddle.net/ud5ya7jt/

De esta manera, la imagen se ampliará ligeramente en un 3% y los bordes se recortarán, lo que no debería ser un problema en una imagen borrosa de todos modos. Funcionó bien en mi caso porque estaba usando una imagen de alta resolución como fondo. ¡Buena suerte!

João Josézinho
fuente
esto es agradable, simple y ajustable. funciona perfectamente para mi situación jsfiddle.net/ud5ya7jt/28 mientras que algunas de las otras soluciones parecen fallar ahora.
Jeannie
Muchas gracias por esto, es exactamente lo que estaba buscando :)
jeerbl
1
¡configurar el padre con overflow: hiddeneliminará las barras de desplazamiento! ¡Gracias!
dimmg
1
¡Qué solución tan simple!
Dotl
La escala (1) funciona, pero el 1.03 es para recortar la imagen en un 3% para que los bordes borrosos no se
noten
17

Usé -webkit-transform: translate3d(0, 0, 0);con overflow:hidden;.

DOM:

<div class="parent">
    <img class="child" src="http://placekitten.com/100" />
</div>

CSS:

.parent {
    width: 100px;
    height: 100px;
    overflow: hidden;
    -webkit-transform: translate3d(0, 0, 0);
}
.child {
    -webkit-filter: blur(10px);
}

DEMO: http://jsfiddle.net/DA5L4/18/

Esta técnica funciona en Chrome34 y iOS7.1

Actualizar

http://jsfiddle.net/DA5L4/50/

si usa la última versión de Chrome, no necesita usar -webkit-transform: translate3d(0, 0, 0);hack. Pero no funciona en Safari (webkit).

GeckoTang
fuente
@Razvan Cercelaru ¿de verdad? ¿Qué versión de safari revisaste mi demo? Funciona en Mac Safari 7.
GeckoTang
¡Trabajó para mi! ¡Gracias! (Chromium 50.0.2661.86 (64 bits) OSX)
iperdiscount
12

También puede conservar el video completo, no tiene que cortar nada.
Puede superponer sombras insertadas sobre los bordes borrosos en blanco.

Esto también se ve muy bien :)

Simplemente pegue este código al padre de sus videos:

.parent {
    -webkit-box-shadow: inset 0 0 200px #000000;
       -moz-box-shadow: inset 0 0 200px #000000;
            box-shadow: inset 0 0 200px #000000;
}
GlabbichRulz
fuente
1
Funciona de maravilla, ninguna de las otras sugerencias ayudó.
DGibbs
2
En mi caso, ayudó, pero todavía dejaba un desenfoque no deseado, así que agregué una capa de sombra de cuadro adicional:box-shadow: inset 0 0 200px #000000, inset 0 0 200px #000000;
falsarella
6

En las muchas situaciones en las que la IMG se puede colocar en la posición: absoluta , puede usar un clip para ocultar los bordes borrosos, y el DIV externo es innecesario.

img {
    filter: blur(5px);
        -webkit-filter: blur(5px);
        -moz-filter: blur(5px);
        -o-filter: blur(5px);
        -ms-filter: blur(5px);
    position: absolute;
    clip: rect(5px,295px,295px;5px);
}
genedronek
fuente
1
caniuse.com/#feat=css-clip-path aquí el soporte del navegador para el recorte. IE es el mejor 😆
Philip Giuliani
6

Habiendo abordado este mismo problema hoy, me gustaría presentar una solución que (actualmente) funciona en los principales navegadores. Algunas de las otras respuestas en esta página funcionaron una vez, pero las actualizaciones recientes, ya sea del navegador o del sistema operativo, han anulado la mayoría / todas estas respuestas.

La clave es colocar la imagen en un contenedor y transformar: escalar ese contenedor fuera de su desbordamiento: padre oculto. Luego, el desenfoque se aplica al img dentro del contenedor, en lugar de al contenedor en sí.

Violín de trabajo: https://jsfiddle.net/x2c6txk2/

HTML

<div class="container">
    <div class="img-holder">
        <img src="https://unsplash.it/500/300/?random">
    </div>
</div>

CSS

.container {
    width    : 90%;
    height   : 400px;
    margin   : 50px 5%;
    overflow : hidden;
    position : relative;
}

.img-holder {
    position  : absolute;
    left      : 0;
    top       : 0;
    bottom    : 0;
    right     : 0;
    transform : scale(1.2, 1.2);
}

.img-holder img {
    width          : 100%;
    height         : 100%;
    -webkit-filter : blur(15px);
    -moz-filter    : blur(15px);
    filter         : blur(15px);
}
rorymorris89
fuente
3

Solo una pista para esa respuesta aceptada, si está usando la posición absoluta, los márgenes negativos no funcionarán, pero aún puede establecer la parte superior, inferior, izquierda y derecha en un valor negativo, y ocultar el desbordamiento del elemento principal.

La respuesta acerca de agregar un clip a la imagen de posición absoluta tiene un problema si no conoce el tamaño de la imagen.

cn123h
fuente
2

Inserte la imagen dentro de un con position: relative;yoverflow: hidden;

HTML

<div><img src="#"></div>

CSS

div {
    position: relative;
    overflow: hidden;
}
img {
    filter: blur(5px);
        -webkit-filter: blur(5px);
        -moz-filter: blur(5px);
        -o-filter: blur(5px);
        -ms-filter: blur(5px);
}

Esto también funciona en elementos de tamaño variable, como div dinámicos.

bpanatta
fuente
1

Puede evitar que la imagen se superponga a sus bordes recortando la imagen y aplicando un elemento de envoltura que establece el efecto de desenfoque en 0 píxeles. Así es como esto luce:

HTML

<div id="wrapper">
  <div id="image"></div>
</div>

CSS

#wrapper {
  width: 1024px;
  height: 768px;

  border: 1px solid black;

  // 'blur(0px)' will prevent the wrapped image
  // from overlapping the border
  -webkit-filter: blur(0px);
  -moz-filter: blur(0px);
  -ms-filter: blur(0px);
  filter: blur(0px);
}

#wrapper #image {
  width: 1024px;
  height: 768px;

  background-image: url("../images/cats.jpg");
  background-size: cover;

  -webkit-filter: blur(10px);
  -moz-filter: blur(10px);
  -ms-filter: blur(10px);
  filter: blur(10px);

  // Position 'absolute' is needed for clipping
  position: absolute;
  clip: rect(0px, 1024px, 768px, 0px);
}
Benny Neugebauer
fuente
1

La forma más sencilla es simplemente agregar un borde transparente al div que contiene la imagen y establecer su propiedad de visualización en bloque en línea de la siguiente manera:

CSS:

div{
margin: 2rem;
height: 100vh;
overflow: hidden;
display: inline-block;
border: 1px solid #00000000;
}

img {
-webkit-filter: blur(2rem);
filter: blur(2rem);
}

HTML

<div><img src='https://images.unsplash.com/photo-1557853197-aefb550b6fdc?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=375&q=80' /></div>

Aquí hay un codepen que representa lo mismo: https://codepen.io/arnavozil/pen/ExPYKNZ

arnavpanwar99
fuente
0

Puede intentar agregar el borde en otro elemento:

DOM:

<div><img src="#" /></div>

CSS:

div {
   border: 1px solid black;
}
img {
    filter: blur(5px);
}
Krycke
fuente
0

Descubrí que, en mi caso, no tenía que agregar un contenedor.

Acabo de agregar -

margin: -1px;

o

margin: 1px; // any non-zero margin
overflow: hidden;

Mi elemento borroso estaba absolutamente posicionado.

brendangibson
fuente
volkerotto.net/2014/07/03/…
Mary Pieroszkiewicz
0

Aquí hay una solución que se me ocurrió que mantiene el 100% de la imagen y no se necesita recorte:

Básicamente, hago un espejo en mosaico la imagen en una cuadrícula de 3x3, luego desenfoco todo y luego hago zoom en la imagen central creando efectivamente bordes repetidos al desenfocar efectos posteriores, es un poco extraño que css3 no tenga bordes repetidos integrados.

Enlace al método / código: ¿Cómo desenfocar una imagen usando CSS3 sin recortar o difuminar los bordes?

Patrik Fröhler
fuente
1
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si cambia la página enlazada.
Arnon Zilca
Bueno, sí, es gracioso que digas eso porque acabo de actualizar esa publicación y el título y eso arruinó totalmente el enlace aquí x)
Patrik Fröhler
0

Si está utilizando una imagen de fondo, la mejor manera que encontré es:

filter: blur(5px);
margin-top: -5px;
padding-bottom: 10px;
margin-left: -5px;
padding-right: 10px;
Elad Swissa
fuente