Не так давно мне пришлось довольно тщательно исследовать эту проблему, и я нашел чрезвычайно гибкое решение, хотя оно может быть излишним для нужд некоторых людей.Мне нужны были не только размытые изображения, но и динамический радиус размытия, цвет наложения и непрозрачность наложения для различных типов изображений.Мне также нужно было иметь возможность просто размыть изображение на заднем плане с наложенными поверх него другими элементами.Вот лучшее кросс-браузерное (и эффективное) решение, которое я смог создать.
Во-первых, у меня под рукой был бы SVG, беззвучно называемый blur.svg
.Он применяет фильтр размытия, и если вы внимательно посмотрите, stdDeviation
(который устанавливает радиус размытия) фактически устанавливается программно из переданного параметра в URL-адрес, запрашивающий актив.
<?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>
Тогда у меня былосмесь SCSS, которая позволила бы добавить наложение размытия к любой обертке с настраиваемым радиусом размытия, цветом наложения и непрозрачностью наложения.
@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;
}
}
Возможно, вам интересно, почему я включил transform: translateZ(0);
.Единственный эффект - принудительное аппаратное ускорение рендера для поддержания производительности.Вам также может быть интересно, почему нет префиксов поставщиков.Вы можете искать такие вещи, как filter
на CanIUse , если хотите, но я использовал autoprefixer в этом проекте, чтобы беспокоиться обо мне.И, конечно же, зачем фильтровать, используя этот SVG, а не что-то вроде blur(4px)
?Разве это не будет проще?Это возможно, но Firefox (на момент написания) поддерживает только свойство filter
с URL-адресом.
Затем вы можете применить миксин размытия к классу-оболочке:
.my_wrapper_class {
@include background_blurred(3, #f9f7f5, 0.7);
}
Обратите внимание,для этого метода мы должны использовать класс с пользовательским фоном, установленным в атрибуте style вместо тега image с src.Вы можете изменить положение фона и изменить размер фона по своему вкусу.
<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>