Как применить фильтр CSS к фоновому изображению
-
21-12-2019 - |
Вопрос
У меня есть файл JPEG, который я использую в качестве фонового изображения для страницы поиска, и для его установки я использую CSS, поскольку работаю внутри Backbone.js контексты:
background-image: url("whatever.jpg");
Я хочу применить фильтр размытия CSS 3. только на фон, но я не уверен, как стилизовать только этот элемент.Если я попробую:
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);
прямо под background-image
в моем CSS он стилизирует всю страницу, а не только фон.Есть ли способ выбрать только изображение и применить к нему фильтр?Альтернативно, есть ли способ просто отключить размытие для всех остальных элементов на странице?
Решение
Проверьте это ручка.
Вам придется использовать два разных контейнера: один для фонового изображения, а другой для вашего контента.
В примере я создал два контейнера: .background-image
и .content
.
Оба они размещены с position: fixed
и left: 0; right: 0;
.Разница в их отображении связана с z-index
значения, которые были установлены по-разному для элементов.
.background-image {
position: fixed;
left: 0;
right: 0;
z-index: 1;
display: block;
background-image: url('http://666a658c624a3c03a6b2-25cda059d975d2f318c03e90bcf17c40.r92.cf1.rackcdn.com/unsplash_527bf56961712_1.JPG');
width: 1200px;
height: 800px;
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);
}
.content {
position: fixed;
left: 0;
right: 0;
z-index: 9999;
margin-left: 20px;
margin-right: 20px;
}
<div class="background-image"></div>
<div class="content">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend
rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing,
quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
<p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum
tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
</div>
Приносим извинения за Лорем Ипсум Текст.
Обновлять
Благодаря Мэтью Уилкоксон для лучшей реализации с использованием .content:before
http://codepen.io/akademy/pen/FlkzB
Другие советы
отменить необходимость дополнительного элемента, наряду с созданием содержания в форме документа, а не фиксированным / абсолютным, как и другие решения.
Достигнута с использованием
.content {
overflow: auto;
position: relative;
}
.
Требуется автоматическое автоматическое переполнение, иначе фона будет смещенным несколькими пикселями сверху.
После этого вам просто нужно
.content:before {
content: "";
position: fixed;
left: 0;
right: 0;
z-index: -1;
display: block;
background-image: url('img-here');
background-size:cover;
width: 100%;
height: 100%;
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);
}
.
Обновлена ручка здесь: https://codepen.io/anon/pen/qgyewb -Спасибо Чад Фаветт для предложения.
Как указано в других ответах, это может быть достигнуто с:
- .
- копия размытого изображения в качестве фона.
- псевдоэлемент, который можно отфильтровать, затем расположен за содержанием.
Вы также можете использовать backdrop-filter
Есть поддерживаемое свойство под названием backdrop-filter
, и в данный момент
Поддерживается в Chrome 76, жрать Safari, и iOS Safari (см. caniuse.com для статистики).
от mozilla devdocs :
Свойство фона-фильтра обеспечивает эффекты, такие как размытие или цвет, смещая область за элементом, который затем можно увидеть через этот элемент, регулируя прозрачность / непрозрачность элемента.
Смотрите caniuse.com для статистики использования.
Вы бы использовали его так:
.background-filter::after {
-webkit-backdrop-filter: blur(5px); /* Use for Safari 9+, Edge 17+ (not a mistake) and iOS Safari 9.2+ */
backdrop-filter: blur(5px); /* Supported in Chrome 76 */
content: "";
display: block;
position: absolute;
width: 100%; height: 100%;
}
.background-filter {
position: relative;
}
.background {
background-image: url('https://upload.wikimedia.org/wikipedia/en/6/62/Kermit_the_Frog.jpg');
width: 200px;
height: 200px;
}
.
<div class="background background-filter"></div>
.
backdrop-filter
», доступен в Chrome Canarary без включения флага« Включить экспериментальную веб-платформу ». Это означает, что backdrop-filter
очень близко к реализации на всех хромированных платформах.
Вам нужно повторно структурировать ваш html , чтобы сделать это.Вы должны размыть весь элемент, чтобы размыть фон.Так что, если вы хотите размыть только фоном, это должно быть его собственным элементом.
Пожалуйста, проверьте следующий код: -
.backgroundImageCVR{
position:relative;
padding:15px;
}
.background-image{
position:absolute;
left:0;
right:0;
top:0;
bottom:0;
background:url('http://www.planwallpaper.com/static/images/colorful-triangles-background_yB0qTG6.jpg');
background-size:cover;
z-index:1;
-webkit-filter: blur(10px);
-moz-filter: blur(10px);
-o-filter: blur(10px);
-ms-filter: blur(10px);
filter: blur(10px);
}
.content{
position:relative;
z-index:2;
color:#fff;
}
.
<div class="backgroundImageCVR">
<div class="background-image"></div>
<div class="content">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis aliquam erat in ante malesuada, facilisis semper nulla semper. Phasellus sapien neque, faucibus in malesuada quis, lacinia et libero. Sed sed turpis tellus. Etiam ac aliquam tortor, eleifend rhoncus metus. Ut turpis massa, sollicitudin sit amet molestie a, posuere sit amet nisl. Mauris tincidunt cursus posuere. Nam commodo libero quis lacus sodales, nec feugiat ante posuere. Donec pulvinar auctor commodo. Donec egestas diam ut mi adipiscing, quis lacinia mauris condimentum. Quisque quis odio venenatis, venenatis nisi a, vehicula ipsum. Etiam at nisl eu felis vulputate porta.</p>
<p>Fusce ut placerat eros. Aliquam consequat in augue sed convallis. Donec orci urna, tincidunt vel dui at, elementum semper dolor. Donec tincidunt risus sed magna dictum, quis luctus metus volutpat. Donec accumsan et nunc vulputate accumsan. Vestibulum tempor, erat in mattis fringilla, elit urna ornare nunc, vel pretium elit sem quis orci. Vivamus condimentum dictum tempor. Nam at est ante. Sed lobortis et lorem in sagittis. In suscipit in est et vehicula.</p>
</div>
</div>
.
Ниже приведен простое решение для современных браузеров в чистых CSS с A 'перед Pseudo-элементом, как решение из Matthew Wilcoxson.
Чтобы избежать необходимости доступа к псевдому элементу для изменения изображения и других атрибутов в JavaScript, просто используйте inherit
в качестве значения и доступа к ним через родительский элемент (здесь body
).
body::before {
content: ""; /* Important */
z-index: -1; /* Important */
position: inherit;
left: inherit;
top: inherit;
width: inherit;
height: inherit;
background-image: inherit;
background-size: cover;
filter: blur(8px);
}
body {
background-image: url("xyz.jpg");
background-size: 0 0; /* Image should not be drawn here */
width: 100%;
height: 100%;
position: fixed; /* Or absolute for scrollable backgrounds */
}
. в .content
вкладка в CSS измените ее на position:absolute
.В противном случае отображаемая страница не будет прокручиваться.
Хотя все упомянутые решения очень умны, все, казалось, имели незначительные проблемы или потенциальный стук на эффекты с другими элементами на странице, когда я пробовал их.
В конце концов, чтобы сэкономить время, я просто вернулся к своему старумую решению: я использовал paint.net И пошел к эффектам, гауссовский размытие с радиусом от 5 до 10 пикселей и просто сохранил, что как изображение страницы.: -)
html:
<body class="mainbody">
</body
.
CSS:
body.mainbody
{
background: url('../images/myphoto.blurred.png');
-moz-background-size: cover;
-webkit-background-size: cover;
background-size: cover;
background-position: top center !important;
background-repeat: no-repeat !important;
background-attachment: fixed;
}
.
Редактировать:
Я наконец получил его работать, но решение ни в коем случае не имеет смысла!Смотрите здесь:
Все, что вам на самом деле нужно, это «фильтр»:
blur(«WhatEverYouWantInPixels»);"
.
body {
color: #fff;
font-family: Helvetica, Arial, sans-serif;
}
#background {
background-image: url('https://cdn2.geckoandfly.com/wp-content/uploads/2018/03/ios-11-3840x2160-4k-5k-beach-ocean-13655.jpg');
background-repeat: no-repeat;
background-size: cover;
width: 100vw;
height: 100vh;
overflow: hidden;
position: absolute;
top: 0;
left: 0;
z-index: -1;
/* START */
/* START */
/* START */
/* START */
/* You can adjust the blur-radius as you'd like */
filter: blur(3px);
}
.
<div id="background"></div>
<p id="randomContent">Lorem Ipsum</p>
.
Конечно, это не CSS-решение, но вы можете использовать CDN Proton с filter
:
body {
background: url('https://i0.wp.com/IMAGEURL?w=600&filter=blurgaussian&smooth=1');
}
.
Это от https://developer.wordpress.com/docs/photon/ api / # фильтр
Я не написал это, но я заметил, что там был многолифик для частично поддерживаемого генеракодицетагода, используя компилятор CSS SASS, поэтому, если у вас есть компиляционный трубопровод, он может быть достигнут хорошо (он также использует Teamscript):
div {
background: inherit;
width: 250px;
height: 350px;
position: absolute;
overflow: hidden; /* Adding overflow hidden */
}
div:before {
content: ‘’;
width: 300px;
height: 400px;
background: inherit;
position: absolute;
left: -25px; /* Giving minus -25px left position */
right: 0;
top: -25px; /* Giving minus -25px top position */
bottom: 0;
box-shadow: inset 0 0 0 200px rgba(255, 255, 255, 0.3);
filter: blur(10px);
}
.