Cách áp dụng bộ lọc CSS cho ảnh nền


467

Tôi có một tệp JPEG mà tôi đang sử dụng làm hình nền cho trang tìm kiếm và tôi đang sử dụng CSS để đặt nó vì tôi đang làm việc trong bối cảnh Backbone.js :

background-image: url("whatever.jpg");

Tôi muốn áp dụng một bộ lọc mờ CSS 3 chỉ để nền, nhưng tôi không chắc chắn làm thế nào để phong cách chỉ là một phần tử. Nếu tôi cố gắng:

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

ngay bên dưới background-imageCSS của tôi, nó tạo kiểu cho toàn bộ trang, thay vì chỉ là nền. Có cách nào để chỉ chọn hình ảnh và áp dụng bộ lọc cho điều đó không? Ngoài ra, có cách nào để tắt mờ cho mọi yếu tố khác trên trang không?


2
Làm mờ chỉ một phần của hình ảnh: codepen.io/vsync/pen/gjMEWm
vsync

Câu trả lời:


528

Kiểm tra cây bút này .

Bạn sẽ phải sử dụng hai thùng chứa khác nhau, một cho hình nền và một cho nội dung của bạn.

Trong ví dụ này, tôi đã tạo ra hai container .background-image.content.

Cả hai đều được đặt với position: fixedleft: 0; right: 0;. Sự khác biệt trong việc hiển thị chúng đến từ các z-indexgiá trị được đặt khác nhau cho các phần tử.

.background-image {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 1;
  display: block;
  background-image: url('https://i.imgur.com/lL6tQfy.png');
  width: 1200px;
  height: 800px;
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
  filter: blur(5px);
}

.content {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 9999;
  margin-left: 20px;
  margin-right: 20px;
}
<div class="background-image"></div>
<div class="content">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend
    rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing,
    quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
  <p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum
    tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
</div>

Lời xin lỗi cho văn bản Lorem Ipsum .

Cập nhật

Cảm ơn Matthew Wilcoxson vì đã triển khai tốt hơn bằng cách sử dụng .content:before http://codepen.io/akademy/pen/FlkzB


79
Một cách tốt hơn để làm điều này là sử dụng .content: trước thay vì đánh dấu "ảnh nền" thêm. Tôi đã cập nhật bút ở đây: codepen.io/akademy/pen/FlkzB
Matthew Wilcoxson

6
fwiw, chỉ Webkit mới triển khai tính năng này và chỉ có tiền tố nhà cung cấp, nên các tiền tố ms-, o-, moz- là vô dụng.
Jon z

2
Nó được hỗ trợ trong Firefox 35.0 trở lên theo mặc định: caniuse.com/#feat=css-filters
Mikko Rantalainen

1
JUst được cập nhật lên FF 35 và nó đang hoạt động mà không có tiền tố
Aamir Mahmood

1
@EdwardBlack Tôi không nghĩ đó là vấn đề nhưng để làm mờ vĩnh viễn, bạn sẽ phải dùng đến các công cụ chỉnh sửa ảnh. Một cách khác có thể là có một số kiểu chụp ảnh bằng trình duyệt webkit không ảo / sau đó phục vụ nó, nhưng đó là một cách tẻ nhạt để đạt được kết quả tương tự.
Aniket

70

cây bút

Xóa bỏ nhu cầu về một yếu tố phụ, cùng với việc làm cho nội dung phù hợp với luồng tài liệu thay vì cố định / tuyệt đối như các giải pháp khác.

Đạt được bằng cách sử dụng

.content {
  overflow: auto;
  position: relative;
}

Tự động tràn là cần thiết, nếu không, nền sẽ được bù bởi một vài pixel ở trên cùng.

Sau này, bạn chỉ cần

.content:before {
  content: "";
  position: fixed;
  left: 0;
  right: 0;
  z-index: -1;

  display: block;
  background-image: url('img-here');
  background-size:cover;
  width: 100%;
  height: 100%;

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

EDIT Nếu bạn muốn loại bỏ các viền trắng ở các cạnh, hãy sử dụng chiều rộng và chiều cao 110%và bên trái và trên cùng -5%. Điều này sẽ phóng to nền của bạn một chút - nhưng sẽ không có hiện tượng chảy màu ở các cạnh.

Bút cập nhật tại đây: https://codepen.io/anon/pen/QgyewB - Cảm ơn Chad Fawcett về gợi ý.


1
Hạn chế của điều này là bạn không thể thao tác các phần tử giả trong js. Nếu bạn không cần, thì đó là một giải pháp tốt.
đặt phòng thí nghiệm vào

6
Nếu bạn không thích các đường viền màu trắng mờ bạn có thể tăng widthheightđến 110%và sau đó thêm một bù đắp của -5%để topleftcủa content:beforelớp.
Chad Fawcett

1
Nó hoạt động với tôi, nhưng tôi muốn hình nền đó cũng được cuộn khi người dùng cuộn trang. Vị trí CỐ ĐỊNH đang dừng lại đó. Làm thế nào để thoát khỏi vấn đề này?
DEEPAN KUMAR

61

Như đã nêu trong các câu trả lời khác, điều này có thể đạt được với:

  • Một bản sao của hình ảnh mờ làm nền.
  • Một phần tử giả có thể được lọc sau đó được định vị phía sau nội dung.

Bạn cũng có thể dùng backdrop-filter

Có một thuộc tính được hỗ trợ được gọi backdrop-filtervà hiện tại nó được hỗ trợ trong Chrome 76, Edge , Safari và iOS Safari (xem caniuse.com để biết số liệu thống kê).

Từ Mozilla devdocs :

Thuộc tính bộ lọc nền cung cấp các hiệu ứng như làm mờ hoặc chuyển màu khu vực phía sau một phần tử, sau đó có thể được nhìn thấy qua phần tử đó bằng cách điều chỉnh độ trong suốt / độ mờ của phần tử.

Xem caniuse.com để biết số liệu thống kê sử dụng.

Bạn sẽ sử dụng nó như vậy:

.background-filter::after {
  -webkit-backdrop-filter: blur(5px); /* Use for Safari 9+, Edge 17+ (not a mistake) and iOS Safari 9.2+ */
  backdrop-filter: blur(5px); /* Supported in Chrome 76 */

  content: "";
  display: block;
  position: absolute;
  width: 100%; height: 100%;
}

.background-filter {
  position: relative;
}

.background {
  background-image: url('https://upload.wikimedia.org/wikipedia/en/6/62/Kermit_the_Frog.jpg');
  width: 200px;
  height: 200px;
}
<div class="background background-filter"></div>

Cập nhật (12/06/2019) : Chromium sẽ xuất xưởng với backdrop-filtertính năng được bật theo mặc định trong phiên bản 76, dự kiến ra mắt vào 30/07/2019 .

Cập nhật (01/06/2019) : Nhóm Firefox Mozzilla đã thông báo sẽ bắt đầu thực hiện việc này sớm.

Cập nhật (21/05/2019) : Chromium vừa được công bố backdrop-filter có sẵn trong chrome canary mà không bật cờ "Bật tính năng nền tảng web thử nghiệm". Điều này có nghĩa backdrop-filterlà rất gần với việc được thực hiện trên tất cả các nền tảng chrome.


5
Ngay cả khi nó không hoạt động trong tất cả các trình duyệt, bạn vẫn nhận được phiếu bầu của tôi vì đã cung cấp cách thức không hack chính xác để thực hiện việc này.
MrMesees

AFAIK đây là một tính năng không chuẩn, vì vậy không có thông số kỹ thuật nào cho nó.
Vitim.us

3
ĐỨNG LÊN! Năm 2018 hỗ trợ trình duyệt đã giảm đáng kể cho việc này! Không được hỗ trợ trong Edge, Firefox hoặc Chrome.
protoEveachion

@protoEvangelion Có vẻ như nó sẽ có sẵn trong Edge 16+ và tôi không thấy bất kỳ trình duyệt nào khác nói rằng họ sẽ không thực hiện điều này. Bất kỳ sự thật để sao lưu những tuyên bố này?
hitautodesturation

@hitautodesturation Theo caniuse.com IE, Edge 16, Firefox và Chrome không hỗ trợ điều này theo mặc định tại thời điểm này. Bạn đã đúng khi Edge 17+ hỗ trợ điều này. Cảm ơn đã chỉ ra rằng. Tuy nhiên, bằng cách này, tôi chắc chắn hy vọng các trình duyệt thực hiện điều này :)
protoEveachion

26

Bạn cần cấu trúc lại HTML của mình để thực hiện việc này. Bạn phải làm mờ toàn bộ thành phần để làm mờ nền. Vì vậy, nếu bạn muốn làm mờ chỉ nền, nó phải là yếu tố riêng của nó.


6

Vui lòng kiểm tra mã dưới đây: -

.backgroundImageCVR{
	position:relative;
	padding:15px;
}
.background-image{
	position:absolute;
	left:0;
	right:0;
	top:0;
	bottom:0;
	background:url('http://www.planwallpaper.com/static/images/colorful-triangles-background_yB0qTG6.jpg');
	background-size:cover;
	z-index:1;
	-webkit-filter: blur(10px);
  -moz-filter: blur(10px);
  -o-filter: blur(10px);
  -ms-filter: blur(10px);
  filter: blur(10px);	
}
.content{
	position:relative;
	z-index:2;
	color:#fff;
}
<div class="backgroundImageCVR">
    <div class="background-image"></div>
    <div class="content">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing, quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
      <p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
    </div>
</div>


5

Sau đây là một giải pháp đơn giản cho các trình duyệt hiện đại trong CSS thuần với phần tử giả 'trước', giống như giải pháp từ Matthew Wilcoxson.

Để tránh sự cần thiết phải truy cập phần tử giả để thay đổi hình ảnh và các thuộc tính khác trong JavaScript, chỉ cần sử dụng inheritlàm giá trị và truy cập chúng thông qua phần tử cha (ở đây body).

body::before {
    content: ""; /* Important */
    z-index: -1; /* Important */
    position: inherit;
    left: inherit;
    top: inherit;
    width: inherit;
    height: inherit;
    background-image: inherit;
    background-size: cover;
    filter: blur(8px);
}

body {
  background-image: url("xyz.jpg");
  background-size: 0 0;  /* Image should not be drawn here */
  width: 100%;
  height: 100%;
  position: fixed; /* Or absolute for scrollable backgrounds */
}

Nó không làm việc cho tôi. Bạn có một jsfiddle làm việc?
Matt

2

Trong .contenttab trong CSS thay đổi nó thành position:absolute. Nếu không, trang được hiển thị sẽ không thể cuộn được.


1

Mặc dù tất cả các giải pháp được đề cập đều rất thông minh, nhưng tất cả dường như có vấn đề nhỏ hoặc tiềm năng gây ảnh hưởng với các yếu tố khác trên trang khi tôi thử chúng.

Cuối cùng, để tiết kiệm thời gian, tôi chỉ đơn giản quay lại giải pháp cũ của mình: Tôi đã sử dụng Paint.NET và đi đến Effects, Gaussian Blur với bán kính 5 đến 10 pixel và chỉ lưu nó dưới dạng hình ảnh trang. :-)

HTML:

<body class="mainbody">
</body

CSS:

body.mainbody
{
    background: url('../images/myphoto.blurred.png');
    -moz-background-size: cover;
    -webkit-background-size: cover;
    background-size: cover;
    background-position: top center !important;
    background-repeat: no-repeat !important;
    background-attachment: fixed;
}

BIÊN TẬP:

Cuối cùng tôi đã làm cho nó hoạt động, nhưng giải pháp không có nghĩa là đơn giản! Xem tại đây:


bạn tải xuống 2 hình ảnh
Ced

1

Tất cả những gì bạn thực sự cần là "bộ lọc":

blurWhatEverYouWantInPixels»);"

body {
    color: #fff;
    font-family: Helvetica, Arial, sans-serif;
}

#background {
    background-image: url('https://cdn2.geckoandfly.com/wp-content/uploads/2018/03/ios-11-3840x2160-4k-5k-beach-ocean-13655.jpg');
    background-repeat: no-repeat;
    background-size: cover;
    width: 100vw;
    height: 100vh;
    overflow: hidden;
    position: absolute;
    top: 0;
    left: 0;
    z-index: -1;

    /* START */
    /* START */
    /* START */
    /* START */

    /* You can adjust the blur-radius as you'd like */
    filter: blur(3px);
}
<div id="background"></div>

<p id="randomContent">Lorem Ipsum</p>


1

Tất nhiên, đây không phải là giải pháp CSS, nhưng bạn có thể sử dụng CDN Proton với filter:

body {
    background: url('https://i0.wp.com/IMAGEURL?w=600&filter=blurgaussian&smooth=1');
}

Đó là từ https://developer.wordpress.com/docs/photon/api/#filter


Bất kỳ cách khéo léo để làm cho điều này làm việc localhosttrong khi thử nghiệm?
Jonathan

Lượng mờ cho hình ảnh độ phân giải lớn quá tinh tế, làm cách nào để tôi tăng đáng kể lượng mờ mà không làm nó trông có vẻ khối? Chiều rộng giúp một chút, nhưng nó trông quá khối nếu tôi làm mờ quá nhiều
Jonathan

0

Tôi đã không viết điều này, nhưng tôi nhận thấy có một polyfill được hỗ trợ một phần backdrop-filterbằng trình biên dịch CSS SASS, vì vậy nếu bạn có một đường dẫn biên dịch thì nó có thể đạt được một cách độc đáo (nó cũng sử dụng TypeScript):

https://codepen.io/mixal_bl4/pen/EwPMWo


0

div {
    background: inherit;
    width: 250px;
    height: 350px;
    position: absolute;
    overflow: hidden;  /* Adding overflow hidden */
}

div:before {
    content: ‘’;
    width: 300px;
    height: 400px;
    background: inherit;
    position: absolute;
    left: -25px;  /* Giving minus -25px left position */
    right: 0;
    top: -25px;   /* Giving minus -25px top position */
    bottom: 0;
    box-shadow: inset 0 0 0 200px rgba(255, 255, 255, 0.3);
    filter: blur(10px);
}


0

Câu trả lời này dành cho bố cục thẻ ngang Thiết kế Vật liệu với chiều cao động và hình ảnh.

Để tránh làm biến dạng hình ảnh do chiều cao động của thẻ, bạn có thể sử dụng hình ảnh giữ chỗ nền có độ mờ để điều chỉnh các thay đổi về chiều cao.

 

Giải trình

  • Thẻ được chứa trong một <div>lớp bao bọc , là một hộp linh hoạt.
  • Thẻ được tạo thành từ hai yếu tố, một hình ảnh cũng là một liên kết và nội dung.
  • Các liên kết <a>, lớp liên kết , được bố trí tương đối .
  • Liên kết bao gồm hai thành phần phụ, mờ<div> lớp giữ chỗ và pic lớp là hình ảnh rõ ràng.<img>
  • Cả hai đều được định vị tuyệt đối và có width: 100%, nhưng lớp pic có thứ tự ngăn xếp cao hơn, nghĩa là, z-index: 2đặt nó lên trên trình giữ chỗ.
  • Hình nền cho trình giữ chỗ bị mờ được đặt thông qua kiểu nội tuyến trong HTML.

 

.wrapper {
  display: flex;
  width: 100%;
  border: 1px solid rgba(0, 0, 0, 0.16);
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.16), 0 1px 1px rgba(0, 0, 0, 0.23);
  background-color: #fff;
  margin: 1rem auto;
  height: auto;
}

.wrapper:hover {
  box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);
}

.link {
  display: block;
  width: 200px;
  height: auto;
  overflow: hidden;
  position: relative;
  border-right: 2px solid #ddd;
}

.blur {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 100%;
  height: 100%;
  filter: blur(5px);
  -webkit-filter: blur(5px);
  -moz-filter: blur(5px);
  -o-filter: blur(5px);
  -ms-filter: blur(5px);
}

.pic {
  width: calc(100% - 20px);
  max-width: 100%;
  height: auto;
  margin: auto;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
}

.pic:hover {
  transition: all 0.2s ease-out;
  transform: scale(1.1);
  text-decoration: none;
  border: none;
}

.content {
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 100%;
  padding: 20px;
  overflow-x: hidden;
}

.text {
  margin: 0;
}
<div class="wrapper">
  <a href="#" class="link">
    <div class="blur" style="background: url('http://www.planwallpaper.com/static/assets/img/header.jpg') 50% 50% / cover;"></div>
    <img src="http://www.planwallpaper.com/static/assets/img/header.jpg" alt="Title" class="pic" />
  </a>

  <div class="content">
    <p class="text">Agendum dicendo memores du gi ad. Perciperem occasionem ei ac im ac designabam. Ista rom sibi vul apud tam. Notaverim to extendere expendere concilium ab. Aliae cogor tales fas modus parum sap nullo. Voluntate ingressus infirmari ex mentemque ac manifeste
      eo. Ac gnum ei utor sive se. Nec curant contra seriem amisit res gaudet adsunt. </p>
  </div>
</div>


0

Bây giờ điều này thậm chí còn trở nên đơn giản và linh hoạt hơn bằng cách sử dụng CSS GRID. Bạn chỉ cần chồng chéo nền mờ (imgbg) với văn bản (h2)

<div class="container">
 <div class="imgbg"></div>
 <h2>
  Lorem ipsum dolor sit amet consectetur, adipisicing elit. Facilis enim
  aut rerum mollitia quas voluptas delectus facere magni cum unde?:)
 </h2>
</div>

và css:

.container {
        display: grid;
        width: 30em;
      }

.imgbg {
        background: url(bg3.jpg) no-repeat center;
        background-size: cover;
        grid-column: 1/-1;
        grid-row: 1/-1;
        filter: blur(4px);
      }


     .container h2 {
        text-transform: uppercase;
        grid-column: 1/-1;
        grid-row: 1/-1;
        z-index: 2;
      }

0
$fondo: url(/grid/assets/img/backimage.png);    
{ padding: 0; margin: 0; } 
body { 
    ::before{
        content:"" ; height: 1008px; width: 100%; display: flex; position: absolute; 
        background-image: $fondo ; background-repeat: no-repeat ; background-position: 
        center; background-size: cover; filter: blur(1.6rem);
    }
}

1
Thêm lời giải thích cho câu trả lời của bạn sẽ là tuyệt vời.
Arvind Maurya

Whit Sass tôi đặt mã tiếp theo, và tôi đã vẽ tất cả các mục trên cơ thể, có thể yêu cầu trợ giúp để chỉ có một hình ảnh trên nền cơ thể ????? $ fondo: url (/grid/assets/img/backimage.png); {đệm: 0; lề: 0; } thân {:: trước {nội dung: ""; chiều cao: 1008px; chiều rộng: 100%; hiển thị: flex; vị trí: tuyệt đối; ảnh nền: $ fondo; lặp lại nền: không lặp lại; vị trí nền: trung tâm; kích thước nền: bìa; bộ lọc: mờ (1.6rem); }}
Carlos Boyzo

0

Không sử dụng lớp giả từ

body{
    background:#cecece;
    font-family: "Scope One", serif;
    font-size: 12px;
    color:black;
    margin:0 auto;
    height:100%;
    width:100%;
    background-image: 
       linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.81)), 
        url(https://i.imgur.com/2rRMQh7.jpg);
       -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover; 
}
<body></body>


-6

Nếu bạn muốn nội dung có thể cuộn được, hãy đặt vị trí của nội dung thành tuyệt đối:

content {
   position: absolute;
   ...
}

Tôi không biết nếu điều này chỉ dành cho tôi, nhưng nếu không thì đó là cách khắc phục!

Ngoài ra, vì nền được cố định, điều đó có nghĩa là bạn có hiệu ứng "thị sai" ! Vì vậy, bây giờ, người này không chỉ dạy bạn cách làm mờ hậu cảnh mà còn là hiệu ứng nền thị sai!


4
không trả lời câu hỏi
gorn 14/2/2017
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.