【问题标题】:iOS 7's blurred overlay effect using CSS?iOS 7 使用 CSS 的模糊叠加效果?
【发布时间】:2013-06-06 17:38:01
【问题描述】:

Apple 的覆盖似乎不仅仅是一种透明度。关于如何使用 CSS 和可能的 JS 来实现这种效果的任何想法?

【问题讨论】:

  • 在我看来,一个更紧迫的问题是如何设置一个元素,将动态模糊应用于其后面的任何对象。因此,如果您有一个可以平移和缩放的对象,则顶部的元素会动态模糊,从而降低性能。
  • 类似问题请参见this question。
  • 我发现最令人担忧的是,这可能是一个“IOS7 功能”,而自 2006 年以来,Windows Vista Aero 界面就一直在用它的窗口镶边做同样的事情。
  • @NielsKeurentjes 呵呵,说得对。几年前,在受到 Windows 的启发后,我将这种效果融入了设计中。然而,当时我选择了一种更简单的方法,将效果烘焙到图像中。 ryanwilliams.co.uk/previews/made2race/1.html

标签: javascript css user-interface blur


【解决方案1】:

对此不太确定,我认为 CSS 目前无法做到这一点

不过 Chris Coyier 曾在博客中介绍了一种使用多张图片来实现这种效果的旧技术,http://css-tricks.com/blurry-background-effect/

【讨论】:

  • 屏幕快照到画布可能会起作用,并在执行此操作之前将图标和背景“锁定”在一起,但我无法看到背景在图标下是否仍然具有视差效果被模糊了......如果没有,那么在您开始移动控制面板(透明覆盖)的那一刻,设备会创建屏幕图像并在上面执行这个诡计。请注意,在执行此操作时,它们不仅受基于 web 的东西(如画布)的限制,因为它处于操作系统级别,并且可能不限于 webkit 的东西。
【解决方案2】:

使用 CSS3 是可能的:

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

此处为示例 => jsfiddle

【讨论】:

  • 这并没有达到iOS7中元素模糊部分背景的效果。
  • 我编辑了我的 jsfiddle,现在它可以像 IOS7 一样发挥作用;) => CSS3 IOS7 effect
  • 正如 Adrian 所指出的,过滤器只会模糊一个元素并且它是子元素。它不能用于叠加层来模糊父元素或相邻元素,因此 iOS 7 效果无法使用 CSS。
  • 如果你认为它只是为了达到这个效果而模糊不清,那你就错了。我正在开发一个简单的开源存储库,它使用 JS 和 CSS 3 来实现这种效果,敬请期待 :)
  • 这在 FX 中不起作用 - 它们不支持 -moz-filter: blur()。相反,您必须使用 SVG 过滤器,有关详细信息,请参阅我的答案。
【解决方案3】:

昨天做了一个快速演示,实际上就是你所说的。 http://bit.ly/10clOM9 此演示基于加速度计进行视差,因此它在 iPhone 本身上效果最佳。我基本上只是将我们覆盖的内容复制到一个固定位置的元素中,该元素会变得模糊。

注意:向上滑动以查看面板。

(我使用了可怕的 css id,但你明白了)

#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);
}

【讨论】:

    【解决方案4】:
    • 克隆要模糊的元素
    • 将其附加到您想要位于顶部的元素(磨砂窗口)
    • 使用 webkit-filter 模糊克隆元素
    • 确保克隆的元素绝对定位
    • 滚动原始元素的父元素时,捕捉 scrollTop 和 scrollLeft
    • 使用 requestAnimationFrame,现在将 webkit-transform 动态设置为 translate3d,并将 x 和 y 值设置为 scrollTop 和 scrollLeft

    例子在这里:

    • 确保在 webkit-browser 中打开
    • 在手机视图内滚动(最好使用苹果鼠标...)
    • 查看正在使用的模糊页脚

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

    【讨论】:

      【解决方案5】:

      你让我想尝试,所以我做了,看看这里的例子:

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

      使用:

      1. 硬件加速 CSS 过滤器
      2. 用于类分配和箭头键事件的 JS
      3. 图像 CSS Clip 属性

      就是这样。

      如果使用画布复制当前的 dom 并对其进行模糊处理,我也相信这可以在任何屏幕上动态完成。

      【讨论】:

        【解决方案6】:

        查看此演示页面。
        本演示使用 html2canvas 将文档呈现为图像。

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

        1. 单击“显示弹出窗口”链接时,将调用“makePopup”函数。
        2. 'makePopup' 运行 html2canvas 以将文档呈现为图像。
        3. 图像被转换为​​ data-url 字符串,并被绘制为弹出窗口的背景图像。
        4. Popup 的背景被 -webkit-filter:blur 模糊了
        5. 将弹出窗口附加到文档中。
        6. 当您拖动弹出窗口时,它会更改自己的背景位置。

        【讨论】:

        • 请说明演示的实际作用,因为一旦出现故障,将无济于事。
        • 这是一个非常好的主意 - 不幸的是,html2canvas 太实验性了,还不能依赖,而且可能太大了,除非屏幕截图是您的应用程序的全部内容。
        • 如您所料,@JonathanDrapeau 已下降。
        • 哇!我喜欢链接腐烂!
        • 仍然在图像上使用模糊,我不明白这如何在粘性导航栏之类的东西上起作用。
        【解决方案7】:

        由于 element 样式属性,现在使用 FireFox 可以做到这一点。

        此实验性属性允许您将任何 HTML 内容用作背景图像。因此,要创建背景,您需要三个叠加层:

        1. 带有纯色背景的简单叠加(隐藏真正的叠加内容)。
        2. 覆盖设置内容的-moz-element 背景。请注意,FX 不支持 filter: blur() 属性,因此我们需要一个 SVG。
        3. 使用非模糊内容进行叠加。

        所以,放在一起:

        SVG 模糊滤镜(适用于 FX,其他浏览器可以使用 filter:blur()):

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

        CSS 模糊样式:

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

        最后3层:

        <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>
        

        然后移动它只需设置background-position(jQuery 中的示例,但你可以使用任何东西):

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

        Here it is as a JS Fiddle, FX only.

        【讨论】:

        • 您的解决方案与我的想法相似。我通过扩展模糊的背景切片修复了故障 (jsfiddle.net/RgBzH/30),因此模糊实际上发生在真实内容上,而不是切片内容上。无论如何,执行良好。
        • @PierPaoloRamon 不错的调整 - 我打算使用它我可能会扩展 SVG 过滤器以包括 iOS7 所做的增加的亮度/降低的对比度,但 FX 仅意味着严格的沙箱这点。我已经向 another question 询问了解决方法。
        • 顺便说一句,您的解决方案只是为 Firefox OS 带来了类似 ios7 的模糊效果,这很简洁(我必须对其进行测试)。
        【解决方案8】:

        [编辑] 在未来(移动)Safari 9 中,-webkit-backdrop-filter 正是为此而生。请参阅this 我为展示它而制作的钢笔。

        过去 4 周我一直在考虑这个问题,并想出了这个解决方案。

        Live Demo

        [编辑] 我在CSS-Tricks写了一篇更深入的帖子

        此技术使用CSS Regions,因此目前浏览器支持不是最好的。 (http://caniuse.com/#feat=css-regions)

        此技术的关键部分是使用 CSS 区域将内容与布局分开。先用flow-into:content定义一个.content元素,然后用合适的结构模糊头部。

        布局结构:

        <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>
        

        这个布局的两个重要部分是.header__background 和.phone__content - 这些是内容应该流动的容器。

        使用 CSS 区域很简单,就像 flow-from:content(.content 流入命名区域 content)

        现在是棘手的部分。我们希望始终通过.header__background 使内容流动,因为那是内容将被模糊的部分。 (使用webkit-filter:blur(10px);)

        这是由transfrom:translateY(-$HeightOfTheHeader) 和.content 完成的,以确保内容始终通过.header__background 流动。这种转换虽然总是隐藏标题下方的一些内容。解决这个问题很容易添加

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

        以适应转换。

        目前正在处理:

        • Chrome 29+(启用 'experimental-webkit-features'/'enable-experimental-web-platform-features')
        • Safari 6.1 种子 6
        • iOS7(慢且无滚动)

        【讨论】:

        • 现场演示不再有效。内容在手机下方,出现 JS 错误“TypeError: sheet.addRule is not a function”
        • 适用于 Mac 和 iOS 上的 Safari。
        【解决方案9】:

        我一直在使用 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 的 &lt;feGaussianBlur stdDeviation="10"/&gt; 示例。
        • 使用&lt;image ...&gt; 标签将其应用于任何图像,甚至使用多个图像。
        • 您可以使用 js 构建它并将其用作图像或使用 css 中的 id。

        【讨论】:

        • 你在某个地方碰巧有一个这样的例子吗?也许是 jsFiddle 或类似的?谢谢
        【解决方案10】:

        前几天我发现的这支笔似乎做得很漂亮,只需一点 css 和 21 行 javascript。在我发现这个之前我没有听说过 cloneNode js 命令,但它完全可以满足我的需要。

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

        详情: A. 基本上,它会查看您的内容 div 并在其上调用 cloneNode,因此它会创建一个副本,然后将其放置在位于页面顶部的溢出:隐藏标题对象中。 B. 然后它只是监听滚动,以便两个图像看起来匹配并模糊标题图像...... annnnd BAM。达到的效果。

        在 CSS 中内置少量可编写脚本之前,CSS 并不是完全可行的。

        【讨论】:

        • 看起来很棒!尽管这显然不适用于动态内容,除非您在每次发生任何变化时都更新副本——这可能会对性能造成很大影响。
        • 我想,但不确定您将在哪里更改图像并尝试实现此效果?如果处理得当,如果您回收克隆,它根本不会受到太大影响。也许您可以详细说明一个与此相反的案例?例如,您制作了一个图像提要,并希望为每个项目的图像菜单提供一些菜单选项以产生这种效果......当您显示面板时运行此操作,然后覆盖的面板看起来就像海报想要的那样。添加一个小回收器,这样 dom 就不会在您每次打开菜单时无休止地复制图像,并且它应该表现良好。
        【解决方案11】:

        这是我对 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');
            }
        });
        

        【讨论】:

          【解决方案12】:

          看看这个http://codepen.io/GianlucaGuarini/pen/Hzrhf 似乎它可以在不复制自身下方元素的背景图像的情况下产生效果。参见示例中的文本也变得模糊。

          Vague.js

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

          【讨论】:

          • 它重复内容(您链接的 codepen 示例中有两个 iframe)。尝试单击菜单项,模糊的 iframe 不会更新。
          • 无论如何这都是一种解决方案。
          【解决方案13】:

          这可能对你有帮助!

          This Dynamically changes the background just IOS does

          .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;
          }
          

          【讨论】:

            【解决方案14】:

            好消息

            截至今天 2020 年 4 月 11 日,这很容易通过 backdrop-filter CSS 属性实现,该属性现在是 Chrome、Safari 和 Edge 中的一项稳定功能。

            我希望在我们的 Hybrid 移动应用程序中使用此功能,因此也可以在 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

            在pen 中查看它的工作情况或尝试演示:

            #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>

            用户界面示例 2

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

            我想在它上面显示一个带有光泽效果的文本。在上面的叠加层上使用backdrop-filter: blur(20px);,我可以看到:?

            【讨论】:

            • backdrop-filter 仍然无法在 Firefox 中自动运行。我怀疑用户会为了看到这个效果而故意打开激活backdrop-filter的选项。
            猜你喜欢
            • 1970-01-01
            • 2015-02-19
            • 2012-07-21
            • 2014-07-11
            • 2015-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多