Sembra che l'overlay di Apple non sia solo una trasparenza. Qualche idea su come ottenere questo effetto con CSS e possibilmente JS?
Sembra che l'overlay di Apple non sia solo una trasparenza. Qualche idea su come ottenere questo effetto con CSS e possibilmente JS?
Risposte:
È possibile con CSS3:
#myDiv {
-webkit-filter: blur(20px);
-moz-filter: blur(20px);
-o-filter: blur(20px);
-ms-filter: blur(20px);
filter: blur(20px);
opacity: 0.4;
}
Esempio qui => jsfiddle
-moz-filter: blur()
. Invece devi usare un filtro SVG, vedi la mia risposta per i dettagli.
http://codepen.io/Edo_B/pen/cLbrt
usando:
questo è tutto.
Credo anche che questo potrebbe essere fatto in modo dinamico per qualsiasi schermo se si utilizza canvas per copiare il dom corrente e sfocarlo.
[Modifica] In futuro (mobile) Safari 9 ci sarà -webkit-backdrop-filter
esattamente questo. Guarda questa penna che ho realizzato per mostrarlo.
Ci ho pensato per le ultime 4 settimane e ho trovato questa soluzione.
[Modifica] Ho scritto un post più approfondito su CSS-Tricks
Questa tecnica utilizza le regioni CSS, quindi il supporto del browser non è il migliore in questo momento. ( http://caniuse.com/#feat=css-regions )
La parte fondamentale di questa tecnica è quella di dividere il contenuto dal layout utilizzando CSS Region. Definisci prima un .content
elemento con flow-into:content
e poi usa la struttura appropriata per sfocare l'intestazione.
La struttura del layout:
<div class="phone">
<div class="phone__display">
<div class="header">
<div class="header__text">Header</div>
<div class="header__background"></div>
</div>
<div class="phone__content">
</div>
</div>
</div>
Le due parti importanti di questo layout sono .header__background
e .phone__content
- questi sono i contenitori in cui il contenuto dovrebbe fluire però.
Utilizzando le regioni CSS è semplice come flow-from:content
( .content
scorre nella regione denominata content
)
Ora viene la parte difficile. Vogliamo sempre far scorrere il contenuto attraverso .header__background
perché quella è la sezione in cui il contenuto sarà blured. (usando webkit-filter:blur(10px);
)
Questo viene fatto transfrom:translateY(-$HeightOfTheHeader)
il .content
per garantire che il contenuto sarà sempre fluire anche se il .header__background
. Questa trasformazione nasconde sempre del contenuto sotto l'intestazione. Risolvere questo è facile aggiungere
.header__background:before{
display:inline-block;
content:'';
height:$HeightOfTheHEader
}
per accogliere la trasformazione.
Questo funziona attualmente in:
Questo è possibile con FireFox ora grazie all'attributo style element .
Questo attributo sperimentale ti consente di utilizzare qualsiasi contenuto HTML come immagine di sfondo. Quindi, per creare lo sfondo sono necessari tre overlay:
-moz-element
sfondo che imposta il contenuto. Nota che FX non supporta l' filter: blur()
attributo, quindi abbiamo bisogno di noi un SVG.Quindi, mettere insieme:
Filtro sfocatura SVG (funziona in FX, altri browser potrebbero usare filter:blur()
):
<svg>
<defs>
<filter id="svgBlur">
<feGaussianBlur stdDeviation="10"/>
</filter>
</defs>
</svg>
Stile di sfocatura CSS:
.behind-blur
{
filter : url(#svgBlur);
opacity: .4;
background: -moz-element(#content);
background-repeat: no-repeat;
}
Finalmente 3 strati:
<div class="header" style="background-color: #fff"> </div>
<div class="header behind-blur"> </div>
<div class="header">
Header Text, content blurs behind
</div>
Quindi per spostarlo basta impostare il background-position
(campione in jQuery ma potresti usare qualsiasi cosa):
$('.behind-blur').css({
'background-position': '-' + left + 'px -' + top + 'px'
});
Dai un'occhiata a questa pagina demo.
Questa demo utilizza html2canvas per il rendering del documento come immagine.
http://blurpopup.labs.daum.net/
Questa penna che ho trovato l'altro giorno sembrava farlo magnificamente, solo un po 'di CSS e 21 righe di JavaScript. Non avevo sentito parlare del comando cloneNode js fino a quando non l'ho trovato, ma ha funzionato totalmente per quello di cui avevo bisogno di sicuro.
http://codepen.io/rikschennink/pen/zvcgx
Dettaglio: A. Fondamentalmente guarda il tuo div di contenuto e invoca un cloneNode su di esso in modo da creare un duplicato che poi posiziona all'interno dell'overflow: oggetto header nascosto nascosto nella parte superiore della pagina. B. Quindi ascolta semplicemente lo scorrimento in modo che entrambe le immagini sembrino corrispondere e sfuocano l'immagine dell'intestazione ... annnnd BAM. Effetto ottenuto.
In realtà non è completamente fattibile nei CSS fino a quando non ottengono il minimo di scripting incorporato nel linguaggio.
L'esempio è qui:
ieri ho fatto una breve demo che in realtà fa ciò di cui stai parlando. http://bit.ly/10clOM9 questa demo esegue la parallasse basata sull'accelerometro, quindi funziona meglio su un iPhone stesso. Fondamentalmente copio solo il contenuto che stiamo sovrapponendo in un elemento di posizione fisso che viene sfocato.
nota: scorrere verso l'alto per vedere il pannello.
(Ho usato un ID css orribile ma hai avuto l'idea)
#frost{
position: fixed;
bottom: 0;
left:0;
width: 100%;
height: 100px;
overflow: hidden;
-webkit-transition: all .5s;
}
#background2{
-webkit-filter: blur(15px) brightness(.2);
}
#content2fixed{
position: fixed;
bottom: 9px;
left: 9px;
-webkit-filter: blur(10px);
}
Non ne sono molto sicuro, credo che CSS al momento non sia in grado di farlo
Tuttavia Chris Coyier ha scritto un blog su una vecchia tecnica con più immagini per ottenere tale effetto, http://css-tricks.com/blurry-background-effect/
Dai un'occhiata a questo http://codepen.io/GianlucaGuarini/pen/Hzrhf Sembra che faccia l'effetto senza duplicare l'immagine di sfondo dell'elemento sotto se stesso. Vedi i testi sono sfocati anche nell'esempio.
Vague.js
var vague = $blurred.find('iframe').Vague({
intensity:5 //blur intensity
});
vague.blur();
A partire da oggi 11 aprile 2020 , questo è facilmente possibile con la backdrop-filter
proprietà CSS che è ora una funzione stabile in Chrome, Safari & Edge.
Lo volevo nella nostra app mobile ibrida, quindi disponibile anche in Android / Chrome Webview e Safari WebView.
Aggiungi semplicemente la proprietà CSS:
.my-class {
backdrop-filter: blur(30px);
background: transparent; // Make sure there is not backgorund
}
Guarda come funziona in questa penna o prova la demo:
#main-wrapper {
width: 300px;
height: 300px;
background: url("https://i.picsum.photos/id/1001/500/500.jpg") no-repeat center;
background-size: cover;
position: relative;
overflow: hidden;
}
.my-effect {
position: absolute;
top: 300px;
left: 0;
width: 100%;
height: 100%;
font-size: 22px;
display: flex;
justify-content: center;
align-items: center;
color: black;
-webkit-backdrop-filter: blur(15px);
backdrop-filter: blur(15px);
transition: top 700ms;
}
#main-wrapper:hover .my-effect {
top: 0;
}
<h4>Hover over the image to see the effect</h4>
<div id="main-wrapper">
<div class="my-effect">
Glossy effect worked!
</div>
</div>
Facciamo un esempio dell'app di McDonald perché è piuttosto colorata. Ho preso il suo screenshot e aggiunto come sfondo nella body
mia app.
Volevo mostrare un testo sopra con l'effetto lucido. Usando backdrop-filter: blur(20px);
l'overlay sopra di esso, sono stato in grado di vedere questo: 😍
backdrop-filter
comunque non funziona automaticamente in Firefox. Dubito che gli utenti attiveranno le opzioni per attivare backdrop-filter
deliberatamente solo per vedere questo effetto.
Ho usato i filtri svg per ottenere effetti simili per gli sprite
<svg id="gray_calendar" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 48 48 48">
<filter id="greyscale">
<feColorMatrix type="saturate" values="0"/>
</filter>
<image width="48" height="10224" xlink:href="tango48i.png" filter="url(#greyscale)"/>
</svg>
<feGaussianBlur stdDeviation="10"/>
nell'esempio di Keith .<image ...>
tag per applicarlo a qualsiasi immagine o addirittura usa più immagini.Questo potrebbe aiutarti !!
Questo cambia dinamicamente lo sfondo solo su IOS
.myBox {
width: 750px;
height: 500px;
border: rgba(0, 0, 0, 0.5) 1px solid;
background-color: #ffffff;
}
.blurBg {
width: 100%;
height: 100%;
overflow: hidden;
z-index: 0;
}
.blurBg img {
-webkit-filter: blur(50px);
margin-top: -150px;
margin-left: -150px;
width: 150%;
opacity: 0.6;
}
Ecco la mia opinione su questo con jQuery. La soluzione non è universale, il che significa che si dovrebbero modificare alcune posizioni e cose a seconda del design reale.
Fondamentalmente quello che ho fatto è stato: sul grilletto clonare / rimuovere l'intero sfondo (cosa dovrebbe essere sfocato) in un contenitore con contenuto non sfocato (che, facoltativamente, ha un overflow nascosto se non è a larghezza piena) e posizionarlo correttamente. Un avvertimento è che sul ridimensionamento della finestra il div sfocato non corrisponderà all'originale in termini di posizione, ma questo potrebbe essere risolto con alcune funzioni di ridimensionamento della finestra (onestamente non potrei essere disturbato con quello ora).
Gradirei davvero la tua opinione su questa soluzione!
Grazie
Ecco il violino , non testato in IE.
HTML
<div class="slide-up">
<div class="slide-wrapper">
<div class="slide-background"></div>
<div class="blured"></div>
<div class="slide-content">
<h2>Pop up title</h2>
<p>Pretty neat!</p>
</div>
</div>
</div>
<div class="wrapper">
<div class="content">
<h1>Some title</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque molestie magna elit, quis pulvinar lectus gravida sit amet. Phasellus lacinia massa et metus blandit fermentum. Cras euismod gravida scelerisque. Fusce molestie ligula diam, non porta ipsum faucibus sed. Nam interdum dui at fringilla laoreet. Donec sit amet est eu eros suscipit commodo eget vitae velit.</p>
</div> <a class="trigger" href="#">trigger slide</a>
</div>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
<filter id="blur">
<feGaussianBlur stdDeviation="3" />
</filter>
</svg>
CSS
body {
margin: 0;
padding: 0;
font-family:'Verdana', sans-serif;
color: #fff;
}
.wrapper {
position: relative;
height: 100%;
overflow: hidden;
z-index: 100;
background: #CD535B;
}
img {
width: 100%;
height: auto;
}
.blured {
top: 0;
height: 0;
-webkit-filter: blur(3px);
-moz-filter: blur(3px);
-ms-filter: blur(3px);
filter: blur(3px);
filter: url(#blur);
filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius='3');
position: absolute;
z-index: 1000;
}
.blured .wrapper {
position: absolute;
width: inherit;
}
.content {
width: 300px;
margin: 0 auto;
}
.slide-up {
top:10px;
position: absolute;
width: 100%;
z-index: 2000;
display: none;
height: auto;
overflow: hidden;
}
.slide-wrapper {
width: 200px;
margin: 0 auto;
position: relative;
border: 1px solid #fff;
overflow: hidden;
}
.slide-content {
z-index: 2222;
position: relative;
text-align: center;
color: #333333;
}
.slide-background {
position: absolute;
top: 0;
width: 100%;
height: 100%;
background-color: #fff;
z-index: 1500;
opacity: 0.5;
}
jQuery
// first just grab some pixels we will use to correctly position the blured element
var height = $('.slide-up').outerHeight();
var slide_top = parseInt($('.slide-up').css('top'), 10);
$wrapper_width = $('body > .wrapper').css("width");
$('.blured').css("width", $wrapper_width);
$('.trigger').click(function () {
if ($(this).hasClass('triggered')) { // sliding up
$('.blured').animate({
height: '0px',
background: background
}, 1000, function () {
$('.blured .wrapper').remove();
});
$('.slide-up').slideUp(700);
$(this).removeClass('triggered');
} else { // sliding down
$('.wrapper').clone().appendTo('.blured');
$('.slide-up').slideDown(1000);
$offset = $('.slide-wrapper').offset();
$('.blured').animate({
height: $offset.top + height + slide_top + 'px'
}, 700);
$('.blured .wrapper').animate({
left: -$offset.left,
top: -$offset.top
}, 100);
$(this).addClass('triggered');
}
});