Comment puis-je faire fonctionner un effet de verre/flou CSS pour une superposition?

J'ai du mal à appliquer un effet de flou sur une superposition semi-transparente div. Je voudrais que tout derrière la div soit floue, comme ceci:

Image SFW

Voici un jsfiddle qui ne fonctionne pas: http://jsfiddle.net/u2y2091z/

Des idées pour faire ce travail? Je voudrais garder cela aussi simple que possible et qu'il soit cross-browser. Voici le CSS que j'utilise:

#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);
}
56
demandé sur TimoSolo 2014-12-20 23:14:54

5 réponses

Voici un exemple qui utilise svg filtre.

, L'idée est d'utiliser un svg élément de height même que le #overlay et appliquer les feGaussianblur filtre sur elle. Ce filtre est appliqué sur un svg image élément. Pour lui donner un effet extrudé, vous pouvez utiliser un box-shadow au bas de la superposition.

Prise en charge du Navigateur pour svg filtres.

Démo 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>
52
répondu Weafs.py 2015-06-22 11:53:39

Merci pour l'aide à tous! J'ai pu rassembler des informations de tout le monde ici et de Google plus loin, et je suis venu avec ce qui suit qui fonctionne dans Chrome et Firefox: http://jsfiddle.net/u2y2091z/12/. je travaille toujours à faire ce travail pour IE et Opera.

La clé met le contenu à l'intérieur de la div à laquelle le filtre est appliqué:

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

Et puis le CSS:

#mask {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    background-color: black;
    opacity: 0.5;

    filter: blur(10px);
    -webkit-filter: blur(10px);
    -moz-filter: blur(10px);
    -o-filter: blur(10px);
    -ms-filter: blur(10px);
    filter: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='svgMask'><feGaussianBlur stdDeviation='10' /></filter></svg>#svgMask");
}

Donc le masque a les filtres appliqués. Notez également l' utilisation d'url () pour un filtre avec une balise <svg> pour la valeur - cette idée vient de http://codepen.io/AmeliaBR/pen/xGuBr . Si vous réduisez votre CSS, vous devrez peut-être remplacer les espaces du balisage du filtre SVG par "%20".

Alors maintenant, tout à l'intérieur du masque div est flou.

32
répondu Chad Johnson 2014-12-21 23:17:11

Voici une solution possible.

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

Je sais que le CSS peut être simplifié et que vous devriez probablement vous débarrasser des identifiants. L'idée ici est d'utiliser un div comme conteneur de recadrage, puis d'appliquer le flou sur le duplicata de l'image. Violon

Pour que cela fonctionne dans Firefox, vous devez utiliser SVG hack .

8
répondu Juho Vepsäläinen 2014-12-20 21:02:11

Si vous êtes à la recherche d'une approche cross-browser fiable aujourd'hui, vous ne trouverez pas un grand. La meilleure option que vous avez est de créer deux images (cela pourrait être automatisé dans certains environnements), et les organiser de telle sorte que l'un recouvre l'autre. J'ai créé un exemple simple ci-dessous:

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

Bien qu'efficace, même cette approche n'est pas nécessairement idéale. Cela étant dit, il donne le résultat souhaité .

entrez la description de l'image ici

7
répondu Sampson 2014-12-20 21:02:55

#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
répondu prajeesh loremine 2018-02-26 09:07:45