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

IT技术 javascript css user-interface blur
2021-01-24 13:25:45

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

不仅仅是透明度

6个回答

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

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

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

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

使用:

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

而已。

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

[编辑] 在未来的(移动)Safari 9 中将会有-webkit-backdrop-filter这个功能。看看我为展示它而制作的这支笔。

在过去的 4 周里,我一直在思考这个问题,并提出了这个解决方案。

现场演示

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

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

该技术的关键部分是使用 CSS Region 从布局中分离内容。首先定义一个.content元素,flow-into: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”
2021-03-24 13:25:45
适用于 Mac 和 iOS 上的 Safari。
2021-03-25 13:25:45

由于元素样式属性,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'
}); 

这里是 JS Fiddle,仅限 FX。

您的解决方案与我想到的类似。通过扩展模糊的背景切片修复了故障(jsfiddle.net/RgBzH/30),因此模糊实际上发生在真实内容上,而不是切片上。总之执行力不错。
2021-03-24 13:25:45
@PierPaoloRamon 很好的调整 - 如果我打算使用它,我可能会稍微扩展 SVG 过滤器以包括 iOS7 所做的增加的亮度/减少的对比度,但 FX 仅意味着此时严格的沙箱。我问了另一个关于变通方法的问题
2021-03-26 13:25:45
顺便说一句,您的解决方案只是为 Firefox OS 带来了类似 ios7 的模糊效果,这很好(我必须测试一下)。
2021-04-05 13:25:45

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

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

  1. 单击“显示弹出窗口”链接时,将调用“makePopup”函数。
  2. 'makePopup' 运行html2canvas以将文档呈现为图像。
  3. 图像被转换为​​ data-url 字符串,并被绘制为弹出窗口的背景图像。
  4. Popup 的 bg 被-webkit-filter:blur 模糊
  5. 将弹出窗口附加到文档中。
  6. 当您拖动弹出窗口时,它会更改自己的背景位置。
这是一个非常好的主意 - 不幸的html2canvas太实验性而不能依赖,而且可能太大了,除非屏幕截图是您的应用程序的全部内容。
2021-03-22 13:25:45
请提供演示实际做什么的解释,因为一旦它关闭,它就没有任何帮助。
2021-03-28 13:25:45
就像你预测的那样@JonathanDrapeau。
2021-04-02 13:25:45
哇!我喜欢链接腐烂!
2021-04-06 13:25:45
仍然使用图像模糊,我不明白这如何处理像粘性导航栏这样的东西。
2021-04-09 13:25:45