murattunalı.
Okuma

CSS kaydırma zaman çizgisi mi ScrollTrigger mı.

İkisi de kaydırmayı animasyona çevirir; fark hızda değil, işin nerede koştuğunda: biri tarayıcının zaman çizgisi, öteki ana iş parçacığında bir kütüphane.

Soru «hangisi daha hızlı» gibi görünür, ama karar başka bir yerde veriliyor: sahnenin ilerlemesini kim hesaplıyor ve o hesap nerede koşuyor? Kaydırma zaman çizgisinde ilerlemeyi tarayıcı hesaplar; kütüphanede ilerlemeyi JavaScript hesaplar ve her karede DOM’a yazar. Geri kalan farkların çoğu bu tek farkın sonucudur.

Platform tarafı: animasyon bir zaman çizgisine bağlanır

CSS tarafında bir animasyon, zamana değil kaydırmaya bağlanabilir: `animation-timeline` çizgiyi seçer (kaydırma kutusunun kendisi ya da bir elemanın görünürlüğü), `animation-range` de o çizginin hangi bölümünün kullanılacağını söyler. Aralık dili anahtar sözcüklerle yazıldığı için ölçü kodda değil tarayıcıda hesaplanır; pencere boyu değiştiğinde yeniden hesap istemez.

Bedeli var: aralık sözlüğü küçük ama keskin. «Üst kenar üstte, alt kenar üstte» gibi bir aralık için beklenen anahtar sözcük değil onun geçiş türevi gerekir; ekrandan uzun bir bölümde yanlış seçim, aralığı yüzlerce piksel kaydırır. Ayrıca varsayılan kenar boşluğu kaydırma dolgusunu hesaba katar, yani atlama bağı için bırakılan boşluk çizgiyi başlatma noktasından kaydırabilir.

Kütüphane tarafı: her değer senin elinde

Kütüphane, kaydırmayı bir zaman çizelgesine çeviren ve her karede geri çağrı veren bir katmandır. Bunun bedeli baytla ve ana iş parçacığı işiyle ölçülür; kazancı ise denetimdir. İlerlemeyi okuyup bir tuvale çizmek, bir sayaç metnini güncellemek ya da erişilebilirlik durumunu duyurmak istiyorsan değeri zaten JavaScript’te istersin. Yerleşimi tutan sahnelerde de kütüphanenin sarmalayıcısı, sayfanın ritmini bozmadan yer açmanın hazır bir yoludur — ama o sarmalayıcı ağacı değiştirdiği için seçicilerin eşleşmesini de değiştirebilir.

İkisi birbirinin yerine geçmez, işi bölüşür

Pratikte sınır şurada: CSS’in kendi başına yapabildiği şey görsel bir dönüşümse (öteleme, ölçek, opaklık, bulanıklık, renk) ve geri kaydırıldığında tersine dönmesi doğruysa, zaman çizgisi yeter. Değer metne, tuvale ya da erişilebilirlik ağacına yazılacaksa JavaScript kaçınılmazdır; bu durumda çizgi yine CSS’te kalabilir ve JavaScript ilerlemeyi çizginin kendisinden okur. Bu sitede kullanılan köprü tam olarak budur: sahnenin ilerlemesi CSS animasyonundan okunur, yazan taraf JavaScript’tir.

Mobil ve hareket tercihi

İki yaklaşımın da hareket azaltma tercihine saygı göstermesi gerekir, ama kapıyı farklı yerlere koyarsın: CSS tarafında kural bir medya sorgusunun içine alınır, kütüphane tarafında kurulum hiç yapılmaz. Bir başka fark iki yönlülüktür — kaydırma çizgisi iki yönlü çalışır ve geri kaydırıldığında sahne geri sarılır. Bir kere olması gereken jestler (yazma, açılma, sayma) bu yüzden zaman çizgisine değil, bir kereye mahsus tetikleyiciye bağlanır.

Karşılaştırmanın kısa cevabı şu: platform tarafı bugün sahnelerin çoğunu tek başına taşıyor ve bedeli sıfır bayt; kütüphane ise hâlâ en kısa yol olduğu yerlerde duruyor — koşullu akışta, eski motor garantisi gerektiğinde ve ilerlemeyi bir değere çevirmen gereken her yerde. Bu sitede karar ölçülerek verildi ve iki kütüphane de emekli oldu: kaydırma artık bir CSS zaman çizgisi.

Sitenizin hızını ölçüp kök nedeni kaynağında düzeltmemizi isterseniz site hızı optimizasyonu gerçek kullanıcı verisiyle başlar ve LCP, INP ve CLS için bütçeli bir teslim yapar.

Ölçüt

CSS kaydırma zaman çizgisi

Nerede çalışır Tarayıcının animasyon motorunda; destekleyen motorlarda kompozitöre inebilir

Sayfaya inen bayt Yok — sözdizimi platformun parçası

Tarayıcı desteği Destekleyen motorda çalışır; desteklemeyende animasyon kurulmaz, eleman son değerinde durur

Aralık dili `animation-range` anahtar sözcükleri: cover · contain · entry · exit ve «crossing» türevleri

ScrollTrigger

Nerede çalışır Ana iş parçacığında JavaScript olarak

Sayfaya inen bayt Kütüphane dosyası iner (bu sitede 17,6 kilobayttı ve her sayfaya giriyordu)

Tarayıcı desteği Kütüphane her motorda aynı davranışı kurar

Aralık dili start/end dizeleri ve sayısal kaydırmalar

CSS kaydırma zaman çizgisi

Yerleşimi tutan sahne (pin) Eleman kendi çizgisinde `transform` ile ötelenir; sarmalayıcı gerekmez

Metin, ARIA ya da tuval yazan sahne CSS tek başına yapamaz; ilerleme JavaScript’e köprüyle verilir

Hata ayıklama Tarayıcının animasyon paneli; ara değer `getAnimations()` ile okunur

Bağımlılık ve sürüm Yok — yükseltilecek paket yok

Uygun olduğu yer Görsel, geri alınabilir, kaydırmaya bağlı sahneler

ScrollTrigger

Yerleşimi tutan sahne (pin) Sarmalayıcı (pin-spacer) eklenir ve elemana satır içi ölçü yazılır

Metin, ARIA ya da tuval yazan sahne Doğal: her karede geri çağrıda değer yazılır

Hata ayıklama Kütüphanenin işaretçileri ve kendi API’si

Bağımlılık ve sürüm Sürüm yükseltmesi, lisans ve uyumluluk takibi gerekir

Uygun olduğu yer Koşullu akış, karmaşık zaman çizelgesi, eski motorlarda garanti davranış

CSS kaydırma zaman çizgisi mi ScrollTrigger mı
ÖlçütCSS kaydırma zaman çizgisiScrollTrigger
Nerede çalışırTarayıcının animasyon motorunda; destekleyen motorlarda kompozitöre inebilirAna iş parçacığında JavaScript olarak
Sayfaya inen baytYok — sözdizimi platformun parçasıKütüphane dosyası iner (bu sitede 17,6 kilobayttı ve her sayfaya giriyordu)
Tarayıcı desteğiDestekleyen motorda çalışır; desteklemeyende animasyon kurulmaz, eleman son değerinde dururKütüphane her motorda aynı davranışı kurar
Aralık dili`animation-range` anahtar sözcükleri: cover · contain · entry · exit ve «crossing» türevleristart/end dizeleri ve sayısal kaydırmalar
Yerleşimi tutan sahne (pin)Eleman kendi çizgisinde `transform` ile ötelenir; sarmalayıcı gerekmezSarmalayıcı (pin-spacer) eklenir ve elemana satır içi ölçü yazılır
Metin, ARIA ya da tuval yazan sahneCSS tek başına yapamaz; ilerleme JavaScript’e köprüyle verilirDoğal: her karede geri çağrıda değer yazılır
Hata ayıklamaTarayıcının animasyon paneli; ara değer `getAnimations()` ile okunurKütüphanenin işaretçileri ve kendi API’si
Bağımlılık ve sürümYok — yükseltilecek paket yokSürüm yükseltmesi, lisans ve uyumluluk takibi gerekir
Uygun olduğu yerGörsel, geri alınabilir, kaydırmaya bağlı sahnelerKoşullu akış, karmaşık zaman çizelgesi, eski motorlarda garanti davranış

SIK SORULAN SORULAR

CSS zaman çizgisi her sahneyi karşılar mı?

Hayır. Metin yazan, tuval çizen ya da ARIA güncelleyen sahnelerde CSS ilerlemeyi taşır, değeri yine JavaScript yazar. Bu sitede on iki sahnenin on ikisi CSS çizgisine taşındı; netleşme jesti ve tuval motorları JavaScript’te kaldı.

Desteklemeyen tarayıcıda ne olur?

Animasyon hiç kurulmaz ve eleman işaretlemedeki son değerinde durur. Yani kaybolan hareket olur, içerik değil. Bu davranış tasarlanabilir bir şeydir: sahneyi son karesinde okunur bırakmak yeterlidir.

Kütüphaneyi kaldırmanın ölçülen karşılığı ne?

İki şey: sayfaya inen bayt ve her karede koşan senkron döngüsü. Bu sitede satıcı paketi 51,1 kilobayttan 33,5 kilobayta indi, pencereye bağlı kaydırma dinleyicisi sıfıra düştü ve gerçek kullanıcı LCP’si en kötü ölçümde 592–640 milisaniyeden 440 milisaniyeye indi.

KAYNAKLAR