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


101

我在半透明的重叠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);
}

1
仅供参考CSS filter-Firefox不支持,您不应该使用它。
Weafs.py 2014年

2
也许使div不透明,但使用伪元素作为图像的背景,可以将其独立模糊。
bjb568 2014年

1
默认情况下,FF35 +支持@ chipChocolate.py CSS过滤器。但我同意您的意见,我们作为开发人员不应依赖它,因为它不是跨浏览器功能。
Hashem Qolami 2014年

Answers:


71

这是使用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);
}
<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>



51

我能够将来自此处的每个人的信息整理在一起,并进一步进行谷歌搜索,然后提出了以下在Chrome和Firefox中可用的信息:http : //jsfiddle.net/xtbmpcsu/。我仍在为IE和Opera进行这项工作。

关键是将内容放入要应用过滤器的div

<div id="mask">
    <p>Lorem ipsum ...</p>
    <img src="http://www.byui.edu/images/agriculture-life-sciences/flower.jpg" />
</div>

然后是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;
}

因此,遮罩已应用了滤镜。另外,请注意将url()用于带有<svg>值标签的过滤器-这个想法来自http://codepen.io/AmeliaBR/pen/xGuBr。如果您恰巧要缩小CSS,则可能需要用“%20”替换SVG过滤器标记中的所有空格。

所以现在,mask div中的所有内容都变得模糊了。


太聪明了
Gangsar Swapurba,2017年

3
Chrome不喜欢最终版filter: url(...。删除它,然后Chrome成功使用filter: blur(10px);
Doug S

2
我误会了吗 这不是OP想要的。文字不应模糊。
埃里克

2
@Eric,您显然误会了,因为应答者 OP。

10

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

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

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

尽管有效,但是这种方法也不一定是理想的。话虽如此,它确实产生了预期的结果

在此处输入图片说明


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>

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

我知道CSS可以简化,您可能应该摆脱id。这里的想法是使用div作为裁剪容器,然后对图像的副本应用模糊处理。小提琴

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


@ chipChocolate.py我想您需要在这种情况下使用SVG hack demosthenes.info/blog/534/Crossbrowser-Image-Blur
JuhoVepsäläinen2014年

请注意,对于CSS过滤器,您可以省略供应商前缀,-webkit-因为这些浏览器未实现。最好将标准声明放在末尾-所有前缀版本之后。
Hashem Qolami 2014年

@HashemQolami完成。谢谢。
JuhoVepsäläinen2014年

FF现在可以(54.0.1(32位))。刚刚好!Tx!
Pedro Ferreira

5
background: rgba(255,255,255,0.5);
backdrop-filter: blur(5px);

您可以使用background -filter代替向内容添加另一个模糊背景。FYI IE 11和Firefox可能不支持它。检查

演示:

header {
  position: fixed;
  width: 100%;
  padding: 10px;
  background: rgba(255,255,255,0.5);
  backdrop-filter: blur(5px);
}
body {
  margin: 0;
}
<header>
  Header
</header>
<div>
  <img src="https://dummyimage.com/600x400/000/fff" />
  <img src="https://dummyimage.com/600x400/000/fff" />
  <img src="https://dummyimage.com/600x400/000/fff" />
</div>


已经提出了相同的解决方案:stackoverflow.com/a/58083568/3702797
Kaiido

4

#bg, #search-bg {
  background-image: url('https://images.pexels.com/photos/719609/pexels-photo-719609.jpeg?w=940&h=650&auto=compress&cs=tinysrgb');
  background-repeat: no-repeat;
  background-size: 1080px auto;
}

#bg {
  background-position: center top;
  padding: 70px 90px 120px 90px;
}

#search-container {
  position: relative;
}

#search-bg {
  /* Absolutely position it, but stretch it to all four corners, then put it just behind #search's z-index */
  position: absolute;
  top: 0px;
  right: 0px;
  bottom: 0px;
  left: 0px;
  z-index: 99;

  /* Pull the background 70px higher to the same place as #bg's */
  background-position: center -70px;

  -webkit-filter: blur(10px);
  filter: url('/media/blur.svg#blur');
  filter: blur(10px);
}

#search {
  /* Put this on top of the blurred layer */
  position: relative;
  z-index: 100;
  padding: 20px;
  background: rgb(34,34,34); /* for IE */
  background: rgba(34,34,34,0.75);
}

@media (max-width: 600px ) {
  #bg { padding: 10px; }
  #search-bg { background-position: center -10px; }
}

#search h2, #search h5, #search h5 a { text-align: center; color: #fefefe; font-weight: normal; }
#search h2 { margin-bottom: 50px }
#search h5 { margin-top: 70px }
<div id="bg">
  <div id="search-container">
    <div id="search-bg"></div>
    <div id="search">
      <h2>Awesome</h2>
      <h5><a href="#">How it works »</a></h5>
    </div>
  </div>
</div>


1

我想出了这个解决方案。

点击查看模糊效果图像

这是一种技巧,它使用绝对定位的子项div,将其背景图像设置为与父项相同div,然后将background-attachment:fixedCSS属性与background在父元素上设置的相同属性一起使用。

然后filter:blur(10px)在子div上应用(或任何值)。

*{
    margin:0;
    padding:0;
    box-sizing: border-box;
}
.background{
    position: relative;
    width:100%;
    height:100vh;
    background-image:url('https://images.unsplash.com/photo-1547937414-009abc449011?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80');
    background-size:cover;
    background-position: center;
    background-repeat:no-repeat;
}

.blur{
    position: absolute;
    top:0;
    left:0;
    width:50%;
    height:100%;
    background-image:url('https://images.unsplash.com/photo-1547937414-009abc449011?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80');
    background-position: center;
    background-repeat: no-repeat;
    background-attachment: fixed;
    background-size:cover;
    filter:blur(10px);
    transition:filter .5s ease;
    backface-visibility: hidden;
}

.background:hover .blur{
    filter:blur(0);
}
.text{
    display: inline-block;
    font-family: sans-serif;
    color:white;
    font-weight: 600;
    text-align: center;
    position: relative;
    left:25%;
    top:50%;
    transform:translate(-50%,-50%);
}
<head>
    <title>Blurry Effect</title>
</head>
<body>
    <div class="background">
        <div class="blur"></div>
        <h1 class="text">This is the <br>blurry side</h1>
    </div>
</body>
</html>

在Codepen上查看


0

这是一个适用于固定背景的解决方案,如果您具有固定的背景并且有一些重叠的元素,并且需要模糊的背景,则此解决方案有效:

图片,我们有这个简单的HTML:

<body> <!-- or any wrapper -->
   <div class="content">Some Texts</div>
</body>

<body>或包装元素的固定背景:

body {
  background-image: url(http://placeimg.com/640/360/any);
  background-size: cover;
  background-repeat: no-repeat;
  background-attachment: fixed;
}

例如,这里有一个带有白色透明背景的叠加元素:

.content {
  background-color: rgba(255, 255, 255, 0.3);
  position: relative;
}

现在,我们也需要为覆盖元素使用与包装器完全相同的背景图像,我将其用作:before伪类:

.content:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  filter: blur(5px);
  background-image: url(http://placeimg.com/640/360/any);
  background-size: cover;
  background-repeat: no-repeat;
  background-attachment: fixed;
}

由于固定的背景在包装元素和重叠元素中的工作方式相同,因此背景与重叠元素的滚动位置完全相同,我们可以对其进行简单的模糊处理。这是一个有效的小提琴,已经在Firefox,Chrome,Opera和Edge中进行了测试:https : //jsfiddle.net/0vL2rc4d/

注意:在firefox中,有一个错误使滚动时屏幕闪烁,并且固定的背景模糊。如果有任何解决办法,请告诉我


0

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

.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, .5);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.