- Berawal dari UI akrilik buram di Forza Horizon 3 dan Forza Motorsport 7, artikel ini merangkum proses mereplikasi efek panel kaca serupa di web dengan HTML/CSS/JavaScript
- Inti efeknya adalah Gaussian blur, dan untuk mengurangi perbedaan antar-browser perlu memakai CSS
backdrop-filterbersama-webkit-backdrop-filteruntuk iOS - Karena blur saja terlihat datar, kedalaman tepi dan subsurface scattering ditambahkan dengan
box-shadow: inset, lalu bayangan biasa dipakai untuk memberi kesan melayang di atas latar - Refleksi permukaan dibuat dengan gambar berkas cahaya pada layer terpisah, lalu meniru pantulan dinamis yang mengikuti perpindahan kaca dengan
background-attachment: fixedatau JavaScript - UI akhir disusun dari layer
.glass,.light, dan.drag-me, lalu dilengkapi sudut membulat, clipping, dan warna latar semi-transparan hingga menjadi komponen kaca yang siap disalin
Efek panel kaca yang dibawa dari UI game
- Tujuannya adalah mereproduksi desain akrilik buram yang dilihat dari pengalaman pengembangan UI Forza Horizon 3 dan Forza Motorsport 7 ke dalam HTML
- Hasil akhirnya adalah panel kaca yang bisa di-drag, lengkap dengan blur latar, kedalaman tepi, pantulan cahaya, sudut membulat, dan layer warna semi-transparan
- Di awal disediakan resep akhir yang bisa langsung disalin pakai, lalu setelah itu tiap efek dibangun bertahap
backdrop-filter untuk membuat blur latar
- Kunci efek frosted glass yang bagus adalah Gaussian blur yang memburamkan latar sehingga terlihat seperti layar semi-transparan
- Di CSS, ini diimplementasikan dengan menerapkan
blurpadabackdrop-filter - Elemen kaca dasar dimulai dari
divsederhana dan kelas.glassbackdrop-filter: blur(10px)-webkit-backdrop-filter: blur(10px)
- Di iOS,
-webkit-backdrop-filtertetap diperlukan kecuali melakukan perubahan pengaturan yang cukup dalam - Karena dukungan browser untuk
backdrop-filterbaru tersedia belakangan ini, pengguna Internet Explorer tidak bisa mencoba demo tersebut
Membuat kedalaman dengan tepi dan bayangan
- Jika hanya menerapkan
backdrop-filter: blur(10px), kaca bisa terlihat datar dan monoton - Tepi dibuat dengan
box-shadow: insetalih-alihborder: 1px solidbordermemengaruhi ukuran elemen dan penempatan elemen anak- Dengan
box-shadow: inset, elemen anak bisa mengisi area konten kaca secara natural tanpa penyesuaian seperti margin negatif
- Dua inset shadow putih semi-transparan dipakai untuk mengekspresikan tepi kaca
- Shadow pertama menunjukkan sudut kaca yang terlihat dari luar, dalam contoh muncul di tepi bawah dan kiri
- Shadow kedua menunjukkan tepi yang terlihat menembus kaca, dalam contoh muncul di tepi atas dan kanan
- Tepi yang terlihat melalui kaca dibuat lebih lembut dan transparan karena cahayanya berkurang
- Dengan menambahkan
box-shadowgelap biasa, kaca bisa terasa melayang secara fisik dari latar
Hamburan cahaya dan refleksi permukaan
- Kesan cahaya yang menyebar di dalam kaca diungkapkan sebagai penyederhanaan dari
subsurface scattering - Implementasinya kembali memakai
box-shadow: inset- Efek hamburan pendek:
inset 0px 0px 10px 5px rgba(255, 255, 255, 0.025) - Efek hamburan lebih dalam:
inset 0px 0px 40px 5px rgba(255, 255, 255, 0.025)
- Efek hamburan pendek:
- Efek ini lebih terlihat saat kaca di-drag di atas latar gelap
- Selain sensasi latar yang blur dan tampak membiaskan, ditambahkan juga sifat cahaya yang terpantul di permukaan kaca
- Pantulan cahaya dibuat dengan mencampurkan gambar berkas cahaya sebagai latar
- Ada tutorial YouTube dan penjelasan teks yang bisa dijadikan referensi saat membuat gambar serupa sendiri
- Jika gambar langsung dimasukkan sebagai
background-imagepada elemen.glass,backdrop-filterakan memburamkannya, jadi perlu layer terpisah seperti::before
Mengubah refleksi statis menjadi dinamis
- Jika hanya menaruh gambar berkas cahaya, refleksi memang muncul, tetapi saat kaca dipindahkan cahaya bisa terlihat menempel tetap di permukaan kaca
- Cara CSS murni adalah menambahkan
background-attachment: fixedke::before- Implementasinya sederhana, tetapi bisa jadi tidak berjalan di semua platform
- Agar bekerja di semua platform,
background-attachment: fixedditiru dengan JavaScript- Karena menangani
::beforelangsung dari JavaScript tidak efisien, dipakai elemendiv.lightterpisah - Pada elemen target ditambahkan atribut
data-js-background-attachment-fixed
- Karena menangani
- Pada setiap frame animasi, JavaScript membaca nilai
getBoundingClientRect()elemen target lalu memperbaruibackground-positionke arah berlawanan dengan posisi di viewportbackgroundPositionX = -clientRect.xbackgroundPositionY = -clientRect.y
- Loop berulang dijalankan dengan
requestAnimationFrame
Struktur HTML/CSS akhir
- HTML akhir versi JavaScript memiliki struktur yang menempatkan
.lightuntuk pantulan cahaya dan.drag-meuntuk layer teks/warna di dalam.glass
Drag Me
.glassbertugas menangani bentuk dasar dan efek visual panel kaca- Menerapkan blur latar dengan
backdrop-filterdan-webkit-backdrop-filter - Menerapkan tepi, bayangan, dan efek hamburan dengan beberapa
box-shadow - Menggunakan
position: relativeagar layer anak bisa mengisi area induk - Menerapkan sudut membulat dengan
border-radius: 5px - Memotong elemen anak agar tidak keluar dari sudut membulat dengan
overflow: hidden
- Menerapkan blur latar dengan
.lightmemakai gambar berkas cahaya sebagai latar berulangbackground-image: url(path/to/light.png)background-repeat: repeatbackground-size: 750pxopacity: 0.075- Mengisi seluruh area induk dengan
position: absolutedan offset empat arah0 - Dirender di belakang elemen anak lain dengan
z-index: -1
.drag-memeratakan konten ke tengah dan membentuk layer kaca semi-transparan berwarnadisplay: flexalign-items: centerjustify-content: centerheight: 30pxbackground-color: rgba(12, 13, 14, 0.75)
Perbedaan versi tanpa JavaScript
- Versi tanpa JavaScript memakai
.glass::beforealih-alih elemen.lightterpisah - Pada
::before, gambar berkas cahaya diterapkan dan refleksi yang terkunci pada layar dibuat denganbackground-attachment: fixed - Cara ini tidak berjalan di semua platform, dan versi JavaScript melengkapinya dengan memperbarui
background-positionsecara langsung
1 komentar
Komentar Hacker News
Secara estetika saya sangat menyukainya, tetapi ada bagian di tepinya yang secara fisik terasa tidak pas.
Dari sudut pandang developer embedded, ini terasa agak boros. Rasanya seperti setiap klien harus menghitung filter blur yang “mahal” setiap kali untuk mencampurkannya dengan versi buram dari gambar latar.
Karena memakai GPU dan sudah dioptimalkan, pada akhirnya biayanya mungkin tidak besar, tetapi pengembangan web sekarang secara umum terlihat makin membengkak. Bahkan situs sederhana pun bisa loading 5 detik, dan pemrosesan berat dilempar ke klien; tentu saja ini bukan salah penulis artikel ini.
Saya tumbuh di era modem 14.4k, jadi terbiasa berpikir bahwa bandwidth jaringan jauh lebih langka dan mahal daripada waktu CPU.
Jika bisa dihitung dengan mudah di klien, menurut saya mengunduh seluruh gambar lewat internet justru lebih boros. Untuk menerima gambar itu, router, server, sampai disk yang jauh harus bekerja; rasanya lebih sayang memakai semua itu hanya demi menghindari satu kali pemrosesan atas data yang sudah ada di RAM klien.
Jadi entah hiburan itu sendiri boros, atau kalau tidak, memakai komputasi tambahan untuk membuat hiburan lebih baik juga menurut saya tidak masalah.
Untuk menggambar ulang hal yang berubah di UI, perhitungan GPU tetap diperlukan, dan blur sederhana bisa ditambahkan dengan cukup efisien. Biayanya kemungkinan lebih rendah daripada animasi objek DOM yang tidak dioptimalkan sebagai layer GPU.
Melihat situs paling sederhana masa kini pun memuat JavaScript lebih dari 1 MB dan banyak tracker yang memakan CPU, blur untuk efek estetis menurut saya berada jauh di bawah dalam daftar pemborosan.
Jika ada banyak gambar resolusi tinggi, bandwidth jaringan nyata itu terbatas, dan terutama di lingkungan mobile dengan cakupan nirkabel yang buruk, performanya jelas lebih buruk daripada komputasi lokal. Sekarang mengagumkan bahwa hal seperti ini bisa dilakukan hanya dengan CSS/WebGL; dulu efek seperti ini membutuhkan banyak hack dan jalan memutar.
Terlepas dari apakah tindakannya sendiri boros atau tidak, pola pikir seperti ini menunjukkan masalah yang lebih besar dalam masyarakat. Mengapa ini dibutuhkan, dan mengapa ketiadaannya dianggap buruk?
Mengingat skala masalah sosial saat ini, siapa yang peduli apakah panel UI diblur atau tidak?
Saat mencoba melihat apa yang bisa dilakukan dengan API shader baru di Android, saya pernah mereproduksi efek Windows 7 Aero Glass dan mengekstrak tekstur “garis cahaya” yang mirip.
Hasilnya sangat mirip dengan artikel ini, hanya saja saya tidak menambahkan bayangan dalam, dan saturasi latar buramnya sedikit saya naikkan.
https://mastodon.social/@grishka/110524476584503201
Sejujurnya, yang dibuat untuk tutorial tidak terlalu bagus. Saya lebih suka garis yang lebih jelas di versi Windows 7.
Saya juga memikirkan penyesuaian saturasi dan melihatnya di contoh lain, tetapi memutuskan untuk tidak memakainya di artikel. Gambar bulan yang digunakan tidak punya banyak warna, jadi mungkin tidak akan membuat perbedaan besar. Orang yang membuat efek kaca sendiri sebaiknya juga bereksperimen dengan saturasi.
Pekerjaannya sendiri luar biasa, dan cara menampilkannya sebagai demo interaktif juga bagus. Menyenangkan menyeret jendela ke atas bulan.
Namun saya tidak suka penggunaan efek kaca buram dalam desain antarmuka pengguna, dan ketika ditambahkan ke Mac OS saya merasa itu sebuah kemunduran. Desainer terlalu mudah terpikat oleh efek ini, tetapi dalam praktiknya ini sama sekali tidak ideal. Terutama ketika konten di balik panel bersifat dinamis atau dibuat oleh pengguna.
Ini seperti brushed metal era 2010-an, dan mengejutkan bahwa ia bocor dari Windows Vista lalu menyebar ke mana-mana.
Tentu saja desain juga memengaruhi fungsi, tetapi tujuan utamanya adalah membuat pengalaman pengguna lebih menyenangkan.
Menurut saya skeuomorphism membuat antarmuka lebih menyenangkan daripada tren minimalis yang meratakan semuanya selama lebih dari satu dekade terakhir. Ornamen visual yang meniru permukaan dan material dunia nyata menambahkan rasa akrab dan aksesibilitas. Secara praktis pun, flat design membuat elemen dan status lebih sulit dibedakan, sedangkan pada masa tombol 3D, brushed metal, dan kaca buram, semuanya jauh lebih jelas.
Saya rasa bandul kini sedang bergerak kembali. Semakin banyak desainer menghindari tampilan datar, jadi saya berharap UI yang lebih ramah manusia akan bangkit kembali.
Blur biasanya bukan jawaban yang tepat, tetapi sesekali memang pilihan yang benar.
Pada 2008, sebelum CSS mendukung
backdrop-blur, pernah ada eksperimen CSS untuk membuat efek serupa: https://webdev.andersriggelsen.dk/aero/Caranya adalah menerapkan efek kaca pada gambar latar yang posisinya tetap dan sudah diburamkan sebelumnya: https://webdev.andersriggelsen.dk/aero/bgl.jpg
Performanya jauh lebih baik daripada Gaussian blur real-time, tetapi kelemahannya tetap sama: tidak bisa mengizinkan gambar latar dinamis
Efek kaca bisa dibuat bahkan di dalam frame yang bergerak dinamis. Saya tidak ingat apakah memakai iframe, jadi harus mencari kodenya, tetapi mengingat zamannya, kemungkinan besar memang memakainya
Saya memakai Windows 10 19045.5131, dan Chrome versi terbaru Version 131.0.6778.86 (Official Build) (64-bit)
Pencapaian teknisnya keren, tetapi menurut saya ini UX yang buruk
Konten di dalam panel transparan lebih sulit dibaca atau dipahami dibandingkan di atas latar warna solid yang konsisten, dengan kontras terhadap latar yang rendah dan tidak merata. Selain itu, jika ada sesuatu bergerak di bawahnya, itu bisa mengganggu dan membuat orientasi terasa membingungkan
Integrasi yang baik harus mengatur intensitas efek agar UI tidak berlebihan, memeriksa dukungan fitur agar tidak menambahkan dekorasi ekstra saat blur tidak didukung, serta memeriksa kemampuan display dan video agar tidak merendernya di perangkat yang kemungkinan GPU-nya tidak memadai
Selain itu, perlu memeriksa preferensi pengguna untuk menyediakan warna solid berkontras tinggi bagi pengguna yang kesulitan dengan latar kompleks, membatasi jangkauan efek dan bayangan sesuai ruang yang tersedia, serta menyesuaikan blur dan opasitas dengan mempertimbangkan kompleksitas dan kontras latar di bawah area buram
Perlu juga memastikan blur dan bayangan diskalakan secara adaptif sesuai tipografi. UX pada dasarnya adalah desain tentang bagaimana pengguna mengalami interaksi dengan keseluruhan aplikasi, bukan sesuatu yang berhasil atau gagal hanya karena satu pilihan gaya individual
Ini menjamin keterbacaan teks bahkan dalam kasus ekstrem ketika latarnya hitam. Di CSS, ini bisa direproduksi dengan properti
text-shadowNamun di game, ada lebih banyak tempat untuk memakainya. Terutama pada HUD, saat Anda tidak ingin menutupi latar yang merupakan area utama tempat pengguna berinteraksi
Kontras yang baik adalah tantangan pada elemen desain apa pun, baik warna solid maupun efek kaca
Bahwa hal yang terjadi di latar mengganggu dan membuat orientasi membingungkan juga sangat subjektif. Seperti menurunkan opasitas warna solid, transparansi kaca juga bisa diturunkan
Kritik ini sulit dianggap benar secara objektif, dan ada cara untuk mengintegrasikan elemen desain ini sambil menghindari masalah tersebut. Screenshot Forza terlihat baik-baik saja, dan saat dilihat langsung pun latarnya tidak mengganggu. Sebagai gantinya, UI menjadi lebih menarik dan menyenangkan secara visual dibandingkan latar solid. Ini mungkin lebih penting di video game, tetapi juga bisa dipakai dengan elegan dalam desain OS dan web
Jika membutuhkan banyak konteks, blur bukan pilihan yang baik; jika sama sekali tidak membutuhkan konteks, blur juga bukan pilihan yang baik
Namun pada situasi tertentu, ini menjadi pilihan yang sangat bagus
Contoh interaktifnya bagus, tetapi akan lebih baik jika ada toggle untuk membandingkan berdampingan dengan tahap sebelumnya atau beralih di antaranya
Pada sebagian besar tahap, peningkatannya terlalu halus sehingga sulit melihat perbedaannya
Ada sekitar 10 efek yang ditumpuk, dan kecuali memang mengejar estetika yang paling rumit, sekitar 7 di antaranya berlebihan
Cukup gunakan warna latar, blur, dan mungkin bayangan atau border
Bahkan pada tahap ketiga saja, hanya dengan blur dan bayangan sudah menghasilkan potongan kaca yang cukup bagus. Secara pribadi, saya menyarankan menambahkan gambar berkas cahaya statis ke sana. Saya rasa sebagian besar aplikasi tidak membutuhkan efek JavaScript penuh. Itu memang menyenangkan, tetapi bisa mengganggu
Dengan blur, bayangan, dan berkas cahaya saja, hasilnya bisa sangat mendekati gambar Forza di bagian atas
Menurut saya, itu salah satu alasan semua orang beralih ke flat design. Windows Vista dan efek kaca memang keren, tetapi biaya komputasinya besar
Flat design secara estetika bisa diperdebatkan, dan khususnya bagi pengguna yang lebih tua, bisa lebih sulit dipakai daripada desain skeuomorfik [0][1]
Jika kesan realistis bisa membantu kegunaan, menurut saya memakai efek seperti ini di web sangat masuk akal
[0]: https://www.tandfonline.com/doi/abs/10.1080/0144929X.2020.18...
[1]: https://www.sciencedirect.com/science/article/abs/pii/S01419...
n <= 3Entah apakah alasannya aksesibilitas, performa, pemeliharaan, atau alasan lain
Di antara kemampuan pengembangan saya, CSS adalah yang paling lemah sejauh ini, jadi saya sama sekali belum tahu praktik baik dan buruknya
Menarik karena rasanya seperti kembali penuh satu putaran
Salah satu demo CSS awal, demo untuk CSS 1, adalah efek kaca buram: https://meyerweb.com/eric/css/edge/complexspiral/glassy.html
Sejujurnya cukup mengesankan. Selalu menyenangkan melihat betapa kreatif dan kuatnya CSS bisa digunakan
Namun rasanya ada tingkatan tertentu dalam HTML/CSS yang selamanya tidak akan saya pahami. Demo ini persis seperti itu; orang ini sedang membuat jendela buram seperti berembun, sementara saya masih belum bisa menengahkan satu
divdivlagi sering kali merupakan ide bagusKalau melihat sebagian besar situs web modern,
divbertumpuk seperti gundukan besar. Jika ingindivyang berada di tengah, relatif mudah kalau membuat satudivlagi di dalamnya yang memenuhi seluruh ruang yang akan dipusatkanBanyak trik visual juga mirip seperti itu, tetapi contoh ini sangat rapi sehingga makin mengesankan
Tidak persis seperti kaca buram, tetapi saya mencoba menambahkan efek kaca jendela pada sidebar di https://www.gyan.dev/ffmpeg/builds/