如何使CSS玻璃/模糊效果适用于叠加层?

Cha*_*son 76 html css blur css3 css-filters

我在半透明叠加div上应用模糊效果时遇到问题.我希望div背后的一切都模糊不清,像这样:

SFW图像

这是一个不起作用的jsfiddle:http://jsfiddle.net/u2y2091z/

任何想法如何使这项工作?我希望尽可能保持简单并使其成为跨浏览器.这是我正在使用的CSS:

#overlay {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;

    background:black;
    background:rgba(0,0,0,0.8);

    filter:blur(4px);
    -o-filter:blur(4px);
    -ms-filter:blur(4px);
    -moz-filter:blur(4px);
    -webkit-filter:blur(4px);
}
Run Code Online (Sandbox Code Playgroud)

Wea*_*.py 65

这是一个使用svg过滤器的示例.

我们的想法是使用svg与其height相同的元素#overlayfeGaussianblur在其上应用过滤器.此过滤器应用于svg image元素.要为其赋予拉伸效果,可以box-shadow在叠加层的底部使用a .

浏览器支持svg过滤器.

Demo on Codepen

body {
  background: #222222;
}
#container {
  position: relative;
  width: 450px;
  margin: 0 auto;
}
img {
  height: 300px;
}
#overlay {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  z-index: 1;
  color: rgba(130, 130, 130, 0.5);
  font-size: 50px;
  text-align: center;
  line-height: 100px;
  box-shadow: 0 3px 5px rgba(0, 0, 0, 0.3);
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <img src="http://lorempixel.com/450/300/sports" />
  <div id="overlay">WET</div>
  <svg width="450" height="100" viewBox="0 0 450 100" style="position: absolute; top: 0;">
    <defs>
      <filter id="blur">
        <feGaussianBlur in="SourceGraphic" stdDeviation="3" />
      </filter>
    </defs>
    <image filter="url(#blur)" xlink:href="http://lorempixel.com/450/300/sports" x="0" y="0" height="300px" width="450px" />
  </svg>
</div>
Run Code Online (Sandbox Code Playgroud)


Cha*_*son 45

谢谢大家的帮助!我能够将来自所有人的信息和来自Googling的信息拼凑起来,我想出了以下适用于Chrome和Firefox的信息:http://jsfiddle.net/u2y2091z/12/.我仍在努力为IE和Opera做这项工作.

关键是将内容放在应用过滤器的div :

<div id="mask">
    <p>Lorem ipsum ...</p>
    <img src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />
</div>
Run Code Online (Sandbox Code Playgroud)

然后是CSS:

body {
    background: #300000;
    background: linear-gradient(45deg, #300000, #000000, #300000, #000000);
    color: white;
}
#mask {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    background-color: black;
    opacity: 0.5;
}
img {
    filter: blur(10px);
    -webkit-filter: blur(10px);
    -moz-filter: blur(10px);
    -o-filter: blur(10px);
    -ms-filter: blur(10px);
    position: absolute;
    left: 100px;
    top: 100px;
    height: 300px;
    width: auto;
}
Run Code Online (Sandbox Code Playgroud)

因此,掩码应用了滤镜.还要注意使用url()作为带有<svg>值标记的过滤器- 这个想法来自http://codepen.io/AmeliaBR/pen/xGuBr.如果您碰巧缩小了CSS,则可能需要将SVG过滤器标记中的任何空格替换为"%20".

所以现在,掩码div中的所有内容都模糊了.

  • 不适用于Chrome 55.0.2883.87 (3认同)
  • Chrome不喜欢最终的`filter:url(...`.删除它,Chrome成功使用`filter:blur(10px);`. (3认同)
  • @Eric,您显然误解了,因为回答者***是*** OP。 (3认同)
  • 我误会了吗 这不是OP想要的。文字不应模糊。 (2认同)

小智 16

background: rgba(255,255,255,0.5);
backdrop-filter: blur(5px);
Run Code Online (Sandbox Code Playgroud)

您可以使用 background -filter,而不是为您的内容添加另一个模糊背景。仅供参考 IE 11 和 Firefox 可能不支持它。检查caniuse

演示:

background: rgba(255,255,255,0.5);
backdrop-filter: blur(5px);
Run Code Online (Sandbox Code Playgroud)
header {
  position: fixed;
  width: 100%;
  padding: 10px;
  background: rgba(255,255,255,0.5);
  backdrop-filter: blur(5px);
}
body {
  margin: 0;
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*ull 10

有关更简单和最新的答案:

backdrop-filter: blur(6px);
Run Code Online (Sandbox Code Playgroud)

注意,浏览器支持不是完美的,但是在大多数情况下,模糊并不是必须的。

  • 请注意,截至 2021 年 2 月 1 日,目前没有 Firefox 版本支持此功能。 (8认同)
  • 请注意,截至 2022 年 9 月 8 日,Firefox 自 7 月起就支持此属性 :D,全球接受率为 94% https://caniuse.com/css-backdrop-filter (7认同)
  • 这是迄今为止最好的答案。 (4认同)
  • Firefox 在技术上支持它,但它是一个禁用标志,您可以在 about:config 中启用。 (2认同)

Sam*_*son 9

如果您今天正在寻找可靠的跨浏览器方法,那么您将找不到一个好的方法.您拥有的最佳选择是创建两个图像(这可以在某些环境中自动执行),并将它们排列成一个覆盖另一个图像.我在下面创建了一个简单的例子:

<figure class="js">
    <img src="http://i.imgur.com/3oenmve.png" />
    <img src="http://i.imgur.com/3oenmve.png?1" class="blur" />
</figure>
Run Code Online (Sandbox Code Playgroud)
figure.js {
    position: relative;
    width: 250px; height: 250px;
}

figure.js .blur {
    top: 0; left: 0;
    position: absolute;
    clip: rect( 0, 250px, 125px, 0 );
}
Run Code Online (Sandbox Code Playgroud)

虽然有效,但即使这种方法也不一定理想.话虽如此,它确实产生了预期的结果.

在此输入图像描述


小智 9

backdrop-filter

...对元素后面的区域应用图形效果,例如模糊或颜色偏移。因为它适用于元素后面的所有内容,所以要查看效果,您必须使元素或其背景至少部分透明。


Juh*_*nen 8

这是一个可能的解决方案.

HTML

<img id="source" src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />

<div id="crop">
    <img id="overlay" src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

#crop {
    overflow: hidden;

    position: absolute;
    left: 100px;
    top: 100px;

    width: 450px;
    height: 150px;
}

#overlay {
    -webkit-filter:blur(4px);
    filter:blur(4px);

    width: 450px;
}

#source {
    height: 300px;
    width: auto;
    position: absolute;
    left: 100px;
    top: 100px;
}
Run Code Online (Sandbox Code Playgroud)

我知道CSS可以简化,你可能应该摆脱ID.这里的想法是使用div作为裁剪容器,然后在图像的副本上应用模糊.小提琴

要在Firefox中使用此功能,您必须使用SVG hack.


小智 5

这将对内容进行模糊叠加:

.blur {
  display: block;
  bottom: 0;
  left: 0;
  position: fixed;
  right: 0;
  top: 0;
  -webkit-backdrop-filter: blur(15px);
  backdrop-filter: blur(15px);
  background-color: rgba(0, 0, 0, 0.5);
}
Run Code Online (Sandbox Code Playgroud)