Как я могу сделать эффект стекло/размытие CSS для наложения?
У меня проблемы с применением эффекта размытия к полупрозрачному оверлею Div. Я бы хотел, чтобы все, что стоит за div, было размыто, вот так:
![SFW image]()
Вот 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
Спасибо за помощь всем! Мне удалось собрать информацию от всех здесь и от дальнейшего 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>
И затем 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 размыто.
Ответ 2
Вот пример, который использует фильтр svg
.
Идея состоит в том, чтобы использовать элемент svg
с height
так же, как и #overlay
, и применить к нему фильтр feGaussianblur
. Этот фильтр применяется к элементу svg
image
. Чтобы придать ему экструдированный эффект, вы можете использовать box-shadow
в нижней части наложения.
Поддержка браузера для фильтров svg
.
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>
Ответ 3
Если вы ищете надежный кросс-браузерный подход сегодня, вы не найдете отличного. Лучший вариант, который у вас есть, - создать два изображения (это может быть автоматизировано в некоторых средах) и организовать их так, чтобы один накладывал другой. Я создал простой пример ниже:
<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]()
Ответ 4
Здесь возможно решение.
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 как контейнер для обрезки, а затем применить размытие на дубликат изображения. Fiddle
Чтобы сделать эту работу в Firefox, вам придется использовать взломать SVG.
Ответ 5
#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 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 */
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>
Ответ 6
Для более простого и актуального ответа:
backdrop-filter: blur(6px);
Обратите внимание, поддержка браузера не идеальна, но в большинстве случаев размытие будет несущественным.
Ответ 7
Я придумал это решение.
Нажмите, чтобы посмотреть изображение размытого эффекта
Это своего рода трюк, который использует абсолютно позиционированный дочерний div
, устанавливает его фоновое изображение таким же, как родительский div
а затем использует CSS-свойство background-attachment:fixed
вместе с теми же свойствами 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>