Как я могу заставить CSS glass/blur effect работать для наложения?


У меня возникли проблемы с применением эффекта размытия на полупрозрачном наложении div. Я бы хотел, чтобы все за div было размыто, например:

вот 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);
}
5 56

5 ответов:

вот пример, который использует svg фильтр.

идея в том, чтобы использовать svg элемент height то же, что и #overlay и применить feGaussianblur фильтр на нем. Этот фильтр применяется к svgimage элемент. Чтобы придать ему экструдированный эффект, вы можете использовать box-shadow в нижней части накладки.

поддержка браузера для svg фильтры.

демо на 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>

Спасибо за помощь всем! Я смог собрать информацию от всех здесь и от дальнейшего поиска в интернете, и я придумал следующее, что работает в 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>

а потом 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");
}

Так маска имеет фильтры применяются. Также обратите внимание на использование url () для фильтра с <svg> тег для значения -- эта идея пришла из http://codepen.io/AmeliaBR/pen/xGuBr. Если вы уменьшите свой CSS, вам может потребоваться заменить любые пробелы в разметке фильтра SVG на "%20".

Итак, теперь все внутри маски div размыто.

вот возможное решение.

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 можно упростить, и вы, вероятно, должны избавиться от идентификаторов. Идея в том, чтобы использовать div в качестве контейнера обрезки, а затем применить пятно на повторяющиеся изображения. Скрипка

чтобы сделать эту работу в Firefox, вам придется использовать SVG hack.

Если вы ищете надежный кросс-браузерный подход , вы не найдете идеальный один. Лучший вариант, который у вас есть, - это создать два изображения (это может быть автоматизировано в некоторых средах) и расположить их так, чтобы один накладывался на другой. Я создал простой пример ниже:

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

хотя и эффективный, даже этот подход не обязательно идеален. Это, как говорится, дает нужные результат.

enter image description here

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