Tarayıcı Nasıl Çizer — Animasyon Neden Takılıyor?
Önce şunu oku: JavaScript Olay Döngüsü — setTimeout(0) Neden Sonra Yazıyor?
30 saniyede özet
Tarayıcı her kareyi dört adımda çizer: stil, yerleşim, boyama, birleştirme. Değiştirdiğin özellik hangi adımdan başlarsa, ondan sonrakiler de çalışır. Oku-yaz-oku-yaz döngüsü ise yerleşimi tekrar tekrar zorlar.
Bir kartı ekranda kaydırıyorsun. Bilgisayarında akıyor, ucuz bir telefonda takılıyor. Kod aynı, ama tarayıcının her karede yaptığı iş miktarı çok farklı olabilir.
-
Bayt: Kartı left ile sağa kaydırıyorum. Telefonda tık tık ilerliyor.
-
Sen: Aynı kart transform ile nasıl?
-
Bayt: Yağ gibi! Ama ikisi de 'kartı kaydır' demiyor mu?
-
Bayt: Ne yaptığın aynı, tarayıcıya ne yaptırdığın farklı. Adımlara bakalım.
Bir kare, dört adım
Önce stil: hangi kurallar hangi öğeye uyuyor. Sonra layout (reflow)Tarayıcının her öğenin yerini ve boyunu hesapladığı adım. left, width gibi geometri özellikleri onu yeniden çalıştırır; sonraki adımlar da peşinden gelir.Sözlükte gör →: her öğenin yeri ve boyu. Sonra boyama ile pikseller, en son compositingAyrı ayrı boyanmış katmanları üst üste koyup ekrana veren son adım. transform ve opacity değişiklikleri çoğu zaman yalnızca bu adımı çalıştırır.Sözlükte gör → ile ayrı katmanlar üst üste konur.
Bir değişiklik hangi adımdan başlarsa, ondan sonraki her adım da çalışır. Bu yüzden yerleşimden başlayan bir değişiklik en pahalısıdır.
Kafam karıştı, daha basit anlat
Önce kurallar, sonra yerler, sonra boya, en son katmanlar. Erken bir adımdan başlarsan hepsini yeniden yaparsın.
Tarayıcının bir kareyi çizerken izlediği sıra hangisi?
Neden yerleşimden başlayan bir değişiklik en pahalısıdır?
Hangi özellik nereden başlar?
Bir kartı her karede biraz sağa kaydırıyorsun. left yerine transform: translateX kullanırsan dört adımdan hangileri atlanır? Cevabı göster
Yerleşim ve boyama. Kart kendi katmanındaysa tarayıcı onu yeniden yerleştirmez ve yeniden boyamaz; katmanı kaydırıp birleştirir.
Adım adım oku
- left değişince yerleşim baştan hesaplanır, sonra boyama ve birleştirme gelir.
- Renk değişince yerleşim atlanır; boyama ve birleştirme çalışır.
- transform değişince kart kendi katmanında kayar; yalnızca birleştirme çalışır.
- Hareket ve solma için camı kaydır: transform ve opacity.
left, top, width gibi geometri özellikleri yerleşimden başlar. color ve background boyamadan başlar. transform ve opacity, öğe kendi katmanındaysa çoğu tarayıcıda yalnızca birleştirmeyi çalıştırır.
Kafam karıştı, daha basit anlat
Kaydırmak için transform, soldurmak için opacity. İkisi de sahne planına dokunmaz.
Bir kartı kaydırmak için hangi özelliği canlandırmak en ucuzudur?
Bir butonun background-color değeri animasyonla değişiyor. Hangi adımlar çalışır?
Oku, yaz, oku, yaz
Tarayıcı yerleşimi normalde karenin sonunda bir kez hesaplar. Ama bir stil yazdıktan sonra offsetHeight gibi bir boyut okursan, doğru cevabı verebilmek için yerleşimi o anda hesaplamak zorunda kalır.
Bunu bir döngüde her öğe için yaparsan layout thrashingStil yazıp hemen boyut okumayı döngüde tekrarlamak. Her okuma yerleşimi o anda zorlar; önce hepsini okuyup sonra hepsini yazmak çözer.Sözlükte gör → olur. Çözüm basit: önce bütün okumaları, sonra bütün yazmaları yap.
Kafam karıştı, daha basit anlat
Ölçüp keserken her kesimden sonra yeniden ölçme. Önce hepsini ölç, sonra hepsini kes.
Bir döngüde her kart için önce style.height yazıp sonra offsetHeight okuyorsun. Ne olur?
Kendin gör
Bir değişiklik, kaç aşama?
Tohum 142782- Stilbekliyor
- Yerleşimbekliyor
- Boyamabekliyor
- Birleştirmebekliyor
Oynat ya da adımla.
Şu an ne oldu?
Kartı left ile kaydır
Tarayıcı bir kareyi dört aşamada çizer: stil, yerleşim, boyama, birleştirme. Değişiklik hangisinden başlarsa, ondan sonrakiler de çalışır.
Görevler0/3
Her karede dört aşamanın hepsini çalıştıraçık
İpucu
Geometriyi değiştiren bir özellik seç.
Kartı yerleşim ve boyama olmadan kaydıraçık
İpucu
Kaydırmanın başka bir yolu var.
Dört zorunlu yerleşimi tek bir yerleşime indiraçık
İpucu
Önce çırpınmayı gör, sonra okumaları bir araya topla.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. left ile kaydırmak her karede dört adımın hepsini çalıştırdı.
- Rengi değiştir. Yerleşim atlandı.
- transform ile kaydır. Yalnızca birleştirme kaldı.
- “oku, yaz, oku, yaz” seç. Dört zorunlu yerleşim.
- “önce hepsini oku” seç. Tek yerleşim.
Hangisi de yerleşimi zorlayabilen bir okumadır?
Tuzaklar
Her şeyi katmana almak. will-change: transform’u her öğeye yazmak bellek harcar ve kazancı siler. Yalnızca gerçekten hareket edecek öğeye, gerektiği süre boyunca ver.
Gizli okumalar. getBoundingClientRect, scrollTop, clientWidth ve getComputedStyle de yerleşimi zorlayabilir. Okuma olduğu her zaman açık değildir.
Göz kararı ölçmek. “Takılıyor gibi” bir ölçüm değil. DevTools’un Performance sekmesi uzun görevleri ve zorunlu yerleşimleri tek tek gösterir.
Kafam karıştı, daha basit anlat
Katmanı az ve bilerek kullan, gizli okumalara dikkat et, hissi değil kaydı ölç.
Performansı artırmak için bütün öğelere will-change: transform yazıldı. Sonuç?
Aşağıdaki örnek bir bankacılık uygulamasının kart listesinden: açılır kapanır işlem kartları ve kayan bildirim.
Derinleş · İşlem kartları: önce ölç, sonra yaz; kaydırırken camı kaydır 3 dosya · ~30 satır · ilk okumada atlayabilirsin
Kendini sına
left ile yapılan animasyon her karede yerleşimi yeniden hesaplatır.
Bir bildirim aşağıdan bottom özelliği animasyonla değiştirilerek kayıyor. Hangi değişiklik, görünümü aynı tutup işi en çok azaltır?
Aklında kalacak üç şey
- 1 Tarayıcı bir kareyi stil, yerleşim, boyama ve birleştirme adımlarıyla çizer. left ve width yerleşimden, renk boyamadan başlar; transform ve opacity çoğu zaman yalnızca birleştirmeyi çalıştırır.
- 2 Bir öğenin boyutunu okumak, ondan önce yazılan stil yüzünden yerleşimi o anda hesaplatabilir. Okuma ve yazmayı karıştıran bir döngü, yerleşimi defalarca zorlar.
- 3 Önce bütün okumaları, sonra bütün yazmaları yapmak zorunlu yerleşimleri ortadan kaldırır. Hareket için transform, solma için opacity seçilir.
4 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.
- Frontend & EntegrasyonCore Web Vitals — Sayfa Ne Zaman Gerçekten Hazır?Senin bilgisayarında sayfa bir anda açılıyor. Müşterinin telefonunda neden üç ayrı şikâyet var?Derse git
- Frontend & EntegrasyonTarayıcı Önbelleği — Yeni Sürümü Yayına Aldın, Müşteri Neden Hâlâ Eskisini Görüyor?Hatayı düzelttin, yayına aldın, testler yeşil. Müşteri ise 'hâlâ aynı hata' diyor. Kim yanılıyor?Derse git