Hiệu ứng lớp phủ mờ của iOS 7 bằng CSS?


161

Có vẻ như lớp phủ của Apple không chỉ là một sự minh bạch. Có ý tưởng nào về cách đạt được hiệu ứng này với CSS và có thể là JS không?

Không chỉ là sự minh bạch


2
Theo tôi, một mối quan tâm cấp bách hơn là làm thế nào để thiết lập một yếu tố áp dụng độ mờ động cho bất kỳ đối tượng nào phía sau nó. Vì vậy, nếu bạn có một đối tượng có thể xoay và thu phóng, phần tử trên cùng sẽ tự động mờ đi với hiệu năng thấp.
Rhodes

1
Xem thêm câu hỏi này cho một vấn đề tương tự.
Keith

43
Tôi thấy có lẽ đáng lo ngại nhất là đây là một tính năng 'IOS7' trong khi giao diện Windows Vista Aero đã làm điều tương tự với các sắc độ cửa sổ của nó kể từ năm 2006.
Niels Keurentjes

1
@NielsKeurentjes Heh, một điểm đúng. Tôi đã kết hợp hiệu ứng vào một thiết kế vài năm trước sau khi được truyền cảm hứng từ Windows. Tuy nhiên, hồi đó tôi đã đi theo con đường đơn giản hơn chỉ là nướng hiệu ứng vào hình ảnh. ryanwilliams.co.uk/previews/ADE2race/1.html
Ryan Williams

Câu trả lời:


145

Có thể với CSS3:

#myDiv {
    -webkit-filter: blur(20px);
    -moz-filter: blur(20px);
    -o-filter: blur(20px);
    -ms-filter: blur(20px);
    filter: blur(20px);
    opacity: 0.4;
}

Ví dụ ở đây => jsfiddle


119
Điều này không đạt được hiệu ứng như trong iOS7 khi một phần tử làm mờ các phần của nền.
Thiết kế của Adrian

9
Tôi đã chỉnh sửa jsfiddle của mình, bây giờ nó thực hiện thủ thuật như IOS7;) => CSS3 Hiệu ứng IOS7
Cana

34
Như Adrian lưu ý, bộ lọc chỉ làm mờ một yếu tố và đó là trẻ em. Nó không thể được sử dụng cho lớp phủ để làm mờ các phần tử cha hoặc các phần tử lân cận, do đó, hiệu ứng iOS 7 là không thể với CSS.
Jason

10
Nếu bạn nghĩ rằng nó chỉ làm mờ đi để đạt được hiệu ứng này thì bạn đã nhầm. Tôi đang làm việc trên một kho lưu trữ nguồn mở đơn giản để đạt được hiệu ứng này bằng cả JS và CSS 3, hãy theo dõi :)
Ryan Brodie

5
Điều này không hoạt động trong FX - họ không hỗ trợ -moz-filter: blur(). Thay vào đó, bạn phải sử dụng bộ lọc SVG, xem câu trả lời của tôi để biết chi tiết.
Keith

48

Bạn làm cho tôi muốn thử, vì vậy tôi đã làm, hãy xem ví dụ ở đây:

http://codepen.io/Edo_B/pen/cLbrt

Sử dụng:

  1. Bộ lọc CSS được tăng tốc
  2. JS để gán lớp và các sự kiện chính mũi tên
  3. Hình ảnh thuộc tính CSS Clip

đó là nó.

Tôi cũng tin rằng điều này có thể được thực hiện linh hoạt cho bất kỳ màn hình nào nếu sử dụng canvas để sao chép dom hiện tại và làm mờ nó.


40

[Chỉnh sửa] Trong tương lai (di động) Safari 9 sẽ có -webkit-backdrop-filterchính xác điều này. Xem cây bút này tôi đã làm để giới thiệu nó.

Tôi đã nghĩ về điều này trong 4 tuần qua và đưa ra giải pháp này.

Bản thử trực tiếp

[Chỉnh sửa] Tôi đã viết một bài viết sâu sắc hơn về CSS-Tricks

Kỹ thuật này đang sử dụng Vùng CSS nên hỗ trợ trình duyệt không phải là tốt nhất tại thời điểm này. ( http://caniuse.com/#feat=css-regions )

Phần quan trọng của kỹ thuật này là tách nội dung khỏi bố cục bằng cách sử dụng Vùng CSS. Đầu tiên xác định một .contentphần tử với flow-into:contentvà sau đó sử dụng cấu trúc phù hợp để làm mờ tiêu đề.

Cấu trúc bố trí:

<div class="phone">
 <div class="phone__display">
  <div class="header">
    <div class="header__text">Header</div>
    <div class="header__background"></div>
  </div>
  <div class="phone__content">
  </div>
 </div>
</div>

Hai phần quan trọng của bố cục này là .header__background.phone__content- đây là các thùng chứa nội dung nên chảy.

Sử dụng các Vùng CSS, nó đơn giản như flow-from:content( .contentđang chảy vào vùng được đặt tên content)

Bây giờ đến phần khó khăn. Chúng tôi muốn luôn luôn truyền nội dung thông qua .header__backgroundvì đó là phần mà nội dung sẽ bị xóa. (sử dụng webkit-filter:blur(10px);)

Này được thực hiện bởi transfrom:translateY(-$HeightOfTheHeader)các .contentđể đảm bảo rằng nội dung sẽ luôn luôn chảy dù .header__background. Biến đổi này trong khi luôn ẩn một số nội dung bên dưới tiêu đề. Sửa lỗi này là dễ dàng thêm

.header__background:before{
  display:inline-block;
  content:'';
  height:$HeightOfTheHEader
}

để phù hợp với sự biến đổi.

Điều này hiện đang làm việc trong:

  • Chrome 29+ (bật 'tính năng thử nghiệm webkit' / 'enable-thử nghiệm-nền tảng web')
  • Hạt giống Safari 6.1
  • iOS7 ( chậm và không cuộn )

1
Bản demo trực tiếp không còn hoạt động. Nội dung nằm bên dưới điện thoại và tôi gặp lỗi JS "TypeError: sheet.addRule không phải là một chức năng"
BoffinBrain

Hoạt động tốt với Safari trên Mac và iOS.
Carlos Silva

16

Điều này là có thể với FireFox bây giờ nhờ thuộc tính kiểu phần tử .

Thuộc tính thử nghiệm này cho phép bạn sử dụng bất kỳ nội dung HTML nào làm hình nền. Vì vậy, để tạo nền bạn cần ba lớp phủ:

  1. Lớp phủ đơn giản với nền vững chắc (để ẩn nội dung lớp phủ thực).
  2. Lớp phủ với một -moz-elementnền tảng đặt nội dung. Lưu ý rằng FX không hỗ trợ filter: blur()thuộc tính, vì vậy chúng tôi cần cho chúng tôi một SVG.
  3. Lớp phủ với nội dung không mờ.

Vì vậy, đặt cùng nhau:

Bộ lọc mờ SVG (hoạt động trong FX, các trình duyệt khác có thể sử dụng filter:blur()):

<svg>
  <defs>
    <filter id="svgBlur">
      <feGaussianBlur stdDeviation="10"/>
    </filter>
  </defs>
</svg>

Phong cách mờ CSS:

.behind-blur 
{
    filter         : url(#svgBlur); 
    opacity: .4;
    background: -moz-element(#content);
    background-repeat: no-repeat;
}

Cuối cùng là 3 lớp:

<div class="header" style="background-color: #fff">&nbsp;</div>
<div class="header behind-blur">&nbsp;</div>
<div class="header">
    Header Text, content blurs behind
</div>

Sau đó, để di chuyển cái này xung quanh, chỉ cần đặt background-position(mẫu trong jQuery nhưng bạn có thể sử dụng bất cứ thứ gì):

$('.behind-blur').css({
    'background-position': '-' + left + 'px -' + top + 'px'
}); 

Ở đây nó chỉ là một Fiddle JS, chỉ FX.


1
Giải pháp của bạn tương tự như tôi đã nghĩ. Tôi đã sửa lỗi trục trặc ( jsfiddle.net/RgBzH/30 ) bằng cách mở rộng lát nền bị mờ, do đó, hiện tượng mờ thực sự xảy ra trên nội dung thực chứ không phải phần bị cắt. Thực hiện tốt, dù sao.
Cầu tàu Paolo Ramon

@PierPaoloRamon tinh chỉnh tốt - tôi sẽ sử dụng điều này có lẽ tôi sẽ mở rộng bộ lọc SVG một chút để bao gồm độ sáng tăng / giảm độ tương phản mà iOS7 cũng vậy, nhưng FX chỉ có nghĩa là hộp cát hoàn toàn vào thời điểm này. Tôi đã hỏi một câu hỏi khác về cách giải quyết.
Keith

BTW, giải pháp của bạn chỉ mang lại sự mờ ảo giống như ios7 cho Firefox OS, và điều đó thật gọn gàng (tôi phải kiểm tra điều đó).
Cầu tàu Paolo Ramon

14

Kiểm tra trang demo này.
Bản demo này sử dụng html2canvas để hiển thị tài liệu dưới dạng hình ảnh.

http://blurpopup.labs.daum.net/

  1. Khi nhấp vào liên kết "Hiển thị cửa sổ bật lên", chức năng 'makePopup' được gọi.
  2. 'makePopup' chạy html2canvas để hiển thị tài liệu dưới dạng hình ảnh.
  3. Hình ảnh được chuyển đổi thành chuỗi url dữ liệu và nó được vẽ dưới dạng hình nền của cửa sổ bật lên.
  4. Bg của Popup bị làm mờ bởi -webkit-filter: Blur
  5. Nối cửa sổ bật lên vào tài liệu.
  6. Trong khi bạn đang kéo cửa sổ bật lên, nó sẽ thay đổi vị trí nền của chính nó.

1
Vui lòng cung cấp giải thích về những gì bản demo thực sự làm kể từ khi nó bị hỏng, nó sẽ không giúp được gì.
Jonathan Drapeau

Đó là một ý tưởng thực sự hay - thật không may, html2canvas chỉ là quá thử nghiệm để được dựa vào và có lẽ chỉ quá lớn trừ khi ảnh chụp màn hình là những gì ứng dụng của bạn hướng tới.
Keith

5
nó xuống @JonathanDrapeau như bạn dự đoán.
Đánh dấu

Woo! Tôi yêu thối liên kết!
Evolutionxbox

Vẫn sử dụng làm mờ các hình ảnh, tôi không thấy làm thế nào điều này có thể hoạt động trên một cái gì đó giống như một thanh điều hướng dính.
maninak

10

Cây bút này tôi thấy ngày khác dường như làm nó rất đẹp, chỉ cần một chút css và 21 dòng javascript. Tôi đã không nghe về lệnh cloneNode js cho đến khi tôi tìm thấy nó, nhưng nó hoàn toàn hoạt động cho những gì tôi cần chắc chắn.

http://codepen.io/rikschennink/pen/zvcgx

Chi tiết: A. Về cơ bản, nó nhìn vào div nội dung của bạn và gọi một cloneNode trên đó để nó tạo ra một bản sao mà sau đó nó đặt bên trong tràn: đối tượng tiêu đề ẩn nằm ở đầu trang. B. Sau đó, nó chỉ đơn giản là nghe để cuộn sao cho cả hai hình ảnh có vẻ khớp và làm mờ hình ảnh tiêu đề ... thông báo BAM. Hiệu quả đạt được.

Không thực sự hoàn toàn có thể làm được trong CSS cho đến khi họ có được một chút khả năng kịch bản được tích hợp vào ngôn ngữ.


Trông thật tuyệt! Mặc dù điều này rõ ràng sẽ không hoạt động tốt với nội dung động, trừ khi bạn cập nhật bản sao mỗi khi có bất kỳ thay đổi nào - đó có thể là một thành tích lớn.
Nass

Tôi cho rằng, nhưng không thực sự chắc chắn nơi bạn sẽ thay đổi hình ảnh ra và cố gắng thực hiện hiệu ứng này? Nếu được thực hiện đúng cách, nó không nên là một cú hích lớn nếu bạn tái chế bản sao. Có lẽ bạn có thể chi tiết một trường hợp ngược lại với điều này? Ví dụ: bạn tạo nguồn cấp hình ảnh và muốn có một số tùy chọn menu xuất hiện với hiệu ứng này cho menu hình ảnh cho mỗi mục ... hãy chạy nó khi bạn tiết lộ bảng điều khiển và bảng điều khiển lớp phủ sau đó sẽ trông giống như poster muốn. Thêm một trình tái chế nhỏ để dom không lặp lại hình ảnh mỗi lần bạn mở menu và nó sẽ hoạt động tốt.
Lux.Capacitor

5
  • nhân bản yếu tố bạn muốn làm mờ
  • nối nó vào phần tử bạn muốn ở trên cùng (cửa sổ mờ)
  • yếu tố nhân bản mờ với bộ lọc webkit
  • đảm bảo yếu tố nhân bản được định vị tuyệt đối
  • khi cuộn phần tử gốc của phần tử gốc, hãy xem scrollTop và scrollLeft
  • bằng cách sử dụng requestAnimationFrame, giờ đây, tự động đặt biến đổi webkit thành translate3d với các giá trị x và y thành scrollTop và scrollLeft

Ví dụ ở đây:

  • đảm bảo mở trong trình duyệt webkit
  • cuộn bên trong chế độ xem điện thoại (tốt nhất với chuột táo ...)
  • xem chân trang mờ trong hành động

http://versie1.com/TEST/ios7/


4

đã thực hiện một bản demo nhanh ngày hôm qua thực sự làm những gì bạn đang nói. http://bit.ly/10clOM9 bản demo này thực hiện thị sai dựa trên gia tốc kế để nó hoạt động tốt nhất trên chính iPhone. Về cơ bản, tôi chỉ sao chép nội dung mà chúng ta đang chồng vào một yếu tố vị trí cố định bị mờ.

lưu ý: vuốt lên để xem bảng điều khiển.

(tôi đã sử dụng id css khủng khiếp nhưng bạn hiểu ý)

#frost{
 position: fixed; 
 bottom: 0; 
 left:0; 
 width: 100%; 
 height: 100px; 
 overflow: hidden;
 -webkit-transition: all .5s;
}
#background2{
 -webkit-filter: blur(15px) brightness(.2);
}

#content2fixed{
 position: fixed;
 bottom: 9px;
 left: 9px;
 -webkit-filter: blur(10px);
}

3

Tôi không chắc lắm về điều đó, tôi tin rằng CSS không có khả năng làm điều này vào lúc này

Tuy nhiên, Chris Coyier đã viết blog về một kỹ thuật cũ với nhiều hình ảnh để đạt được hiệu quả như vậy, http://css-tricks.com/blurry-background-effect/


Ảnh chụp màn hình vào khung vẽ có thể hoạt động và 'khóa' các biểu tượng và nền cùng nhau trước khi thực hiện việc này, nhưng tôi không thể biết liệu hậu cảnh có còn hiệu ứng thị sai dưới các biểu tượng khi bị mờ không ... nếu nó không bị mờ Sau đó, khi bạn bắt đầu di chuyển bảng điều khiển (lớp phủ trong suốt), thiết bị sẽ tạo ra một hình ảnh của màn hình và thực hiện quá trình lừa đảo này. Xin lưu ý bạn, họ không chỉ bị giới hạn bởi những thứ dựa trên web như canvas khi thực hiện việc này vì nó ở cấp độ os và có thể không bị giới hạn đối với công cụ webkit.
khét tiếng

3

Kiểm tra cái này ra http://codepen.io/GianlucaGuarini/pen/Hzrhf Có vẻ như nó có hiệu ứng mà không sao chép hình nền của phần tử bên dưới. Xem các văn bản được làm mờ cũng trong ví dụ.

Vague.js

var vague = $blurred.find('iframe').Vague({
  intensity:5 //blur intensity
});
vague.blur();

1
sao chép nội dung (có hai iframe trong ví dụ codepen mà bạn đã liên kết). Hãy thử nhấp vào một mục menu, iframe mờ không cập nhật.
Guglie

Dù sao đó cũng là một giải pháp.
Onur Çelik

2

Tin tốt

Kể từ ngày hôm nay 11 tháng 4 năm 2020 , điều này có thể dễ dàng với backdrop-filterthuộc tính CSS hiện là tính năng ổn định trong Chrome, Safari & Edge.

Tôi muốn điều này trong ứng dụng di động lai của chúng tôi để cũng có sẵn trong Android / Chrome Webview & Safari WebView.

  1. https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter
  2. https://caniuse.com/#search=backdrop-filter

Mã ví dụ:

Chỉ cần thêm thuộc tính CSS:

.my-class {
    backdrop-filter: blur(30px);
    background: transparent;     // Make sure there is not backgorund
}

UI Ví dụ 1

Xem nó hoạt động trong cây bút này hoặc thử bản demo:

#main-wrapper {
  width: 300px;
  height: 300px;
  background: url("https://i.picsum.photos/id/1001/500/500.jpg") no-repeat center;
  background-size: cover;
  position: relative;
  overflow: hidden;
}

.my-effect {
  position: absolute;
  top: 300px;
  left: 0;
  width: 100%;
  height: 100%;
  font-size: 22px;
  display: flex;
  justify-content: center;
  align-items: center;
  color: black;
  -webkit-backdrop-filter: blur(15px);
  backdrop-filter: blur(15px);
  transition: top 700ms;
}

#main-wrapper:hover .my-effect {
  top: 0;
}
<h4>Hover over the image to see the effect</h4>

<div id="main-wrapper">
  <div class="my-effect">
    Glossy effect worked!
  </div>
</div>

UI Ví dụ 2

Hãy lấy một ví dụ về ứng dụng McDonald vì nó khá sặc sỡ. Tôi lấy ảnh chụp màn hình của nó và thêm làm nền trong bodyứng dụng của mình.

Tôi muốn hiển thị một văn bản trên nó với hiệu ứng bóng. Sử dụng backdrop-filter: blur(20px);lớp phủ bên trên nó, tôi có thể thấy điều này:

Ảnh chụp màn hình chính nhập mô tả hình ảnh ở đây


backdrop-filtervẫn không hoạt động tự động trong Firefox. Tôi nghi ngờ rằng người dùng sẽ bật các tùy chọn để kích hoạt có backdrop-filterchủ ý chỉ để thấy hiệu ứng này.
Richard

0

Tôi đã sử dụng các bộ lọc svg để đạt được các hiệu ứng tương tự cho các họa tiết

<svg id="gray_calendar" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 48 48 48">
  <filter id="greyscale">
    <feColorMatrix type="saturate" values="0"/>
  </filter>
  <image width="48" height="10224" xlink:href="tango48i.png" filter="url(#greyscale)"/>
</svg>
  • Thuộc tính viewBox sẽ chỉ chọn một phần hình ảnh bạn muốn.
  • Chỉ cần thay đổi bộ lọc thành bất kỳ bộ lọc nào bạn muốn, chẳng hạn như <feGaussianBlur stdDeviation="10"/>ví dụ của Keith .
  • Sử dụng <image ...>thẻ để áp dụng nó cho bất kỳ hình ảnh hoặc thậm chí sử dụng nhiều hình ảnh.
  • Bạn có thể xây dựng nó với js và sử dụng nó như một hình ảnh hoặc sử dụng id trong css của bạn.

Bạn có tình cờ có một ví dụ làm việc này ở đâu đó không? Có lẽ là một jsFiddle hoặc tương tự? Cảm ơn
Blaker


-1

Đây là ý kiến ​​của tôi về điều này với jQuery. Giải pháp không phải là phổ quát, có nghĩa là người ta sẽ phải điều chỉnh một số vị trí và công cụ tùy thuộc vào thiết kế thực tế.

Về cơ bản những gì tôi đã làm là: kích hoạt sao chép / xóa toàn bộ nền (những gì cần làm mờ) vào một thùng chứa có nội dung không bị mờ (tùy chọn, có ẩn tràn nếu nó không đầy đủ chiều rộng) và định vị chính xác. Hãy cẩn thận là thay đổi kích thước cửa sổ div bị mờ sẽ không khớp với vị trí ban đầu về vị trí, nhưng điều này có thể được giải quyết với một số chức năng thay đổi kích thước cửa sổ (thực sự bây giờ tôi không thể bị làm phiền với điều đó).

Tôi thực sự sẽ đánh giá cao ý kiến ​​của bạn về giải pháp này!

Cảm ơn

Đây là fiddle , không được thử nghiệm trong IE.

HTML

<div class="slide-up">
<div class="slide-wrapper">
    <div class="slide-background"></div>
    <div class="blured"></div>
    <div class="slide-content">
         <h2>Pop up title</h2>

        <p>Pretty neat!</p>
    </div>
</div>
</div>
<div class="wrapper">
<div class="content">
     <h1>Some title</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque molestie magna elit, quis pulvinar lectus gravida sit amet. Phasellus lacinia massa et metus blandit fermentum. Cras euismod gravida scelerisque. Fusce molestie ligula diam, non porta ipsum faucibus sed. Nam interdum dui at fringilla laoreet. Donec sit amet est eu eros suscipit commodo eget vitae velit.</p>
</div> <a class="trigger" href="#">trigger slide</a>

</div>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
<filter id="blur">
    <feGaussianBlur stdDeviation="3" />
</filter>
</svg>

CSS

body {
margin: 0;
padding: 0;
font-family:'Verdana', sans-serif;
color: #fff;
}
.wrapper {
position: relative;
height: 100%;
overflow: hidden;
z-index: 100;
background: #CD535B;
}
img {
width: 100%;
height: auto;
}
.blured {
top: 0;
height: 0;
-webkit-filter: blur(3px);
-moz-filter: blur(3px);
-ms-filter: blur(3px);
filter: blur(3px);
filter: url(#blur);
filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');
position: absolute;
z-index: 1000;
}
.blured .wrapper {
position: absolute;
width: inherit;
}
.content {
width: 300px;
margin: 0 auto;
}
.slide-up {
top:10px;
position: absolute;
width: 100%;
z-index: 2000;
display: none;
height: auto;
overflow: hidden;
}
.slide-wrapper {
width: 200px;
margin: 0 auto;
position: relative;
border: 1px solid #fff;
overflow: hidden;
}
.slide-content {
z-index: 2222;
position: relative;
text-align: center;
color: #333333;
}
.slide-background {
position: absolute;
top: 0;
width: 100%;
height: 100%;
background-color: #fff;
z-index: 1500;
opacity: 0.5;
}

jQuery

// first just grab some pixels we will use to correctly position the blured element
var height = $('.slide-up').outerHeight();
var slide_top = parseInt($('.slide-up').css('top'), 10);
$wrapper_width = $('body > .wrapper').css("width");
$('.blured').css("width", $wrapper_width);

$('.trigger').click(function () {
    if ($(this).hasClass('triggered')) { // sliding up
        $('.blured').animate({
            height: '0px',
            background: background
        }, 1000, function () {
            $('.blured .wrapper').remove();
        });
        $('.slide-up').slideUp(700);
        $(this).removeClass('triggered');
    } else { // sliding down
        $('.wrapper').clone().appendTo('.blured');
        $('.slide-up').slideDown(1000);
        $offset = $('.slide-wrapper').offset();
        $('.blured').animate({
            height: $offset.top + height + slide_top + 'px'
        }, 700);
        $('.blured .wrapper').animate({
            left: -$offset.left,
            top: -$offset.top
        }, 100);
        $(this).addClass('triggered');
    }
});
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.