tuve que investigar bastante a fondo este problema no hace mucho tiempo y se le ocurrió una solución extremadamente flexible, aunque puede ser excesiva para las necesidades de algunas personas. Necesitaba no solo imágenes borrosas, sino también un radio de desenfoque dinámico, color de superposición y opacidad de superposición para varios tipos de imágenes. También necesitaba tener la opción de difuminar una imagen en un fondo con otros elementos superpuestos encima. Esta es la mejor solución entre navegadores (y rendimiento) que pude crear.
En primer lugar, tendría un SVG a mano, poco inspirado llamado blur.svg
. Se aplica un filtro de desenfoque y si se mira de cerca, el stdDeviation
(que establece el radio de desenfoque) se establece de manera programática desde un parámetro pasado a la URL que solicita el activo.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
<filter id="blur">
<feGaussianBlur stdDeviation="#{params[:blur]}" />
</filter>
</svg>
Luego tuve un mixin SCSS que permitiría en añadir una superposición de desenfoque a cualquier envoltura, con un radio de desenfoque personalizable, color de superposición y de opacidad.
@mixin background_blurred($blur_radius:4, $overlay_color:white, $overlay_opacity:0.6) {
position: relative;
.background_blurred {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 1;
filter: url('blur.svg#blur?blur=#{$blur_radius}');
filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='#{$blur_radius}');
transform: translateZ(0);
&:after {
content: '';
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background: $overlay_color;
opacity: $overlay_opacity;
}
}
.foreground {
width: 100%;
height: 100%;
position: relative;
z-index: 2;
}
}
Es posible que se pregunte por qué he incluido un transform: translateZ(0);
. El único efecto que tiene es forzar la aceleración de hardware en el render para mantener las cosas en perfectas condiciones. También es posible que se pregunte por qué no hay prefijos de proveedor. Puede buscar cosas como filter
en CanIUse si lo desea, pero usé autoprefixer en este proyecto para preocuparme por esas cosas. Y por supuesto, ¿por qué filtrar usando este SVG, en lugar de algo como blur(4px)
? ¿No sería más fácil? Lo haría, pero Firefox (por escrito) solo admite la propiedad filter
con una URL.
A continuación, se puede aplicar el mixin falta de definición de una clase contenedora:
.my_wrapper_class {
@include background_blurred(3, #f9f7f5, 0.7);
}
Tenga en cuenta que para este método, tenemos que utilizar una clase con un fondo personalizado situado en un atributo de estilo en lugar de una etiqueta de imagen con un src. Puede ajustar la posición de fondo y anular el tamaño de fondo a su gusto.
<div class="my_wrapper_class">
<div class="background_blurred" style="background: url('URL OF IMAGE TO BLUR') no-repeat; background-position: 50% 0;"></div>
<div class="foreground">
<p>Stuff that should appear above the blurred background and not be blurred.</p>
</div>
</div>
Estoy perplejo. +1. Sería curioso ver algunas soluciones. – mrtsherman