- Forza Horizon 3 ve Forza Motorsport 7’nin frosted acrylic UI tasarımından yola çıkarak, web’de de benzer cam panel efektinin HTML/CSS/JavaScript ile nasıl yeniden üretileceği anlatılıyor
- Efektin merkezinde Gaussian blur bulunuyor; tarayıcılar arasındaki farkları azaltmak için CSS
backdrop-filterile iOS için-webkit-backdrop-filterbirlikte kullanılmalı - Yalnızca blur kullanmak yüzeyi düz gösterdiğinden,
box-shadow: insetile kenar derinliği ve subsurface scattering ekleniyor; normal gölgeyle de arka planın üzerinde süzülüyormuş hissi veriliyor - Yüzey yansımaları, ayrı bir katmanda kullanılan ışık huzmesi görseli ile oluşturuluyor;
background-attachment: fixedya da JavaScript ile camın hareketine uyum sağlayan dinamik yansımalar taklit ediliyor - Son UI,
.glass,.light,.drag-mekatmanlarının birleşimiyle; yuvarlatılmış köşeler, clipping ve yarı saydam arka plan rengi eklenerek kopyalanabilir bir cam bileşeni halinde tamamlanıyor
Oyun UI’ından alınan cam panel efekti
- Amaç, Forza Horizon 3 ve Forza Motorsport 7 için UI geliştirme deneyiminde görülen frosted acrylic tasarımını HTML ile yeniden üretmek
- Ortaya çıkan sonuç; sürüklenebilir bir cam panel, arka plan blur’u, kenar derinliği, ışık yansımaları, yuvarlatılmış köşeler ve yarı saydam renk katmanlarını birlikte içeriyor
- Başta doğrudan kopyalanıp kullanılabilecek nihai tarif veriliyor, ardından her efekt adım adım ekleniyor
Arka plan blur’u için backdrop-filter
- İyi bir frosted glass efektinin özü, arka planı blur’layarak yarı saydam bir ekran gibi görünmesini sağlayan Gaussian blur
- CSS’te bu,
backdrop-filterüzerinebluruygulanarak yapılıyor - Temel cam öğesi, basit bir
divve.glasssınıfıyla başlıyorbackdrop-filter: blur(10px)-webkit-backdrop-filter: blur(10px)
- iOS’ta, daha derin sistem ayarları değiştirilmediği sürece
-webkit-backdrop-filtergerekli backdrop-filteriçin tarayıcı desteği ancak yakın dönemde geldiğinden, Internet Explorer kullanıcıları demoyu deneyimleyemiyor
Kenarlar ve gölgelerle derinlik oluşturmak
- Yalnızca
backdrop-filter: blur(10px)uygulamak, camı düz ve tekdüze gösterebilir - Kenarlar
border: 1px solidyerinebox-shadow: insetile oluşturuluyorborder, öğe boyutunu ve alt öğelerin yerleşimini etkilerbox-shadow: insetkullanıldığında, alt öğeler negatif margin gibi ayarlara gerek kalmadan camın içerik alanını doğal biçimde doldurabilir
- Cam kenarları, yarı saydam beyaz iki inset shadow ile ifade ediliyor
- İlk shadow, dışarıdan görülen cam kenarını temsil ediyor; örnekte alttaki ve soldaki kenarlarda görünüyor
- İkinci shadow, camın içinden görülen kenarı temsil ediyor; örnekte üstteki ve sağdaki kenarlarda görünüyor
- Camın içinden görülen kenarlar, ışık azaldığı için daha yumuşak ve daha saydam ayarlanıyor
- Normal koyu bir
box-shadoweklendiğinde, camın arka plandan fiziksel olarak yükseliyormuş gibi görünmesi sağlanabiliyor
Işık saçılması ve yüzey yansımaları
- Camın içine ışığın yayıldığı hissi,
subsurface scatteringbasitleştirilerek ifade ediliyor - Uygulamada yine
box-shadow: insetkullanılıyor- Kısa saçılma efekti:
inset 0px 0px 10px 5px rgba(255, 255, 255, 0.025) - Daha derin saçılma efekti:
inset 0px 0px 40px 5px rgba(255, 255, 255, 0.025)
- Kısa saçılma efekti:
- Bu efekt, cam koyu bir arka plan üzerine sürüklendiğinde daha belirgin görünüyor
- Arka planın blur olup kırılıyormuş hissine ek olarak, cam yüzeyindeki ışığın yansıma özelliği de ekleniyor
- Işık yansıması, arka plana karıştırılan bir ışık huzmesi görseliyle oluşturuluyor
- Benzer bir görsel üretmek için başvurulabilecek bir YouTube eğitimi ve bir metin anlatımı bulunuyor
- Görsel doğrudan
.glassöğesininbackground-image’ine eklenirsebackdrop-filterbunu da blur’ladığı için,::beforegibi ayrı bir katman kullanılıyor
Statik yansımayı dinamik hale getirmek
- Yalnızca ışık huzmesi görselini eklemek yansımayı oluşturur, ancak cam hareket ettiğinde ışığın cam yüzeyine sabitlenmiş gibi görünmesine yol açabilir
- Saf CSS yaklaşımı,
::beforeüzerinebackground-attachment: fixedekliyor- Uygulaması basit, ancak her platformda çalışmayabilir
- Tüm platformlarda çalışmasını sağlamak için JavaScript ile
background-attachment: fixeddavranışı taklit ediliyor::beforeöğesini JavaScript’ten doğrudan yönetmek verimsiz olduğundan, ayrı birdiv.lightöğesi kullanılıyor- Hedef öğeye
data-js-background-attachment-fixedniteliği ekleniyor
- JavaScript, her animasyon karesinde hedef öğenin
getBoundingClientRect()değerini okuyup, görünüm alanındaki konumun ters yönüne doğrubackground-positiondeğerini güncelliyorbackgroundPositionX = -clientRect.xbackgroundPositionY = -clientRect.y
- Tekrarlayan döngü
requestAnimationFrameile çalıştırılıyor
Nihai HTML/CSS yapısı
- JavaScript sürümünün nihai HTML’i,
.glassiçinde ışık yansıması için.lightve metin/renk katmanı olarak.drag-meiçeren bir yapı
Drag Me
.glass, cam panelin temel biçimini ve görsel efektlerini üstleniyorbackdrop-filterve-webkit-backdrop-filterile arka plan blur’u uygulanıyor- Birden fazla
box-shadowile kenarlar, gölge ve saçılma efektleri veriliyor position: relativesayesinde alt katmanlar ebeveyn alanını doldurabiliyorborder-radius: 5pxile yuvarlatılmış köşeler uygulanıyoroverflow: hiddenile alt öğelerin yuvarlatılmış köşelerin dışına taşması engelleniyor
.light, ışık huzmesi görselini tekrar eden arka plan olarak kullanıyorbackground-image: url(path/to/light.png)background-repeat: repeatbackground-size: 750pxopacity: 0.075position: absoluteve dört yönde0offset ile ebeveynin tamamını kaplıyorz-index: -1ile diğer alt öğelerin arkasında render ediliyor
.drag-me, içeriği ortaya hizalıyor ve renkli yarı saydam cam katmanını oluşturuyordisplay: flexalign-items: centerjustify-content: centerheight: 30pxbackground-color: rgba(12, 13, 14, 0.75)
JavaScript olmayan sürümün farkları
- JavaScript olmayan sürüm, ayrı bir
.lightöğesi yerine.glass::beforekullanıyor ::beforeüzerine ışık huzmesi görseli uygulanıyor vebackground-attachment: fixedile ekrana sabitlenmiş bir yansıma oluşturuluyor- Bu yöntem her platformda çalışmıyor; JavaScript sürümü bunu telafi etmek için
background-positiondeğerini doğrudan güncelliyor
1 yorum
Hacker News yorumları
Estetik olarak gerçekten hoşuma gidiyor, ama kenarlarda fiziksel olarak tam oturmayan bazı noktalar var.
Gömülü geliştirici bakış açısından biraz savurgan geliyor. Her istemci, arka plan görüntüsünün bulanık bir sürümüyle harmanlamak için her seferinde “pahalı” bir blur filtresi hesaplıyor gibi değil mi?
GPU kullanıldığı ve optimize edildiği için sonuçta büyük bir maliyet olmayabilir; ama günümüzde web geliştirme genel olarak fazla şişkinleşen bir akım gibi görünüyor. Basit siteler bile 5 saniye yükleniyor, ağır işlemler istemciye yıkılıyor; tabii bu yazının yazarının suçu değil.
14.4k modem döneminde büyüdüğüm için, ağ bant genişliğinin CPU zamanından çok daha kıt ve pahalı olduğunu düşünmeye alışığım.
İstemcide kolayca hesaplanabiliyorsa, görüntünün tamamını internet üzerinden indirmek bana daha savurgan geliyor. O görüntüyü almak için yönlendiricileri, sunucuları, uzaktaki diskleri çalıştırıyorsunuz; sırf zaten istemci RAM’inde bulunan veriye bir kez işlem yapmaktan kaçınmak için tüm bunları kullanmak daha yazık.
Dolayısıyla ya eğlencenin kendisi savurganlıktır ya da değilse, eğlenceyi daha iyi hale getirmek için biraz daha hesaplama kullanmak da sorun değildir.
UI’da değişen şeyleri yeniden çizmek için zaten GPU hesaplaması gerekir ve basit bir blur oldukça verimli biçimde eklenebilir. GPU katmanı olarak optimize edilmemiş DOM nesnesi animasyonlarından daha düşük maliyetli olması muhtemel.
Günümüzde en basit sitelerin bile 1MB’den fazla JavaScript ve bir sürü izleyici yükleyip CPU tükettiğini düşününce, estetik efekt amaçlı blur savurganlık listesinin epey altlarında kalır.
Yüksek çözünürlüklü görüntü çoksa, gerçek ağ bant genişliği sınırlı olduğundan ve özellikle kablosuz kapsamanın kötü olduğu mobil ortamlarda, bu yöntem yerel hesaplamaya göre kesinlikle daha düşük performans verir. Bugün CSS/WebGL ile yapılabilenler şaşırtıcı; eskiden bu tür efektler için çok hack ve geçici çözüm gerekirdi.
Eylemin kendisinin savurgan olup olmamasından bağımsız olarak, bu düşünme biçiminin kendisi toplumdaki daha büyük bir sorunu gösteriyor. Buna neden ihtiyaç var ve bunun olmadığı durumu neden kötü görüyoruz?
Günümüzde toplumsal sorunların ölçeğini düşününce, UI panelinin bulanık olup olmamasını kim umursar ki?
Android’de yeni shader API’siyle neler yapılabileceğini görmek için Windows 7 Aero Glass efektini yeniden oluşturmaya çalışırken benzer bir “ışık çizgileri” dokusu çıkarmıştım.
Sonuç olarak bu yazıdakine çok benzer oldu; yalnızca iç gölge eklemedim ve bulanık arka planın doygunluğunu biraz artırdım.
https://mastodon.social/@grishka/110524476584503201
Açıkçası eğitim için hazırlanan örnek o kadar da mükemmel değil. Windows 7 tarafındaki daha belirgin çizgileri daha çok seviyorum.
Doygunluk ayarlamasını ben de düşündüm ve başka örneklerde de gördüm, ama yazıda kullanmamaya karar verdim. Kullandığım ay görüntüsünde fazla renk olmadığı için büyük fark yaratmayacaktı. Kendi cam efektini yapanların doygunluğu da denemesi iyi olur.
Yapılan işin kendisi harika, etkileşimli demo olarak sunulma biçimi de iyi. Pencereyi ayın üzerine sürüklemek eğlenceli.
Yine de kullanıcı arayüzü tasarımında buzlu cam efekti kullanılmasını sevmiyorum; Mac OS’ye eklendiğinde bunun bir geri adım olduğunu hissetmiştim. Tasarımcılar bu efekte çok kolay kapılıyor, ama gerçekte asla ideal değil. Özellikle panelin arkasındaki içerik dinamikse ya da kullanıcı tarafından oluşturulmuşsa.
2010’ların brushed metal’i gibi; Windows Vista’dan sızıp her yere yayılmış olması şaşırtıcı.
Elbette tasarım işlevi de etkiler, ama temel amacı kullanıcı deneyimini daha keyifli hale getirmektir.
Skeuomorphism’in, son 10 yılı aşkın süredir süren her şeyi dümdüzleştiren minimalist eğilimden daha keyifli arayüzler ürettiğini düşünüyorum. Gerçek dünyadaki yüzey ve malzemeleri taklit eden görsel süslemeler aşinalık ve erişilebilirlik katar. Pratik açıdan da flat design, öğeleri ve durumları ayırt etmeyi zorlaştırırken; 3D düğmelerin, brushed metal’in ve buzlu camın olduğu dönemde işler çok daha belirgindi.
Bence şimdi sarkaç yeniden geri dönüyor. Daha fazla tasarımcı düz görünümden kaçındığına göre, daha insan dostu UI’ların geri dönmesini umuyorum.
Blur genelde doğru cevap değildir, ama bazen doğru tercihtir.
2008’de CSS
backdrop-blurdesteği sunmadan önce, benzer bir etki üretmeye yönelik bir CSS denemem olmuştu: https://webdev.andersriggelsen.dk/aero/Sabit konumlu, önceden bulanıklaştırılmış bir arka plan görseline cam efekti uygulayan bir yöntemdi: https://webdev.andersriggelsen.dk/aero/bgl.jpg
Gerçek zamanlı Gaussian blur’dan çok daha performanslıydı, ancak dinamik arka plan görsellerine izin vermemesi dezavantajı aynen duruyordu
Dinamik olarak hareket edebilen bir çerçevenin içinde bile cam efekti verebiliyordu. iframe kullanıp kullanmadığımı hatırlamıyorum; kodu bulup bakmam gerekir ama o dönemi düşününce muhtemelen kullanmışımdır
Windows 10 19045.5131 kullanıyorum, Chrome da en güncel Version 131.0.6778.86 (Official Build) (64-bit)
Teknik başarı etkileyici, ama bunun kötü UX olduğunu düşünüyorum
Yarı saydam bir panelin içindeki içerik, tutarlı tek renkli bir arka plan üzerindekine göre daha zor okunuyor ve anlaşılıyor; arka planla kontrastı düşük ve düzensiz. Üstelik altta bir şey hareket ederse dikkat dağıtıcı olabilir ve yön hissini bozabilir
İyi bir entegrasyonda, UI’ı aşırıya kaçırmamak için efektin şiddeti ayarlanmalı; blur desteklenmediğinde ek süslemelerden kaçınmak için özellik desteği kontrol edilmeli; GPU’su yeterli olmayabilecek cihazlarda render etmemek için ekran ve video yetenekleri denetlenmeli
Ayrıca kullanıcı tercihleri kontrol edilerek karmaşık arka planlarda zorlanan kullanıcılara yüksek kontrastlı düz renk sunulmalı; kullanılabilir alana göre efekt ve gölge kapsamı sınırlandırılmalı; bulanık alanın altındaki arka planın karmaşıklığı ve kontrastı dikkate alınarak blur ve opaklık ayarlanmalı
Blur ve gölgelerin tipografiye göre uyarlanabilir biçimde ölçeklendiğinden emin olmak da gerekir. UX, özünde kullanıcının uygulamanın tamamıyla etkileşimini nasıl deneyimlediğinin tasarımıdır; tek bir stil tercihinin tek başına başarıyı ya da başarısızlığı belirlediği bir şey değildir
Arka planın siyah olduğu uç durumlarda bile metin okunabilirliğini garanti ediyordu. CSS’te
text-shadowözelliğiyle yeniden üretilebilirAma oyunlarda daha fazla kullanım alanı var. Özellikle kullanıcının etkileştiği ana alan olan arka planı kapatmak istemediğiniz HUD’larda uygun olabilir
İyi kontrast, düz renk de olsa cam efekti de olsa her tasarım öğesinde bir zorluktur
Arka planda olanların dikkat dağıtıcı ve yön hissini bozucu olması da son derece öznel. Düz bir rengin opaklığını düşürebildiğiniz gibi camın yarı saydamlığını da düşürebilirsiniz
Bu eleştirinin nesnel olarak doğru olduğunu söylemek zor; bu sorunlardan kaçınarak bu tasarım öğesini entegre etmenin yolları var. Forza ekran görüntüsü iyi görünüyor, gerçek kullanımda da arka plan dikkat dağıtmıyordu. Bunun yerine düz renkli arka plandan daha ilginç ve görsel olarak daha keyifli bir UI elde ediyorsunuz. Video oyunlarında daha önemli olabilir, ama işletim sistemi ve web tasarımında da incelikli biçimde kullanılabilir
Çok fazla bağlam gerekiyorsa blur iyi bir seçim değildir; hiç bağlam gerekmiyorsa da iyi bir seçim değildir
Ama bazı durumlarda harika bir seçim olur
Etkileşimli örnekler güzel, ama önceki adımla yan yana karşılaştırma yapmaya ya da geçiş yapmaya yarayan bir toggle olsaydı daha iyi olurdu
Çoğu adımda iyileştirmeler o kadar incelikliydi ki farkı anlamak zordu
Yaklaşık 10 efekt üst üste bindirilmiş; en zorlayıcı estetiği hedeflemiyorsanız yaklaşık 7 tanesi fazla
Arka plan rengi, blur, gölge ya da kenarlık yeterli olur
Üçüncü adıma gelindiğinde bile yalnızca blur ve gölgeyle oldukça iyi bir cam parçası ortaya çıkıyor. Kişisel olarak buna statik bir ışık huzmesi görseli eklemeyi öneririm. Çoğu uygulamada tam JavaScript efektine gerek olacağını sanmıyorum. Eğlenceli ama dikkat dağıtıcı olabilir
Sadece blur, gölge ve ışık huzmesiyle bile en üstteki Forza görseline gerçekten çok yaklaşılabilir
Herkesin flat design’a yönelmesinin nedenlerinden birinin bu olduğunu düşünüyorum. Windows Vista ve cam efekti güzeldi ama hesaplama maliyeti yüksekti
Flat design estetik açıdan tartışmalı ve özellikle yaşlı kullanıcılar için skeuomorphic tasarıma göre kullanımı daha zor olabilir [0][1]
Gerçekçilik kullanılabilirliğe yardımcı olabiliyorsa, bu tür efektleri web’de kullanmak gayet makul bence
[0]: https://www.tandfonline.com/doi/abs/10.1080/0144929X.2020.18...
[1]: https://www.sciencedirect.com/science/article/abs/pii/S01419...
n <= 3olarak gördüğünüzü merak ediyorumErişilebilirlik sorunu mu, performans sorunu mu, bakım kolaylığı sorunu mu, yoksa başka bir neden mi bilmiyorum
Geliştirme becerilerim içinde CSS açık ara en zayıf olanı; bu yüzden iyi uygulamaları ve kötü örnekleri hiç bilmiyorum
Tam bir döngünün tamamlanmış gibi hissettirmesi ilginç
İlk CSS demolarından biri, CSS 1 için hazırlanmış bir demo buzlu cam efektiydi: https://meyerweb.com/eric/css/edge/complexspiral/glassy.html
Açıkçası oldukça etkileyici. CSS’in ne kadar yaratıcı ve güçlü olabildiğini görmek her zaman keyifli.
Ama HTML/CSS’te sanki sonsuza dek anlayamayacağım bir seviye varmış gibi geliyor. Bu demo tam da öyle; bu kişi buzlu cam yapıyor, ben hâlâ tek bir
divi ortalayamıyorum.divdaha eklemenin çoğu zaman iyi bir fikir olduğunu zor yoldan öğrendim.Modern web sitelerinin çoğuna bakınca
divlerin dev bir yığın gibi üst üste dizildiğini görüyorsunuz. Ortalanmış birdivistiyorsanız, içinde ortalayacağınız tüm alanı kaplayan birdivdaha oluşturmak nispeten kolaylaştırıyor.Pek çok görsel numara da buna benziyor, ama bu örnek çok temiz olduğu için daha da etkileyici.
Tam olarak buzlu cam değil ama https://www.gyan.dev/ffmpeg/builds/ sitesinin yan çubuğuna bir cam efekti eklemeyi denedim.