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?
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?
Câu trả lời:
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
-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.
http://codepen.io/Edo_B/pen/cLbrt
Sử dụng:
đó 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ó.
[Chỉnh sửa] Trong tương lai (di động) Safari 9 sẽ có -webkit-backdrop-filter
chí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.
[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 .content
phần tử với flow-into:content
và 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
và .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__background
vì đó 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:
Đ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ủ:
-moz-element
nề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.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"> </div>
<div class="header behind-blur"> </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'
});
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/
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ữ.
Ví dụ ở đây:
đã 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);
}
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/
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();
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-filter
thuộ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.
Chỉ cần thêm thuộc tính CSS:
.my-class {
backdrop-filter: blur(30px);
background: transparent; // Make sure there is not backgorund
}
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>
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:
backdrop-filter
vẫ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-filter
chủ ý chỉ để thấy hiệu ứng này.
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>
<feGaussianBlur stdDeviation="10"/>
ví dụ của Keith .<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.Điều này có thể giúp bạn !!
Điều này tự động thay đổi nền chỉ là iOS
.myBox {
width: 750px;
height: 500px;
border: rgba(0, 0, 0, 0.5) 1px solid;
background-color: #ffffff;
}
.blurBg {
width: 100%;
height: 100%;
overflow: hidden;
z-index: 0;
}
.blurBg img {
-webkit-filter: blur(50px);
margin-top: -150px;
margin-left: -150px;
width: 150%;
opacity: 0.6;
}
Đâ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');
}
});