Cómo aplicar un filtro CSS a una imagen de fondo
-
21-12-2019 - |
Pregunta
Tengo un archivo JPEG que estoy usando como imagen de fondo para una página de búsqueda y estoy usando CSS para configurarlo porque estoy trabajando dentro columna vertebral.js contextos:
background-image: url("whatever.jpg");
Quiero aplicar un filtro de desenfoque CSS 3 solo al fondo, pero no estoy seguro de cómo diseñar solo ese elemento.Si lo intento:
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);
justo debajo background-image
en mi CSS, le da estilo a toda la página, en lugar de solo al fondo.¿Hay alguna manera de seleccionar solo la imagen y aplicarle el filtro?Alternativamente, ¿hay alguna manera de desactivar el desenfoque para todos los demás elementos de la página?
Solución
Mira esto bolígrafo.
Tendrás que utilizar dos contenedores diferentes, uno para la imagen de fondo y otro para tu contenido.
En el ejemplo, he creado dos contenedores, .background-image
y .content
.
Ambos se colocan con position: fixed
y left: 0; right: 0;
.La diferencia en mostrarlos proviene de la z-index
valores que se han establecido de forma diferente para los elementos.
.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>
Disculpas por el Lorem Ipsum Texto.
Actualizar
Gracias a Mateo Wilcoxson para una mejor implementación utilizando .content:before
http://codepen.io/akademy/pen/FlkzB
Otros consejos
Abolición de la necesidad de un elemento extra, junto con hacer que el contenido se ajuste al flujo de documentos en lugar de ser fijo / absoluto como otras soluciones.
logrado usando
.content {
overflow: auto;
position: relative;
}
Se necesita un desbordamiento automático, de lo contrario, el fondo se compensará con unos pocos píxeles en la parte superior.
Después de esto, simplemente necesitas
.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);
}
Editar Si está interesado en eliminar las fronteras blancas en los bordes, use un ancho y la altura de 110%
y una izquierda y la parte superior de -5%
.Esto ampliará sus antecedentes un TAD, pero no debe haber un sangrado de color sólido desde los bordes.
Lápiz actualizado aquí: https://codepen.io/anon/pen/qgyewb -Gracias Chad Fawcett por la sugerencia.
Como se indica en otras respuestas, esto se puede lograr con:
- una copia de la imagen borrosa como fondo.
- un elemento pseudo que se puede filtrar luego posicionado detrás del contenido.
También puede usar backdrop-filter
Hay una propiedad compatible llamada backdrop-filter
, y es actualmente
Apoyado en Chrome 76, borde , Safari, e iOS Safari (consulte caniuse.com para estadísticas).
de Mozilla Devdocs :
La propiedad Filtro de fondo proporciona efectos como borrosa o cambiando el área del área detrás de un elemento, que luego se puede ver a través de ese elemento ajustando la transparencia / opacidad del elemento.
Consulte caniuse.com para estadísticas de uso.
Usted lo usaría así:
.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>
update (12/06/2019) : Chromium se enviará con backdrop-filter
habilitado de forma predeterminada en la versión 76, que saldrá 30/07/2019 .
update (01/06/2019) : el equipo de mozzilla firefox ha anunciado comenzará a trabajar en la implementación de esto pronto.
actualización (21/05/2019) : cromo acaba de anunciarlo backdrop-filter
está disponible en Chrome Canary sin habilitar "Habilitar funciones de la plataforma web experimental". Esto significa que backdrop-filter
está muy cerca de ser implementado en todas las plataformas de cromo.
Debe reestructurar su html para hacer esto.Tienes que borrar todo el elemento para difuminar el fondo.Entonces, si quieres borrar solo el fondo, tiene que ser su propio elemento.
Por favor, compruebe el siguiente código: -
.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>
La siguiente es una solución simple para los navegadores modernos en CSS puros con un elemento Pseudo de 'antes', como la solución de Matthew Wilcoxson.
Para evitar la necesidad de acceder al Pseudo Elemento para cambiar la imagen y otros atributos en JavaScript, simplemente use inherit
como el valor y acceda a ellos a través del elemento principal (aquí 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 */
}
En el .content
pestaña en CSS cámbiala a position:absolute
.De lo contrario, la página representada no será desplazable.
Aunque todas las soluciones mencionadas son muy inteligentes, todos parecían tener problemas menores o posibles efectos de golpe en otros elementos en la página cuando los probé.
Al final para ahorrar tiempo, simplemente volví a mi antigua solución: usé pintura.net y fue a los efectos, borroso gaussiano con un radio de 5 a 10 píxeles y simplemente lo salvó como la imagen de la página.- -)
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;
}
Editar:
Finalmente lo tengo trabajando, ¡pero la solución no es de ninguna manera sencilla!Mira aquí:
Todo lo que realmente necesita es "Filtro":
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>
Por supuesto, esta no es una solución CSS, pero puede usar el protón CDN con filter
:
body {
background: url('https://i0.wp.com/IMAGEURL?w=600&filter=blurgaussian&smooth=1');
}
Es de https://developer.wordpress.com/docs/photon/ API / # FILTRO
No escribí esto, pero noté que había un polyfill para el soporte parcial. backdrop-filter
usando el compilador CSS SASS, por lo que si tiene un proceso de compilación, se puede lograr muy bien (también usa TypeScript):
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);
}