iOS 7'nin CSS kullanarak bulanık bindirme efekti mi?


161

Apple'ın kaplaması sadece bir şeffaflıktan daha fazlası gibi görünüyor. CSS ve muhtemelen JS ile bu etkiyi nasıl elde edeceğiniz konusunda herhangi bir fikir var mı?

Şeffaflıktan daha fazlası


2
Bence daha acil bir endişe, arkasındaki herhangi bir nesneye dinamik bir bulanıklık uygulayan bir öğenin nasıl ayarlanacağıdır. Dolayısıyla, kaydırma ve yakınlaştırma yapabilen bir nesneniz varsa, üstteki öğe düşük performanslı vuruşla dinamik olarak bulanıklaşır.
Rhodes

1
Benzer bir sorun için bu soruya da bakınız .
Keith

43
Windows Vista Aero arabirimi 2006 yılından bu yana pencere kromlarıyla aynı şeyi yaparken, bunun bir 'IOS7 özelliği' olarak istendiğinden endişeleniyorum.
Niels Keurentjes

1
@NielsKeurentjes Heh, gerçek bir nokta. Etkiyi birkaç yıl önce Windows'dan ilham aldıktan sonra bir tasarıma dahil ettim. Ancak, o zamanlar efekti görüntülere pişirmenin kesinlikle daha basit bir yoluna gittim. ryanwilliams.co.uk/previews/made2race/1.html
Ryan Williams

Yanıtlar:


145

CSS3 ile mümkündür:

#myDiv {
    -webkit-filter: blur(20px);
    -moz-filter: blur(20px);
    -o-filter: blur(20px);
    -ms-filter: blur(20px);
    filter: blur(20px);
    opacity: 0.4;
}

Burada örnek => jsfiddle


119
Bu, bir öğenin arka planın bölümlerini bulanıklaştırdığı iOS7'deki gibi etkiyi elde etmez.
Tasarım Adrian

9
Benim jsfiddle düzenledi, şimdi IOS7 gibi hile yapar;) => CSS3 IOS7 etkisi
Cana

34
Adrian'ın belirttiği gibi, filtre sadece bir öğeyi bulanıklaştırır ve çocuklarıdır. Üst öğeleri veya bitişik öğeleri bulanıklaştırmak için bir kaplama için kullanılamaz, bu nedenle iOS 7 efekti CSS ile mümkün değildir.
Jason

10
Bu etkiyi elde etmenin sadece bulanıklaştığını düşünüyorsanız yanılıyorsunuz. JS ve CSS 3'ü kullanarak bu efekti elde eden basit bir açık kaynaklı depo üzerinde çalışıyorum, bizi izlemeye devam edin :)
Ryan Brodie

5
Bu FX'te işe yaramıyor - desteklemiyorlar -moz-filter: blur(). Bunun yerine bir SVG filtresi kullanmak zorundasınız, ayrıntılar için cevabıma bakın.
Keith

48

Beni denemek istedin, ben de denedim, buradaki örneği inceleyin:

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

Kullanımı:

  1. HW Hızlandırılmış CSS filtreleri
  2. Sınıf atama ve ok tuşu olayları için JS
  3. Images CSS Clip özelliği

bu kadar.

Ayrıca, mevcut dom'u kopyalamak ve bulanıklaştırmak için tuval kullanılıyorsa, herhangi bir ekran için dinamik olarak yapılabileceğine inanıyorum.


40

[Düzenle] Gelecekte (mobil) Safari 9 -webkit-backdrop-filtertam olarak bunun için olacak . Göstermek için yaptığım bu kaleme bakın .

Bunu son 4 hafta boyunca düşündüm ve bu çözümü buldum.

Canlı Demo

[Düzenle] CSS-Tricks hakkında daha ayrıntılı bir yazı yazdım

Bu teknik CSS Bölgeleri kullanıyor, bu yüzden tarayıcı desteği şu anda en iyi değil. ( http://caniuse.com/#feat=css-regions )

Bu tekniğin temel kısmı, CSS Bölgesi kullanarak içeriği mizanpajdan ayırmaktır. Öncelikle .contentöğeyi tanımlayın flow-into:contentve ardından başlığı bulanıklaştırmak için uygun yapıyı kullanın.

Düzen yapısı:

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

Bu mizanpajın iki önemli kısmı .header__backgroundve .phone__contentbunlar - içeriğin akması gereken kaplardır.

CSS Bölgeleri'ni kullanmak basittir flow-from:content( .contentbelirtilen bölgeye akıyor content)

Şimdi zor kısım geliyor. .header__backgroundİçeriği her zaman akıtmak istiyoruz çünkü bu, içeriğin bulanıklaştırılacağı bölümdür. (kullanarak webkit-filter:blur(10px);)

Bu yapılır içerik her zaman olsa akacak sağlamak için . Bu dönüşüm her zaman başlığın altındaki bazı içeriği gizlerken. Bunu düzeltmek kolay eklemetransfrom:translateY(-$HeightOfTheHeader).content.header__background

.header__background:before{
  display:inline-block;
  content:'';
  height:$HeightOfTheHEader
}

dönüşüme uyum sağlamak.

Bu şu anda çalışıyor:

  • Chrome 29+ ('deneysel-webkit özelliklerini' / 'etkinleştir-deneysel-web platformu özelliklerini' etkinleştir)
  • Safari 6.1 Tohum 6
  • iOS7 ( yavaş ve kaydırma yok )

1
Canlı demo artık çalışmıyor. İçerik telefonun altına gider ve JS "TypeError: sheet.addRule bir işlev değil" hatası alıyorum
BoffinBrain

Mac ve iOS'ta Safari ile iyi çalışır.
Carlos Silva

16

Bu, element stili özelliği sayesinde FireFox ile mümkün .

Bu deneysel özellik, herhangi bir HTML içeriğini arka plan görüntüsü olarak kullanmanızı sağlar. Yani, arka plan oluşturmak için üç bindirmeye ihtiyacınız var:

  1. Sağlam bir arka plana sahip basit kaplama (gerçek kaplama içeriğini gizlemek için).
  2. -moz-elementİçeriği ayarlayan bir arka planla kaplama . FX'in bu özelliği desteklemediğini unutmayın filter: blur(), bu yüzden bize bir SVG gerekir.
  3. Bulanık olmayan içeriğe sahip kaplama.

Yani, bir araya getirin:

SVG bulanıklaştırma filtresi (FX'de çalışır, diğer tarayıcılar kullanabilir filter:blur()):

<svg>
  <defs>
    <filter id="svgBlur">
      <feGaussianBlur stdDeviation="10"/>
    </filter>
  </defs>
</svg>

CSS bulanıklık stili:

.behind-blur 
{
    filter         : url(#svgBlur); 
    opacity: .4;
    background: -moz-element(#content);
    background-repeat: no-repeat;
}

Sonunda 3 katman:

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

Sonra bunu hareket ettirmek için sadece set background-position(jQuery örnek ama herhangi bir şey kullanabilirsiniz):

$('.behind-blur').css({
    'background-position': '-' + left + 'px -' + top + 'px'
}); 

Burada sadece JS Fiddle, FX.


1
Sizin çözümünüz aklımdakine benzer. Bulanık arka planın dilimini uzatarak aksaklığı ( jsfiddle.net/RgBzH/30 ) düzelttim , böylece bulanıklık gerçek dilimle değil, gerçek içerikle gerçekleşir. Her neyse iyi uygulama.
Pier Paolo Ramon

@PierPaoloRamon güzel tweak - bunu kullanacaktım, muhtemelen SVG filtresini, iOS7'nin de yaptığı artırılmış parlaklık / azaltılmış kontrastı içerecek şekilde biraz genişleteceğim, ancak FX bu noktada sadece sandbox anlamına geliyor. Geçici çözümler hakkında başka bir soru sordum .
Keith

BTW, çözümünüz Firefox OS'ye sadece ios7 benzeri bir bulanıklık getiriyor ve bu temiz (bunu test etmek zorundayım).
Pier Paolo Ramon

14

Bu demo sayfasına göz atın.
Bu demo, belgeyi görüntü olarak oluşturmak için html2canvas kullanır.

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

  1. "Pop-up pencereyi göster" bağlantısı tıklandığında 'makePopup' işlevi çağrılır.
  2. 'makePopup' çalışan html2canvas bir görüntü olarak belgenin oluşturulması için.
  3. Görüntü, veri url dizesine dönüştürülür ve pop-up'ın arka plan resmi olarak boyanır.
  4. Popup'ın bg'si -webkit-filter ile bulanık : bulanıklık
  5. Açılır pencereyi belgeye ekleyin.
  6. Açılır pencereyi sürüklerken, kendi arka plan konumunu değiştirir.

1
Lütfen demonun gerçekte ne yaptığını açıklayın, çünkü bir kez düştüğünde, herhangi bir yardımcı olmayacaktır.
Jonathan Drapeau

Bu gerçekten güzel bir fikir - maalesef html2canvas , henüz uygulanmakta olan şey olmadığı sürece ekran görüntülerine güvenilemeyecek kadar deneysel ve muhtemelen çok büyük.
Keith

5
tahmin ettiğiniz gibi @JonathanDrapeau.
Mark

Woo! Bağlantı çürüklüğü seviyorum!
evolutionxbox

Hala görüntüler üzerinde bulanıklaştırma kullanıyor, bunun yapışkan bir navbar gibi bir şey üzerinde nasıl çalışabileceğini görmüyorum.
maninak

10

Geçen gün bulduğum bu kalem, css ve 21 satır javascript biraz güzel gibi görünüyordu. Bunu bulana kadar cloneNode js komutunu duymamıştım, ama tamamen emin olmak için ne için çalıştı.

http://codepen.io/rikschennink/pen/zvcgx

Ayrıntı: A. Temelde içerik div'inize bakar ve üzerinde bir cloneNode çağırır, böylece bir kopya oluşturur ve bu sayfa daha sonra taşma: gizli başlık nesnesi sayfanın üstünde oturuyor. B. Daha sonra her iki görüntünün de eşleştiği ve başlık görüntüsünün bulanıklaşacağı şekilde kaydığını dinler ... ve BAM. Etki elde edildi.

CSS'de, dilin içine yerleştirilmiş küçük bir betik yazılabilene kadar gerçekten tam olarak mümkün değil.


Harika görünüyor! Bu, dinamik içerikle çok iyi çalışmayacak olsa da, her değişiklik olduğunda kopyayı güncellemediğiniz sürece - bu muhtemelen büyük bir performans isabeti olacaktır.
Nass

Sanırım, ama görüntüleri nerede değiştireceğinizden ve bu efekti yapmaya çalıştığınızdan emin değil misiniz? Düzgün yapılırsa, klonu geri dönüştürürseniz büyük bir isabet olmamalıdır. Belki de buna karşılık gelen bir vakayı ayrıntılandırabilirsiniz? Örneğin, bir görüntü beslemesi yaptığınızı ve her öğe için bir görüntü menüsü için bu efektle bazı menü seçeneklerinin gelmesini istediğinizi varsayalım ... paneli ve bindirmelerin istediği poster gibi görünecek paneli açarken bunu çalıştırın. Wee geri dönüşümcüsü ekleyin, böylece menleri her açtığınızda görüntülerin sonsuza kadar çoğaltılmaması ve güzel performans göstermesi gerekir.
Lux Capacitor

5
  • bulanıklaştırmak istediğiniz öğeyi klonlayın
  • üstte olmasını istediğiniz öğeye ekleyin (buzlu pencere)
  • webkit-filter ile klonlanmış öğeyi bulanıklaştırma
  • klonlanmış elemanın mutlak konumlandırıldığından emin olun
  • orijinal öğenin üst öğesini kaydırırken scrollTop ve scrollLeft öğelerini yakalayın
  • requestAnimationFrame kullanarak, webkit-dönüşümünü dinamik olarak translate3d öğesini x ve y değerleriyle scrollTop ve scrollLeft'e ayarlayın

Örnek burada:

  • webkit tarayıcısında açtığınızdan emin olun
  • telefon görünümü içinde kaydırma (en iyi elma faresiyle ...)
  • bulanık altbilgiyi çalışırken görün

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


4

dün hızlıca bir demo yaptı. http://bit.ly/10clOM9 bu demo ivmeölçere dayalı paralaks yapar, böylece en iyi bir iPhone üzerinde çalışır. Temel olarak, üzerine yerleştirdiğimiz içeriği bulanıklaşan sabit bir konum öğesine kopyalarım.

not: paneli görmek için yukarı kaydırın.

(korkunç css kimlikleri kullandım ama fikri anladın)

#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

Bundan pek emin değilim, şu anda CSS'nin bunu yapamayacağına inanıyorum

Ancak Chris Coyier, böyle bir etkiyi elde etmek için birden fazla resim içeren eski bir teknik hakkında blog yazdı, http://css-tricks.com/blurry-background-effect/


tuvalden ekranın anlık görüntüsü işe yarayabilir ve bunu yapmadan önce simgeleri ve arka planı 'kilitleyebilir', ancak arka planın bulanıklaştığında simgelerin altında hala paralaks efekti olup olmadığını göremedim ... sonra, kontrol panelini (şeffaf kaplama) hareket ettirmeye başladığınız anda cihaz ekranın bir görüntüsünü oluşturur ve bu hileyi aşar. aklınızda bulundurun, sadece os seviyesinde olduğu için tuval gibi web tabanlı şeylerle sınırlı değiller ve webkit şeyler ile sınırlı olmayabilirler.
nosarious

3

Bunu kontrol edin http://codepen.io/GianlucaGuarini/pen/Hzrhf Altındaki öğenin arka plan görüntüsünü çoğaltmadan etki yapıyor gibi görünüyor. Örneklerde de metinler bulanıklaşıyor.

Vague.js

var vague = $blurred.find('iframe').Vague({
  intensity:5 //blur intensity
});
vague.blur();

1
Bu kopyalar içeriği (iki Iframe'ler Bağlı codepen örnekte vardır). Bir menü öğesini tıklamayı deneyin, bulanık iframe güncellenmez.
Guglie

Zaten bir tür çözüm.
Onur Çelik

2

İyi haberler

Bugün 11 Nisan 2020 itibariyle, backdrop-filterşu anda Chrome, Safari & Edge'de istikrarlı bir özellik olan CSS özelliği ile bu kolayca mümkündür .

Bunu Android / Chrome Webview ve Safari WebView'da da bulunan Hybrid mobil uygulamamızda istedim.

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

Kod Örneği:

CSS özelliğini eklemeniz yeterlidir:

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

Kullanıcı Arayüzü Örneği 1

Bu kalemde çalıştığını görün veya demoyu deneyin:

#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>

Kullanıcı Arayüzü Örneği 2

McDonald's uygulamasının bir örneğini alalım çünkü oldukça renkli. Ekran görüntüsünü bodyaldım ve uygulamamın arkaplanını ekledim .

Üzerine parlak bir efektle bir metin göstermek istedim. backdrop-filter: blur(20px);Yukarıdaki bindirmeyi kullanarak bunu görebildim: 😍

Ana ekran görüntüsü resim açıklamasını buraya girin


backdrop-filteryine de Firefox'ta otomatik olarak çalışmıyor. Kullanıcıların backdrop-filtersadece bu etkiyi görmek için kasıtlı olarak etkinleştirme seçeneklerini açacağından şüpheliyim .
Richard

0

Spritelar için benzer efektler elde etmek için svg filtreleri kullanıyorum

<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>
  • ViewBox özniteliği, dahil edilen görüntünüzün yalnızca istediğiniz bölümünü seçer.
  • Filtreyi Keith'in <feGaussianBlur stdDeviation="10"/>örneği gibi istediğiniz herhangi biriyle değiştirin .
  • <image ...>Herhangi bir görüntüye uygulamak için etiketi kullanın, hatta birden fazla görüntü kullanın.
  • Bunu js ile oluşturabilir ve resim olarak kullanabilir veya kimliğinizdeki kimliği kullanabilirsiniz.

Bunun bir yerinde çalışan bir örneğiniz var mı? Belki de bir jsFiddle veya benzeri? Teşekkürler
Blaker


-1

İşte bu jQuery ile benim almak. Çözüm evrensel değildir, yani gerçek tasarıma bağlı olarak bazı pozisyonları ve şeyleri değiştirmek zorunda kalacaktır.

Temel olarak yaptığım şey: tetikleme klonunda / bulanık olmayan içeriğe sahip bir kaba tüm arka planı kaldırmak (bulanıklaştırılması gereken) (isteğe bağlı olarak, tam genişlik değilse gizli taşmaya sahip) ve doğru konumlandırın. Dikkat, pencere yeniden boyutlandırma bulanık div pozisyon açısından orijinal uyumsuzluk, ama bu pencere yeniden boyutlandırma fonksiyonu bazı ile çözülebilir (dürüstçe ben şimdi rahatsız olamazdı).

Bu çözüm hakkındaki görüşlerinizi gerçekten takdir ediyorum!

Teşekkürler

İşte IE'de test edilmeyen keman .

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');
    }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.