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ı?
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ı?
Yanıtlar:
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
-moz-filter: blur()
. Bunun yerine bir SVG filtresi kullanmak zorundasınız, ayrıntılar için cevabıma bakın.
http://codepen.io/Edo_B/pen/cLbrt
Kullanımı:
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.
[Düzenle] Gelecekte (mobil) Safari 9 -webkit-backdrop-filter
tam 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.
[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:content
ve 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__background
ve .phone__content
bunlar - içeriğin akması gereken kaplardır.
CSS Bölgeleri'ni kullanmak basittir flow-from:content
( .content
belirtilen 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:
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:
-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.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"> </div>
<div class="header behind-blur"> </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'
});
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/
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.
Örnek burada:
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);
}
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/
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();
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.
CSS özelliğini eklemeniz yeterlidir:
.my-class {
backdrop-filter: blur(30px);
background: transparent; // Make sure there is not backgorund
}
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>
McDonald's uygulamasının bir örneğini alalım çünkü oldukça renkli. Ekran görüntüsünü body
aldı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: 😍
backdrop-filter
yine de Firefox'ta otomatik olarak çalışmıyor. Kullanıcıların backdrop-filter
sadece bu etkiyi görmek için kasıtlı olarak etkinleştirme seçeneklerini açacağından şüpheliyim .
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>
<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.Bu size yardımcı olabilir !!
Bu, yalnızca IOS'un yaptığı arka planı dinamik olarak değiştirir
.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;
}
İş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');
}
});