İçeriğe geç

Tarayıcı Nasıl Çizer — Animasyon Neden Takılıyor?

Orta 9 dk Sık karşılaşılır

Ö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.

  1. Bayt: Kartı left ile sağa kaydırıyorum. Telefonda tık tık ilerliyor.

  2. Sen: Aynı kart transform ile nasıl?

  3. Bayt: Yağ gibi! Ama ikisi de 'kartı kaydır' demiyor mu?

  4. 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.

Hızlı kontrolBaşlangıç

Tarayıcının bir kareyi çizerken izlediği sıra hangisi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Neden yerleşimden başlayan bir değişiklik en pahalısıdır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Sahne planını yeniden çizmek mi, camı kaydırmak mı?
Adım adım oku
  1. left değişince yerleşim baştan hesaplanır, sonra boyama ve birleştirme gelir.
  2. Renk değişince yerleşim atlanır; boyama ve birleştirme çalışır.
  3. transform değişince kart kendi katmanında kayar; yalnızca birleştirme çalışır.
  4. 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.

Hızlı kontrolOrta

Bir kartı kaydırmak için hangi özelliği canlandırmak en ucuzudur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bir butonun background-color değeri animasyonla değişiyor. Hangi adımlar çalışır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Hızlı kontrolOrta

Bir döngüde her kart için önce style.height yazıp sonra offsetHeight okuyorsun. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Bir değişiklik, kaç aşama?

Tohum 142782
  1. Stilbekliyor
  2. Yerleşimbekliyor
  3. Boyamabekliyor
  4. Birleştirmebekliyor

Oynat ya da adımla.

Hız
Adım 0

Ş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.

  1. Varsayılanla oynat. left ile kaydırmak her karede dört adımın hepsini çalıştırdı.
  2. Rengi değiştir. Yerleşim atlandı.
  3. transform ile kaydır. Yalnızca birleştirme kaldı.
  4. “oku, yaz, oku, yaz” seç. Dört zorunlu yerleşim.
  5. “önce hepsini oku” seç. Tek yerleşim.
Hızlı kontrolOrta

Hangisi de yerleşimi zorlayabilen bir okumadır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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ç.

Hızlı kontrolOrta

Performansı artırmak için bütün öğelere will-change: transform yazıldı. Sonuç?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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
Proje dosyaları

src/features/transactions/ expandAll.ts Kartları açmadan önce bütün yükseklikler tek seferde ölçülüyor, sonra hepsi yazılıyor.

src/features/transactions/expandAll.ts
// Reading every height first, then writing every height: one layout at the
// frame instead of one forced layout per card.
export function expandAll(cards: readonly HTMLElement[]): void {
const heights = cards.map((card) => card.scrollHeight); // all reads
requestAnimationFrame(() => {
cards.forEach((card, i) => {
card.style.height = `${heights[i]}px`; // all writes
});
});
}

src/features/notify/ toast.css Bildirim transform ve opacity ile giriyor; yerleşim ve boyama çalışmıyor.

src/features/notify/toast.css
/* Slides and fades on its own layer: composite only, no layout, no paint. */
.toast {
transform: translateY(120%);
opacity: 0;
transition: transform 200ms ease-out, opacity 200ms ease-out;
}
.toast[data-open='true'] {
transform: translateY(0);
opacity: 1;
}
/* Not this: animating bottom would run layout and paint on every frame. */
/* .toast { bottom: -80px; transition: bottom 200ms; } */

src/styles/ motion.css Kullanıcı hareket azaltmayı seçtiyse animasyon kapanıyor.

src/styles/motion.css
/* Respect the system setting: some readers get dizzy from motion. */
@media (prefers-reduced-motion: reduce) {
.toast {
transition: none;
}
}

Kendini sına

Şimşek turu1/4

left ile yapılan animasyon her karede yerleşimi yeniden hesaplatır.

Soru 1/3İleri

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?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 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. 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. 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.
Sonraki kapı Masaüstünde beş kart yan yana çok güzel. Telefonda sayfa neden yana kayıyor? Flexbox mı Grid mi — Telefonda Sayfa Neden Yana Kayıyor? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı

Bu dersin üstüne kurulanlar

Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.