Как я могу заставить 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 ответов:
вот пример, который использует
svg
фильтр.идея в том, чтобы использовать
svg
элементheight
то же, что и#overlay
и применитьfeGaussianblur
фильтр на нем. Этот фильтр применяется кsvg
image
элемент. Чтобы придать ему экструдированный эффект, вы можете использовать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 ); }
хотя и эффективный, даже этот подход не обязательно идеален. Это, как говорится, дает нужные результат.
#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>