Hal-Hal Keren yang Bisa Dibuat dengan SVG
(fuma-nama.vercel.app)- SVG bukan sekadar format ikon sederhana; dengan menggabungkan mask,
path, dan animasi CSS, kita bisa membuat efek wire yang mengalir mengikuti garis serta highlight TOC - Implementasi intinya bukan menampilkan garis yang dibuat dengan
lineataupathsecara langsung, melainkan memakainya sebagai area mask untuk membatasi area tampil blok animasi - Animated Wires menerapkan
mask="url(#...)"padarectdan menggerakkantranslateYdengan@keyframes, lalu memperluas gaya visual denganlinearGradientdan variabel CSS - TOC bergaya Clerk di Fumadocs, karena kompatibilitas SSR, merender outline di server dan merender thumb yang menunjukkan posisi aktif di klien dengan memanfaatkan informasi posisi dari browser
- Atribut
dpada SVG<path>bukan string yang dibuat otomatis, melainkan daftar perintah, sehingga gambar mask dengan bentuk yang sama seperti outline TOC yang dirender di server dapat direkonstruksi di klien
Animated Wires dengan SVG Mask
- Kode contoh didasarkan pada sintaks JSX atau React, bukan HTML biasa
- Garis dasar dapat dibuat dengan
lineataupathpada SVG- Dalam contoh, sebuah
linevertikal ditempatkan di dalamviewBox="0 0 50 50"
- Dalam contoh, sebuah
- Alih-alih menggambar garis langsung ke layar, garis tersebut digunakan sebagai
maskuntuk membatasi area yang terlihat dari bentuk lainrectdiberimask="url(#line)", dan di dalammaskdiletakkanlineberwarna putih
- Gerakan dibuat dengan menerapkan CSS
animationpadarect@keyframes to-downbergerak daritranslateY(-10px)ketranslateY(50px)
- Gaya visual diperluas dengan menggabungkan garis latar, garis mask yang lebih tebal,
linearGradient, dan variabel CSS--height@keyframes to-down-2bergerak daricalc(var(--height) * -1)ke100%
- Sebagian besar efek serupa menggunakan pendekatan memotong blok animasi dengan mask
- Beberapa desain bisa dibuat di Figma atau editor SVG lainnya
- Landing page Unkey adalah contoh pendekatan ini
TOC Bergaya Clerk di Fumadocs
- Fumadocs memiliki daftar isi (TOC) bergaya Clerk
- Agar kompatibel dengan SSR, outline TOC harus dirender di server tanpa JavaScript klien
- Di server, posisi elemen yang presisi tidak dapat diketahui
- Implementasinya memakai posisi
absolute, lalu merender outline seperti beberapa komponen terpisah dan menyambungkannya
- Bagian outline yang sesuai dengan item aktif atau heading yang terlihat di viewport ditampilkan sebagai thumb
- Karena thumb harus dianimasikan, mengganti warna komponen outline saja tidak cukup
- Thumb sebagai elemen interaktif dirender di klien
- Berdasarkan informasi posisi yang diperoleh dari browser, peta mask disusun di klien
- SVG digunakan untuk membuat peta mask ini
- Atribut
dpada SVG<path>adalah daftar perintah, dan dapat merender garis yang menghubungkan titik-titik - Dokumentasi terkait dapat dilihat di MDN Web Docs tentang SVG Paths
- SVG yang dibuat dengan cara ini memiliki bentuk yang sama dengan outline TOC asli yang sudah dirender lebih dulu di server
- Sama seperti Animated Wires, SVG dimasukkan ke CSS
mask-imagesebagai data URL, lalu dipakai untuk me-mask blokdivyang dianimasikan agar menghasilkan thumb yang di-highlightdivdi dalamnya menggunakan nilai sepertiwidth: 1,height: thumb.height,transform: translateY(${thumb.top}px),transition: "all 500ms", danbackgroundColor: "white"
- Implementasi React.js dapat dilihat di kode sumber toc-clerk.tsx
2 komentar
Memang keren, tapi rasanya lebih mudah terlihat kalau cukup menonjolkan satu item saat ini dengan jelas.
Komentar Hacker News
Meski ini materi dari 8 tahun lalu, presentasi terkenal Sarah Drasner, “SVG Can Do That?”, masih membuka wawasan banyak orang
Sejak saat itu CSS sudah berkembang sangat matang, dan saya kurang yakin apakah SVG sendiri berkembang sejauh itu, tetapi tetap sangat direkomendasikan
Slide: https://slides.com/sdrasner/svg-can-do-that
Video: https://youtu.be/ADXX4fmWHbo?si=6YPZkopyEDc8PSte
Salah satu hal menarik yang bisa dilakukan dengan file SVG adalah memakai entity DTD inline untuk mendefinisikan konstanta bersama yang bisa dipakai di banyak bagian file
Ada contoh yang sangat bagus di SVG pada halaman “Squares in Squares” milik David Ellsworth
Di browser utama tidak ada masalah, tetapi beberapa alat seperti Inkscape bahkan tidak mem-parsing DTD maupun mengekspansi entity
[0] https://kingbird.myphotos.cc/packing/squares_in_squares.html
&refDalam SVG, caranya adalah menaruh shape, path, dan sebagainya di bawah
defs, memberiid, lalu memakainya kembali di SVG utama, dan halaman yang ditautkan itu tampaknya juga memakai cara tersebut di tiap SVGItu bukan berbagi kotak di antara beberapa gambar, karena masing-masing masuk sebagai DOM terpisah
Saya penasaran mengapa para perancang awal SVG merasa perlu mengimplementasikan ulang mekanisme entity secara ad hoc
Mungkin ada hubungannya dengan kemampuan menimpa properti rendering di titik penggunaan, dan saat itu SVG berada dalam arus transisi XHTML/XML di W3C, jadi kemungkinan asumsi bahwa browser akan mengabaikan definisi entity atau prolog dokumen/DOCTYPE juga belum mapan
!doctypeatau!elementyang menunjukkan DTD di halaman ituJika yang dimaksud hanya
defsdanusedi SVG, itu bukan DTDhttps://developer.mozilla.org/en-US/docs/Web/SVG/Reference/E...
Salah satu contohnya adalah Billion laughs attack
https://en.wikipedia.org/wiki/Billion_laughs_attack
“A Deep Dive Into SVG Path Commands” karya Nanda Syahrasyad sangat bagus untuk memahami bagaimana path SVG disusun
Meski tulisan itu sudah hampir 2 tahun lalu, itu benar-benar membuka mata saya soal apa yang bisa dilakukan SVG dan bagaimana tepatnya cara kerjanya
[0] https://www.nan.fyi/svg-paths
Saya pernah mengerjakan proyek yang melakukan hal menarik seperti ini dengan SVG
Dibuat dengan React, menambahkan elemen animasi ke beberapa ilustrasi statis, dan warna dikendalikan dari CMS
Frontend memanggil API untuk menerima gambar SVG dengan warna yang benar, dan animasinya ditangani dengan cara menyembunyikan dan menampilkan elemen SVG
Contohnya bisa dilihat di sini: https://web.archive.org/web/20221020133516im_/https://uncrow...
Saya sangat merindukan Macromedia Flash
Tidak ada teknologi lain seperti Flash dan format SWF yang memungkinkan orang menikmati begitu banyak game indie dan film animasi hanya dengan Flash Player, tanpa unduhan terpisah
Hambatan masuknya juga sangat rendah
SVG memang punya potensi untuk melakukan semua yang dulu dilakukan SWF, tetapi tidak punya editor seperti Flash atau pendekatan pemrograman berbasis scene/object seperti ActionScript
Ada juga keanehan antar-browser, jadi hanya SVG yang sederhana saja yang bisa dijamin tampil benar di mana-mana
Sejak awal, membandingkan SVG dengan Flash terasa seperti membandingkan apel dan jeruk
Format SVG sendiri tidak harus langsung melakukan semua yang dulu dilakukan Flash, karena bisa bergantung pada teknologi lain di dalam browser
Misalnya Unity, Unreal, dan Godot bisa dikompilasi untuk browser dengan cukup mudah
Masalahnya, aplikasi seperti ini cenderung membengkak dan biasanya bukan berukuran satu digit MB, melainkan puluhan MB
SVG animasi yang kompleks memang menyenangkan untuk dimainkan, tetapi kalau sudah masuk terlalu dalam ke SMIL, Safari bisa membuat ponsel macet hanya karena satu angka 0 di depan bilangan pecahan hilang, dan berbagai hal aneh lainnya bisa terjadi
Jika Anda membuat hal-hal SVG dinamis yang kreatif dengan JavaScript dan sedang mencari pekerjaan, silakan kirim DM
Saya penasaran apakah ada ekstensi SVG yang memungkinkan intensitas garis
Saya punya plotter yang bisa menaikkan dan menurunkan pena, dan dijalankan dengan file SVG
Akan bagus jika pena bisa diturunkan saat garis sedang digambar, seperti yang sering dilakukan dalam tulisan tangan
Sebagai referensi, ini adalah Axidraw dari Evil Mad Scientist Labs, perangkat yang luar biasa dan para pembuatnya juga keren
Misalnya saya memakai laser cutter/plotter serbaguna, dan opacity dipakai untuk daya laser, ketebalan garis untuk kecepatan gerak, kanal hijau untuk jumlah pengulangan, kanal biru untuk tinggi sumbu Z, dan kanal merah untuk menurunkan pena atau mematikan laser
Saya telah mengerjakan pekerjaan semacam ini di sini
https://github.com/WillAdams/gcodepreview
Sampai saya mencoba membuat ikon atau logo sendiri, saya selalu merasa aneh melihat SVG yang memiliki transform
Sulit sekali menyesuaikan kurva dengan benar
Setelah menyelesaikan logo kedua, tampilannya terasa terlalu datar sehingga saya ingin memiringkannya 10°, dan ketika membayangkan harus menulis ulang semua garis dan kurva itu, rotasi terasa jauh lebih masuk akal
Untungnya, saat diletakkan di samping teks hasilnya terlihat aneh, jadi saya akhirnya mengubah sudutnya beberapa kali lagi sampai kerning-nya terlihat pas
Belakangan ini saya membuat game kecil untuk bersenang-senang, dan untuk rendering saya sebagian besar memakai tile SVG dengan animasi CSS: https://pipeline-panic.vercel.app/
https://boardgamegeek.com/boardgame/333/waterworks