tôi đã phải khá triệt để nghiên cứu vấn đề này không quá lâu và đã đưa ra một giải pháp cực kỳ linh hoạt, mặc dù nó có thể là quá mức cần thiết cho nhu cầu của một số người. Tôi không chỉ cần hình ảnh mờ, mà còn là bán kính mờ động, màu lớp phủ và độ mờ lớp phủ cho các loại hình ảnh khác nhau. Tôi cũng cần có tùy chọn chỉ làm mờ hình ảnh trong nền với các yếu tố khác được xếp chồng lên trên nó. Đây là giải pháp cross-browser (và performant) tốt nhất mà tôi có thể tạo ra.
Trước tiên, tôi có một SVG trên tay, được gọi là blur.svg
. Nó áp dụng bộ lọc mờ và nếu bạn nhìn kỹ, stdDeviation
(đặt bán kính mờ) thực sự được đặt theo chương trình từ tham số được truyền vào URL yêu cầu nội dung.
<?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>
Sau đó, tôi đã có một mixin SCSS mà sẽ cho phép một để thêm một lớp phủ mờ cho bất kỳ wrapper, với bán kính mờ tùy biến, màu overlay, và che phủ mờ.
@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;
}
}
Bạn có thể thắc mắc tại sao tôi bao gồm transform: translateZ(0);
. Hiệu ứng duy nhất có là buộc tăng tốc phần cứng trên render để giữ cho mọi thứ có hiệu năng. Bạn cũng có thể tự hỏi tại sao không có tiền tố của nhà cung cấp. Bạn có thể tìm kiếm những thứ như filter
trên CanIUse nếu bạn muốn, nhưng tôi đã sử dụng autoprefixer trong dự án này để lo lắng về nội dung đó cho tôi. Và tất nhiên, tại sao bộ lọc bằng cách sử dụng SVG này, thay vì với một cái gì đó như blur(4px)
? Sẽ không dễ dàng hơn sao? Nó sẽ, nhưng Firefox (bằng văn bản) chỉ hỗ trợ các tài sản filter
với một URL.
Sau đó, bạn có thể áp dụng mixin mờ về một lớp wrapper:
.my_wrapper_class {
@include background_blurred(3, #f9f7f5, 0.7);
}
Chú ý rằng đối với phương pháp này, chúng ta phải sử dụng một lớp với một nền tùy chỉnh thiết lập trong một thuộc tính style thay vì một thẻ hình ảnh với một src. Bạn có thể tinh chỉnh vị trí nền và ghi đè kích thước nền theo ý thích của bạn.
<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>
Tôi bị gộp. +1. Có thể tò mò muốn xem một số giải pháp. – mrtsherman