L'effetto overlay sfocato di iOS 7 con CSS?


161

Sembra che l'overlay di Apple non sia solo una trasparenza. Qualche idea su come ottenere questo effetto con CSS e possibilmente JS?

Più che trasparenza


2
Una preoccupazione più urgente secondo me è come impostare un elemento che applica una sfocatura dinamica a qualsiasi oggetto dietro di esso. Quindi, se avessi un oggetto in grado di eseguire la panoramica e lo zoom, l'elemento in alto si sfocerebbe in modo dinamico con un colpo a bassa prestazione.
Rodi,

1
Vedi anche questa domanda per un problema simile.
Keith,

43
Trovo forse più preoccupante che questo sia desiderato come una "funzionalità IOS7" mentre l'interfaccia Windows Vista Aero ha fatto esattamente la stessa cosa con i suoi
cromatismi delle

1
@NielsKeurentjes Heh, un vero punto. Ho incorporato l'effetto in un design qualche anno fa dopo essere stato ispirato da Windows. Tuttavia, allora ho optato per il percorso decisamente più semplice di solo cuocere l'effetto nelle immagini. ryanwilliams.co.uk/previews/made2race/1.html
Ryan Williams

Risposte:


145

È 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


119
Questo non ottiene l'effetto come in iOS7 in cui un elemento sfoca parti dello sfondo.
Design di Adrian,

9
Ho modificato il mio jsfiddle, ora fa il trucco come IOS7;) => CSS3 IOS7 effect
Cana

34
Come notato da Adrian, il filtro sfoca solo un elemento ed è figlio. Non può essere utilizzato per un overlay per sfocare gli elementi padre o gli elementi adiacenti, quindi l'effetto iOS 7 non è possibile con i CSS.
Jason,

10
Se pensi che sia solo sfocato in corso per ottenere questo effetto, ti sbaglieresti. Sto lavorando ad un semplice repository open source che ottiene questo effetto utilizzando sia JS che CSS 3, rimanete sintonizzati :)
Ryan Brodie,

5
Questo non funziona in FX - non supportano -moz-filter: blur(). Invece devi usare un filtro SVG, vedi la mia risposta per i dettagli.
Keith,

48

Mi hai fatto venire voglia di provare, così ho fatto, guarda l'esempio qui:

http://codepen.io/Edo_B/pen/cLbrt

usando:

  1. Filtri CSS accelerati HW
  2. JS per l'assegnazione delle classi e gli eventi dei tasti freccia
  3. Proprietà Clip CSS immagini

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.


40

[Modifica] In futuro (mobile) Safari 9 ci sarà -webkit-backdrop-filteresattamente questo. Guarda questa penna che ho realizzato per mostrarlo.

Ci ho pensato per le ultime 4 settimane e ho trovato questa soluzione.

Dimostrazione dal vivo

[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 .contentelemento con flow-into:contente 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__backgrounde .phone__content- questi sono i contenitori in cui il contenuto dovrebbe fluire però.

Utilizzando le regioni CSS è semplice come flow-from:content( .contentscorre nella regione denominata content)

Ora viene la parte difficile. Vogliamo sempre far scorrere il contenuto attraverso .header__backgroundperché quella è la sezione in cui il contenuto sarà blured. (usando webkit-filter:blur(10px);)

Questo viene fatto transfrom:translateY(-$HeightOfTheHeader)il .contentper 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:

  • Chrome 29+ (abilita 'funzioni-sperimentali-webkit' / 'abilita-caratteristiche-piattaforma-web-sperimentali')
  • Safari 6.1 Seed 6
  • iOS7 ( scorrimento lento e senza scorrimento )

1
La demo live non funziona più. Il contenuto passa sotto il telefono e viene visualizzato l'errore JS "TypeError: sheet.addRule non è una funzione"
BoffinBrain

Funziona bene con Safari su Mac e iOS.
Carlos Silva,

16

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:

  1. Sovrapposizione semplice con uno sfondo solido (per nascondere il contenuto reale della sovrapposizione).
  2. Sovrapponi con uno -moz-elementsfondo che imposta il contenuto. Nota che FX non supporta l' filter: blur()attributo, quindi abbiamo bisogno di noi un SVG.
  3. Sovrapposizione con contenuti non sfocati.

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">&nbsp;</div>
<div class="header behind-blur">&nbsp;</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'
}); 

Qui è come JS Fiddle, solo FX.


1
La tua soluzione è simile a quella che avevo in mente. Ho risolto il problema tecnico ( jsfiddle.net/RgBzH/30 ) estendendo la porzione dello sfondo sfocata, quindi la sfocatura si verifica effettivamente sul contenuto reale, non su quello tagliato. Buona esecuzione, comunque.
Pier Paolo Ramon,

@PierPaoloRamon: un bel ritocco - se lo avessi usato probabilmente estenderei un po 'il filtro SVG per includere la maggiore luminosità / il contrasto ridotto che fa anche iOS7, ma FX significa solo rigorosamente sandbox a questo punto. Ho fatto un'altra domanda su soluzioni alternative.
Keith,

A proposito, la tua soluzione porta solo sfocatura simile a iOS7 su Firefox OS, ed è pulito (devo provarlo).
Pier Paolo Ramon,

14

Dai un'occhiata a questa pagina demo.
Questa demo utilizza html2canvas per il rendering del documento come immagine.

http://blurpopup.labs.daum.net/

  1. Quando si fa clic sul collegamento "Mostra popup", viene chiamata la funzione "makePopup".
  2. 'makePopup' esegue html2canvas per il rendering del documento come immagine.
  3. L'immagine viene convertita in stringa url dati e viene dipinta come immagine di sfondo del popup.
  4. Il bg di Popup è sfocato da -webkit-filter: sfocatura
  5. Aggiungi il popup al documento.
  6. Mentre trascini il popup, cambia la sua posizione in background.

1
Fornisci una spiegazione di cosa fa effettivamente la demo poiché una volta che non funziona, non sarà di alcun aiuto.
Jonathan Drapeau,

Questa è davvero una bella idea - sfortunatamente html2canvas è troppo sperimentale per essere ancora attendibile e probabilmente troppo grande a meno che gli screenshot non siano ciò di cui si occupa la tua applicazione.
Keith,

5
è giù @JonathanDrapeau come avevi previsto.
Segna il

Corteggiare! Adoro il marciume dei link!
evolutionxbox

Usa ancora la sfocatura delle immagini, non vedo come possa funzionare su qualcosa come una barra di navigazione appiccicosa.
maninak,

10

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.


Sembra fantastico! Anche se questo ovviamente non funzionerebbe troppo bene con i contenuti dinamici, a meno che non si aggiorni il duplicato ogni volta che cambia qualcosa, il che sarebbe probabilmente un grande successo in termini di prestazioni.
Nass

Suppongo, ma non sei sicuro di dove cambieresti le immagini e provi a fare questo effetto? Se fatto correttamente, non dovrebbe essere un grosso successo se ricicli il clone. Forse puoi dettagliare un caso per conversare a questo? Ad esempio, supponi di creare un feed di immagini e desideri che vengano visualizzate alcune opzioni di menu con questo effetto per un menu di immagini per ogni elemento ... eseguilo mentre sveli il pannello e il pannello che si sovrappone sembrerebbe quindi il poster desiderato. Aggiungi un piccolo riciclatore in modo che dom non duplichi continuamente immagini ogni volta che apri i menu e dovrebbe funzionare bene.
Lux.Capacitor

5
  • clonare l'elemento che si desidera sfocare
  • aggiungilo all'elemento che vuoi essere in cima (la finestra smerigliata)
  • sfocatura elemento clonato con filtro webkit
  • assicurarsi che l'elemento clonato sia posizionato in modo assoluto
  • durante lo scorrimento del genitore dell'elemento originale, cattura scrollTop e scrollLeft
  • usando requestAnimationFrame, ora imposta dinamicamente la trasformazione webkit su translate3d con i valori xey su scrollTop e scrollLeft

L'esempio è qui:

  • assicurati di aprire nel browser webkit
  • scorrere all'interno della vista del telefono (meglio con il mouse Apple ...)
  • vedere il piè di pagina sfocato in azione

http://versie1.com/TEST/ios7/


4

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);
}

3

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/


un'istantanea dello schermo su tela potrebbe funzionare e 'bloccare' le icone e lo sfondo prima di farlo, ma non sono stato in grado di vedere se lo sfondo aveva ancora l'effetto di parallasse sotto le icone quando era sfocato ... se non lo facesse Quindi, nel momento in cui inizi a spostare il pannello di controllo (overlay trasparente), il dispositivo crea un'immagine dello schermo ed esegue questo inganno. intendiamoci, non sono limitati solo da cose basate sul web come la tela quando lo fanno dal momento che è a livello di sistema operativo e potrebbero non essere limitate alle cose del webkit.
Nosario l'

3

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();

1
Si duplica il contenuto (ci sono due iframe nell'esempio codepen si è collegato). Prova a fare clic su una voce di menu, l'iframe sfocato non si aggiorna.
Guglie,

È comunque una soluzione.
Onur Çelik

2

Buone notizie

A partire da oggi 11 aprile 2020 , questo è facilmente possibile con la backdrop-filterproprietà 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.

  1. https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter
  2. https://caniuse.com/#search=backdrop-filter

Esempio di codice:

Aggiungi semplicemente la proprietà CSS:

.my-class {
    backdrop-filter: blur(30px);
    background: transparent;     // Make sure there is not backgorund
}

UI Esempio 1

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>

UI Esempio 2

Facciamo un esempio dell'app di McDonald perché è piuttosto colorata. Ho preso il suo screenshot e aggiunto come sfondo nella bodymia 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: 😍

Schermata principale inserisci qui la descrizione dell'immagine


backdrop-filtercomunque non funziona automaticamente in Firefox. Dubito che gli utenti attiveranno le opzioni per attivare backdrop-filterdeliberatamente solo per vedere questo effetto.
Richard,

0

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>
  • L'attributo viewBox selezionerà solo la porzione dell'immagine inclusa desiderata.
  • Basta cambiare il filtro con quello che vuoi, come <feGaussianBlur stdDeviation="10"/>nell'esempio di Keith .
  • Usa il <image ...>tag per applicarlo a qualsiasi immagine o addirittura usa più immagini.
  • Puoi costruirlo con js e usarlo come immagine o usare l'id nel tuo css.

Ti capita di avere un esempio funzionante di questo da qualche parte? Forse un jsFiddle o simile? Grazie
Blaker il

0

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;
}

-1

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');
    }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.