Come applicare un filtro CSS a un'immagine di sfondo
-
21-12-2019 - |
Domanda
Ho un file JPEG che sto usando come immagine di sfondo per una pagina di ricerca, e sto usando CSS per impostarlo perché sto lavorando all'interno backbone.js Contexts:
background-image: url("whatever.jpg");
.
Voglio applicare un filtro sfocatura CSS 3 solo sullo sfondo, ma non sono sicuro di come modellare solo quell'elemento.Se provo:
-webkit-filter: blur(5px);
-moz-filter: blur(5px);
-o-filter: blur(5px);
-ms-filter: blur(5px);
filter: blur(5px);
.
Giusto sotto background-image
nel mio CSS, stili tutta la pagina, piuttosto che lo sfondo.C'è un modo per selezionare solo l'immagine e applicare il filtro a questo?In alternativa, c'è un modo per disattivare la sfocatura per ogni altro elemento sulla pagina?
Soluzione
Dai un'occhiata a questo penna .
Dovrai usare due diversi contenitori, uno per l'immagine di sfondo e l'altro per il tuo contenuto.
Nell'esempio, ho creato due contenitori, .background-image
e .content
.
Entrambi sono posizionati con position: fixed
e left: 0; right: 0;
. La differenza nella visualizzazione viene fornita dai valori z-index
che sono stati impostati in modo diverso per gli elementi.
.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>
.
Scuse per il testo lorem ipsum .
Aggiorna
Grazie a Matthew wilcoxson per una migliore implementazione utilizzando .content:before
http://codepen.io/akademy/pen/flkzb
Altri suggerimenti
Abolire la necessità di un elemento extra, insieme a rendere il contenuto in forma all'interno del flusso di documenti anziché essere fisso / assoluto come altre soluzioni.
ottenuto utilizzando
.content {
overflow: auto;
position: relative;
}
.
Overflow Auto è necessario, altrimenti lo sfondo verrà compensato da alcuni pixel in alto.
Dopo questo hai semplicemente bisogno
.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);
}
.
Modifica Se sei interessato a rimuovere i bordi bianchi ai bordi, utilizzare una larghezza e un'altezza di 110%
e una sinistra e la parte superiore del -5%
.Questo amplierà i tuoi sfondi un po '- ma non dovrebbe esserci un sanguinamento a colori solido dai bordi.
Penna aggiornata qui: https://codepen.io/anon/pen/qgyewb -Grazie Chad Fawcett per il suggerimento.
Come indicato in altre risposte questo può essere ottenuto con:
- .
- una copia dell'immagine sfocata come sfondo.
- Un elemento pseudo che può essere filtrato quindi posizionato dietro il contenuto.
Puoi anche usare backdrop-filter
C'è una proprietà supportata chiamata backdrop-filter
ed è attualmente
supportato in Chrome 76, Edge , Safari e IOS Safari (vedi caniuse.com per le statistiche).
Da mozilla devdocs :
.La proprietà del filtro del contesto fornisce effetti come sfocatura o colore che spostano l'area dietro un elemento, che può quindi essere visto attraverso quell'elemento regolando la trasparenza / opacità dell'elemento.
Vedi caniuse.com per le statistiche sull'utilizzo.
Lo useresti come:
.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>
.
Aggiornamento (12/06/2019) : il cromo verrà spedito con backdrop-filter
abilitato per impostazione predefinita nella versione 76 quale è dovuto 30/07/2019 .
Aggiornamento (01/06/2019) : The Mozzilla Firefox Team ha annunciato inizierà a lavorare per implementarti presto.
backdrop-filter
è disponibile in Chrome Canary senza abilitare "Abilita la bandiera della piattaforma web sperimentale". Questo significa backdrop-filter
è molto vicino ad essere implementato su tutte le piattaforme Chrome.
È necessario ri-strutturare il tuo html per fare questo.Devi sfocare l'intero elemento per sfocare lo sfondo.Quindi, se vuoi sfocare solo lo sfondo, deve essere il suo elemento.
Si prega di controllare il seguente codice: -
.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>
.
Di seguito è riportata una soluzione semplice per i moderni browser in Pure CSS con un elemento Pseudo "prima", come la soluzione da Matthew Wilccoxson.
Per evitare la necessità di accedere all'elemento Pseudo per modificare l'immagine e altri attributi in JavaScript, è sufficiente utilizzare inherit
come valore e accedervi tramite l'elemento genitore (qui 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 */
}
. Nella scheda .content
in CSS lo modifica su position:absolute
.In caso contrario, la pagina resa non sarà scorrevole.
Sebbene tutte le soluzioni menzionate siano molto intelligenti, tutte sembravano avere problemi minori o potenziali colpi sugli effetti con altri elementi sulla pagina quando li ho provati.
Alla fine per risparmiare tempo sono semplicemente tornato alla mia vecchia soluzione: ho usato vernice.net E sono andato agli effetti, sfocatura gaussiana con un raggio da 5 a 10 pixel e appena salvato come immagine della pagina.: -)
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;
}
.
Modifica:
Alla fine l'ho capito, ma la soluzione non è affatto semplice!Vedi qui:
Tutto ciò di cui hai effettivamente bisogno è "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>
.