iOS 7使用CSS实现的模糊叠加效果?

161

看起来苹果的叠层效果不仅是透明度,有没有用CSS和可能的JS实现这种效果的想法?

不仅是透明度


2
在我看来,更紧迫的问题是如何设置一个元素,使其对其后面的任何对象应用动态模糊。因此,如果您有一个可以平移和缩放的对象,顶部的元素将以低性能损失动态模糊。 - Rhodes
1
请参考这个问题以解决类似的问题。 - Keith
43
我认为最令人担忧的是,这被视为“IOS7功能”,而Windows Vista Aero界面自2006年以来就一直在使用相同的窗口装饰。 - Niels Keurentjes
1
@NielsKeurentjes 嘿,说得好。几年前,在受到Windows的启发后,我将这种效果融入了一个设计中。然而,那时我选择了更简单的路线,只是将效果直接嵌入图像中。http://www.ryanwilliams.co.uk/previews/made2race/1.html - Ryan Williams
http://geoffreydesigns.com/ios-parallax-effect-with-css/ - Geoffrey Burdett
14个回答

3

好消息

截至今天2020年4月11日,使用CSS属性backdrop-filter非常容易实现此功能,并且该属性现在是Chrome、Safari和Edge的稳定功能。

我希望将此功能添加到我们的混合移动应用程序中,因此它也可以在Android/Chrome Webview和Safari WebView中使用。

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

代码示例:

只需添加CSS属性:

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

用户界面示例1

在这个代码片段中可以看到它的运行情况,或者可以尝试这个演示:

#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 示例 2

让我们以麦当劳应用程序为例,因为它非常丰富多彩。我截取了它的屏幕截图,并将其添加为我的应用程序中 body 的背景。

我想在其上方显示具有光泽效果的文本。通过在其上方叠加物使用 backdrop-filter: blur(20px);,我能够看到下面这个效果:

主要屏幕截图 输入图像说明


backdrop-filter 在 Firefox 中仍然不能自动工作。我怀疑用户不会刻意打开选项来激活 backdrop-filter 以查看此效果。 - Richard

0

这可能会对你有所帮助!

这个可以动态地改变背景,就像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;
}

0

我一直在使用SVG滤镜来实现精灵的类似效果

<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>
  • viewBox 属性将选择您想要的包含图像的部分。
  • 只需更改过滤器为任何您想要的,例如 Keith 的 <feGaussianBlur stdDeviation="10"/> 示例。
  • 使用 <image ...> 标签将其应用于任何图像,甚至使用多个图像。
  • 您可以使用 js 构建它并将其用作图像,或在 css 中使用 id。

你是否有这方面的工作示例?也许是jsFiddle或类似的东西?谢谢。 - Blaker

-1

以下是我使用jQuery的方法,但这个解决方案并不通用,也就是说,根据实际设计,某些位置和内容可能需要进行微调。

基本上,我的做法是:在触发器上克隆/删除整个背景(应该模糊的内容),将其放入带有未模糊内容的容器中(如果宽度没有占满,则可以选择隐藏溢出),并将其正确定位。缺点是在窗口调整大小时,模糊的div会与原始div的位置不匹配,但是这可以通过一些窗口调整大小的函数来解决(实话说,现在我懒得管那么多)。

我非常希望您对此解决方案提出意见!

谢谢

这里是fiddle,未在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');
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接