SVG ile Yapılan Harika Şeyler
(fuma-nama.vercel.app)- SVG, basit bir ikon formatının ötesinde mask,
pathve CSS animasyonlarını birleştirerek çizgi boyunca akan wire efektleri ve TOC vurguları oluşturabilir - Temel uygulama,
lineveyapathile oluşturulan çizgiyi doğrudan göstermek yerine, animasyon bloğunun görüntülenme alanını sınırlayan bir maske alanı olarak kullanma yöntemidir - Animated Wires,
rectüzerinemask="url(#...)"uygular ve@keyframesiletranslateYhareket ettirir;linearGradientve CSS değişkenleriyle görsel stili genişletir - Fumadocs’un Clerk tarzı TOC’si, SSR uyumluluğu nedeniyle dış çizgiyi sunucuda render eder; aktif konumu gösteren thumb ise tarayıcı konum bilgileri kullanılarak istemcide render edilir
- SVG
<path>öğesinindniteliği otomatik üretilmiş bir string değil, bir komut listesidir; bu yüzden sunucuda render edilmiş TOC dış çizgisiyle aynı biçimde bir maske görüntüsü istemcide yeniden oluşturulabilir
SVG Maskeleriyle Oluşturulan Animated Wires
- Örnek kod, düz HTML değil JSX veya React söz dizimini temel alır
- Temel çizgi SVG’nin
lineveyapathöğesiyle oluşturulabilir- Örnekte,
viewBox="0 0 50 50"içine dikey birlineyerleştirilir
- Örnekte,
- Çizgiyi ekrana doğrudan çizmek yerine, başka bir şeklin görüneceği alanı sınırlamak için
maskolarak kullanılırrectüzerinemask="url(#line)"uygulanır vemaskiçinde beyaz birlinebulunur
- Hareket,
rectüzerine CSSanimationuygulanarak oluşturulur@keyframes to-down,translateY(-10px)konumundantranslateY(50px)konumuna hareket eder
- Görsel stil; arka plan çizgisi, daha kalın maske çizgisi,
linearGradientve CSS değişkeni--heightbirleştirilerek genişletilir@keyframes to-down-2,calc(var(--height) * -1)değerinden100%değerine kadar hareket eder
- Benzer efektlerin çoğu, animasyon bloğunu maskeyle kırpma yöntemini kullanır
- Bazı tasarımlar Figma veya başka SVG düzenleyicilerinde oluşturulabilir
- Unkey landing page’i bu yöntemin bir örneğidir
Fumadocs’un Clerk Tarzı TOC’si
- Fumadocs içinde Clerk tarzı bir içindekiler tablosu (TOC) uygulanmıştır
- SSR ile uyumlu olması için TOC dış çizgisinin, istemci JavaScript’i olmadan sunucuda render edilmesi gerekir
- Sunucu, öğelerin kesin konumunu bilemez
- Uygulama
absolutekonumlandırma kullanır; dış çizgiyi birden çok bileşen gibi render edip ardından bunları birleştiren bir yöntem izler
- Aktif öğeye veya viewport içinde görünen heading’e karşılık gelen dış çizginin bir kısmı thumb olarak gösterilir
- Thumb’ın animasyonlu olması gerektiğinden, yalnızca dış çizgi bileşeninin rengini değiştirmek yeterli değildir
- Etkileşim hedefi olan thumb istemcide render edilir
- Tarayıcıdan alınan konum bilgilerine dayanarak istemcide bir maske haritası oluşturulur
- Bu maske haritasını oluşturmak için SVG kullanılır
- SVG
<path>öğesinindniteliği bir komut listesidir ve noktaları birleştiren çizgileri render edebilir - İlgili belgeler MDN Web Docs’un SVG Paths sayfasında bulunabilir
- Bu şekilde oluşturulan SVG, sunucuda önceden render edilmiş özgün TOC dış çizgisiyle aynı biçime sahip olur
- Animated Wires’ta olduğu gibi, CSS
mask-imageiçine SVG bir veri URL’si olarak yerleştirilir ve animasyonludivbloğu maskelenerek vurgulanan thumb render edilir- İçteki
div,width: 1,height: thumb.height,transform: translateY(${thumb.top}px),transition: "all 500ms",backgroundColor: "white"gibi değerler kullanır
- İçteki
- React.js uygulaması toc-clerk.tsx kaynak kodunda görülebilir
2 yorum
Havalı görünüyor ama mevcut öğelerden sadece birini net bir şekilde vurgulamak göze daha çok çarpıyor.
Hacker News yorumları
8 yıl önceki bir materyal olsa da Sarah Drasner’ın ünlü “SVG Can Do That?” sunumu hâlâ birçok kişinin gözünü açıyor
O zamandan bu yana CSS inanılmaz olgunlaştı; SVG’nin kendisi için aynı ölçüde mi emin değilim ama her hâlükârda şiddetle tavsiye ederim
Slaytlar: https://slides.com/sdrasner/svg-can-do-that
Video: https://youtu.be/ADXX4fmWHbo?si=6YPZkopyEDc8PSte
SVG dosyalarıyla yapılabilecek eğlenceli şeylerden biri, inline DTD içindeki entity’leri kullanarak dosyanın çeşitli yerlerinde paylaşılacak sabitler tanımlamak
Bunun harika bir örneğini David Ellsworth’ün “Squares in Squares” sayfasındaki SVG’de görebilirsiniz
Başlıca tarayıcılarda sorun yok, ancak Inkscape gibi bazı araçlar DTD’yi parse etmiyor, entity’leri de açmıyor
[0] https://kingbird.myphotos.cc/packing/squares_in_squares.html
&refgibi entity referanslarıyla rastgele sözdizimsel içeriği tanımlayıp yeniden kullanmaya yarayan SGML/XML mekanizmasının adıSVG’de şekilleri, path’leri vb.
defsaltına koyup biridvererek ana SVG içinde tekrar kullanma yöntemi var; bağlantı verilen sayfa da her SVG’nin içinde bu yöntemi kullanıyor gibi görünüyorKarelerin birden fazla çizim arasında paylaşılması söz konusu değil; çünkü her biri ayrı bir DOM olarak içeri giriyor
SVG’nin ilk tasarımcılarının neden entity mekanizmasını geçici olarak yeniden uygulamaları gerektiğini düşündüğünü merak ediyorum
Bu, kullanım noktasında render özelliklerinin override edilebilmesiyle ilgili olabilir; ayrıca o dönemde SVG, W3C’nin XHTML/XML’e geçiş akışı içindeydi, dolayısıyla tarayıcıların entity tanımlarını ya da belge prologue/DOCTYPE’unu yok sayacağı varsayımı da yerleşmiş olmayabilir
!doctypeya da!elementbulamadımSadece SVG’nin
defsveuseözelliklerinden bahsediliyorsa bu DTD değilhttps://developer.mozilla.org/en-US/docs/Web/SVG/Reference/E...
Örneğin Billion laughs attack var
https://en.wikipedia.org/wiki/Billion_laughs_attack
Nanda Syahrasyad’ın “A Deep Dive Into SVG Path Commands” yazısı, SVG path’lerinin nasıl oluşturulduğunu anlamak için gerçekten çok iyi
Neredeyse 2 yıllık bir yazı ama SVG’nin neler yapabildiği ve bunu tam olarak nasıl yaptığı konusunda gözümü açtı
[0] https://www.nan.fyi/svg-paths
SVG ile böyle eğlenceli işler yapan bir projede çalışmıştım
React ile yapılmıştı; birkaç statik illüstrasyona animasyon öğeleri eklenmişti ve renkler CMS üzerinden kontrol ediliyordu
Frontend, API’yi çağırıp doğru renklerin yer aldığı SVG görselini alıyor, animasyon da SVG öğelerini gizleyip göstererek yapılıyordu
Bir örneği burada görebilirsiniz: https://web.archive.org/web/20221020133516im_/https://uncrow...
Macromedia Flash’ı gerçekten özlüyorum
Flash ve SWF formatı gibi, ayrı indirme gerektirmeden yalnızca Flash Player ile sayısız indie oyun ve animasyon film deneyimlemeyi sağlayan bir teknoloji yoktu
Giriş bariyeri de çok düşüktü
SVG’nin de SWF’nin yaptığı her şeyi yapma potansiyeli var, ancak Flash benzeri bir editörü ya da ActionScript gibi sahne/nesne tabanlı bir kodlama yaklaşımı yok
Tarayıcılar arasında garip farklılıklar da var; yalnızca basit SVG’lerin her yerde düzgün görüneceği garanti edilebiliyor
Zaten SVG ile Flash’ı karşılaştırmak elma ile portakalı karşılaştırmak gibi görünüyor
SVG formatının Flash’ın yaptığı her şeyi doğrudan yapması gerekmiyor; tarayıcı içindeki diğer teknolojilere dayanabilir
Örneğin Unity, Unreal ve Godot tarayıcı için oldukça kolay derlenebiliyor
Sorun, bu uygulamaların epey şişkin olması ve genellikle tek haneli MB’lar yerine onlarca MB aralığına çıkmaya yatkın olması
Karmaşık animasyonlu SVG’lerle uğraşmak eğlenceli ama SMIL’in derinlerine girince Safari’nin kayan noktalı sayının başındaki tek bir 0 eksik diye telefonu kilitlemesi ya da türlü tuhaf şeyler yaşanabiliyor
JavaScript ile dinamik ve yaratıcı şekilde SVG üretiyorsanız ve iş arıyorsanız DM atabilirsiniz
SVG’de çizginin yoğunluğuna izin veren bir uzantı var mı merak ediyorum
Kalemi kaldırıp indirebilen bir plotter’ım var ve SVG dosyalarıyla çalışıyor
El yazısında sıkça yapıldığı gibi çizgi çizerken kalemi indirebilmek güzel olurdu
Bu arada Evil Mad Scientist Labs’in Axidraw’ı; harika bir cihaz ve yapan insanlar da çok iyi
Örneğin çok amaçlı bir lazer kesici/plotter kullanıyorum; opaklığı lazer gücü, çizgi kalınlığını hareket hızı, yeşil kanalı tekrar sayısı, mavi kanalı Z ekseni yüksekliği, kırmızı kanalı ise kalemi indirme ya da lazeri kapatma vb. için kullanıyorum
Bu tür işleri burada yapıyorum
https://github.com/WillAdams/gcodepreview
Kendi ikonlarımı veya logolarımı yapmayı denemeden önce SVG’de transform bulunmasını hep garip bulurdum
Eğrileri düzgün hizalamak zor
İkinci logoyu bitirdiğimde fazla düz göründüğünü fark ettim ve 10° eğmek istedim; tüm o çizgileri ve eğrileri yeniden yazmayı düşününce döndürme çok daha iyi bir seçenek gibi göründü
Neyse ki metnin yanına koyunca tuhaf durdu; bu yüzden kerning doğru görünsün diye açıyı birkaç kez daha değiştirdim
Yakın zamanda eğlence için küçük bir oyun yaptım; render için çoğunlukla CSS animasyonlu SVG tile’ları kullandım: https://pipeline-panic.vercel.app/
https://boardgamegeek.com/boardgame/333/waterworks