Yüksek performanslı CSS animasyonları oluşturma

Bu kılavuzda, yüksek performanslı CSS animasyonlarının nasıl oluşturulacağı öğretilmektedir.

Bu önerilerin arkasındaki teoriyi öğrenmek için Bazı animasyonlar neden yavaş? bölümüne bakın.

Tarayıcı uyumluluğu

Bu kılavuzun önerdiği tüm CSS özellikleri, tarayıcılar arası düzeyde iyi destek sağlar.

Öğeleri taşıma

Bir öğeyi taşımak için transform özelliğinin translate veya rotation anahtar kelime değerlerini kullanın.

Örneğin, bir öğeyi görünüme kaydırmak için translate işlevini kullanın.

.animate {
  animation: slide-in 0.7s both;
}

@keyframes slide-in {
  0% {
    transform: translateY(-1000px);
  }
  100% {
    transform: translateY(0);
  }
}

360 derece altındaki örnekte öğeler de döndürülebilir.

.animate {
  animation: rotate 0.7s ease-in-out both;
}

@keyframes rotate {
  0% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}

Öğeleri yeniden boyutlandırma

Bir öğeyi yeniden boyutlandırmak için transform özelliğinin scale anahtar kelime değerini kullanın.

.animate {
  animation: scale 1.5s both;
}

@keyframes scale {
  50% {
    transform: scale(0.5);
  }
  100% {
    transform: scale(1);
  }
}

Bir öğenin görünürlüğünü değiştirme

Bir öğeyi göstermek veya gizlemek için opacity öğesini kullanın.

.animate {
  animation: opacity 2.5s both;
}

@keyframes opacity {
  0% {
    opacity: 1;
  }
  50% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

Düzeni veya boyamayı tetikleyen özelliklerden kaçının

Animasyon için herhangi bir CSS mülkü (transform ve opacity dışında) kullanmadan önce, mülkün oluşturma ardışık düzeni üzerindeki etkisini belirleyin. Kesinlikle gerekli olmadığı sürece düzeni veya boyamayı tetikleyen özellikler kullanmaktan kaçının.

Katman oluşturmayı zorunlu kıl

Bazı animasyonlar neden yavaş? konusunda açıklandığı gibi, öğeler yeni bir katmana yerleştirildiğinde düzenin geri kalanının da yeniden boyanmasına gerek kalmadan yeniden boyanabilir.

Tarayıcılar genellikle yeni bir katmana hangi öğelerin yerleştirilmesi gerektiğine dair iyi kararlar verir, ancak will-change özelliğiyle katman oluşturmayı manuel olarak zorunlu kılabilirsiniz. Adından da anlaşılacağı gibi bu özellik, tarayıcıya öğenin bir şekilde değiştirileceğini bildirir.

CSS'de bu özellik herhangi bir seçiciye uygulanabilir:

body > .sidebar {
  will-change: transform;
}

Ancak bu spesifikasyon, bu yaklaşımın yalnızca sürekli değişmek üzere olan öğeler için uygulanması gerektiğini göstermektedir. Yukarıdaki örnek bir kenar çubuğuysa kullanıcı kaydırarak içeri ve dışarı doğru kaydırabilirse bu durum söz konusu olabilir. Sayfanızdaki bazı öğeler sık sık değişmeyebilir. Bu nedenle, değişikliğin gerçekleşme olasılığının yüksek olduğu bir noktaya JavaScript kullanarak will-change uygulanması daha iyi olur. Tarayıcıya, gerekli optimizasyonları yapması için yeterli zaman tanımanız ve değişiklik durduğunda özelliği kaldırmanız gerekir.

will-change özelliğini desteklemeyen nadir tarayıcılardan birinde (bu noktada büyük olasılıkla Internet Explorer) katman oluşturmayı zorlamak istiyorsanız transform: translateZ(0) parametresini ayarlayabilirsiniz.

Yavaş veya kötü animasyonlarda hata ayıklama

Chrome Geliştirici Araçları ve Firefox Geliştirici Araçları, animasyonlarınızın neden yavaş veya kötü olduğunu anlamanıza yardımcı olacak birçok araca sahiptir.

Bir animasyonun düzeni tetikleyip tetiklemediğini kontrol etme

Bir öğeyi transform dışında bir şey kullanarak taşıyan animasyon muhtemelen yavaş olacaktır. Aşağıdaki örnekte top ve left animasyonlarını kullanarak ve transform kullanarak aynı görsel sonucu elde ettim.

Yapılmaması gerekenler
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     top: calc(90vh - 160px);
     left: calc(90vw - 200px);
  }
}
Yapılması gerekenler
.box {
  position: absolute;
  top: 10px;
  left: 10px;
  animation: move 3s ease infinite;
}

@keyframes move {
  50% {
     transform: translate(calc(90vw - 200px), calc(90vh - 160px));
  }
}

Bunu aşağıdaki iki Glitch örneğinde test edebilir ve Geliştirici Araçları'nı kullanarak performansı keşfedebilirsiniz.

Chrome Geliştirici Araçları

  1. Performans panelini açın.
  2. Animasyonunuz devam ederken çalışma zamanı performansını kaydedin.
  3. Özet sekmesini inceleyin.

Özet sekmesinde Oluşturma için sıfır dışında bir değer görürseniz bu, animasyonunuzun tarayıcının düzen çalışması yapmasına neden olduğu anlamına gelebilir.

Özet panelinde, oluşturma için 37 ms ve boyama için 79 ms.
animation-with-top-left örneği, oluşturma çalışmasına neden olur.
Özet panelinde, oluşturma ve boyama için sıfır değer gösterilir.
animation-with-transform örneği, oluşturma işine neden olmaz.

Firefox Geliştirici Araçları

Firefox Geliştirici Araçları'nda Waterfall, tarayıcının nerede zaman geçirdiğini anlamanıza yardımcı olabilir.

  1. Performans panelini açın.
  2. Panelde, animasyonunuz devam ederken performansı kaydetmeye başlayın.
  3. Kaydı durdurun ve Şelale sekmesini inceleyin.

Stili Yeniden Hesapla girişleri görürseniz tarayıcının, oluşturma şelalesinin başında başlaması gerekiyordur.

Bir animasyonun kare kaybedip kaybetmediğini kontrol etme

  1. Chrome Geliştirici Araçları'nın Oluşturma sekmesini açın.
  2. FPS meter onay kutusunu etkinleştirin.
  3. Animasyonunuz çalışırken değerleri izleyin.

FPS meter kullanıcı arayüzünün üst kısmında Çerçeveler etiketini görürsünüz. Bunun altında, 50% 1 (938 m) dropped of 1878 çizgileri boyunca bir değer görürsünüz. Yüksek performanslı bir animasyonun yüzdesi yüksek olur (ör. 99%). Yüksek bir yüzde, birkaç karenin atlandığı ve animasyonun düzgün görüneceği anlamına gelir.

FPS ölçer, karelerin% 50'sinin atlandığını gösteriyor
animation-with-top-left örneği, karelerin% 50'sinin atlanmasına neden oluyor
FPS ölçer, karelerin yalnızca% 1'inin atlandığını gösteriyor
animation-with-transform örneği, karelerin yalnızca% 1'inin atlanmasına neden olur.

Bir animasyonun boyamayı tetikleyip tetiklemediğini kontrol etme

Konu boyama olduğunda bazı şeyler diğerlerinden daha pahalıdır. Örneğin, bulanıklık içeren herhangi bir şeyin (ör. gölge) boyaması, kırmızı bir kutu çizmekten daha uzun sürer. Ancak CSS söz konusu olduğunda bu her zaman net olarak anlaşılmaz: background: red; ve box-shadow: 0, 4px, 4px, rgba(0,0,0,0.5); her zaman çok farklı performans özelliklerine sahip gibi görünmese de yapar.

Tarayıcı Geliştirici Araçları, hangi alanların yeniden boyanması gerektiğini ve boyamayla ilgili performans sorunlarını belirlemenize yardımcı olabilir.

Chrome Geliştirici Araçları

  1. Chrome Geliştirici Araçları'nın Oluşturma sekmesini açın.
  2. Yanıp sönen boya'yı seçin.
  3. İşaretçiyi ekranda hareket ettirin.
Yeniden boyanacağını göstermek için yeşil renkle vurgulanan kullanıcı arayüzü öğesi
Google Haritalar'dan alınan bu örnekte, yeniden boyanacak öğeleri görebilirsiniz.

Ekranın tamamının yanıp söndüğünü veya değişmemesini düşündüğünüz alanların vurgulandığını görüyorsanız araştırma yapabilirsiniz.

Belirli bir mülkün boyama nedeniyle performans sorunlarına neden olup olmadığını incelemeniz gerekirse Chrome Geliştirici Araçları'ndaki boya profil aracı size yardımcı olabilir.

Firefox Geliştirici Araçları

  1. Ayarlar'ı açın ve Boyanın yanıp sönmesini aç/kapat için bir Araç Kutusu düğmesi ekleyin.
  2. İncelemek istediğiniz sayfada düğmeyi açık konumuna getirin ve vurgulanan alanları görmek için farenizi hareket ettirin veya kaydırın.

Sonuç

Animasyonları, oluşturma yolunun birleştirme aşamasında tutmak için mümkün olduğunda opacity ve transform ile kısıtlayın. Yolun hangi aşamasının animasyonlarınızdan etkilendiğini kontrol etmek için Geliştirici Araçları'nı kullanın.

Herhangi bir boya işleminin özellikle pahalı olup olmadığını görmek için boya profili aracını kullanın. Bir şey bulursanız farklı bir CSS mülkünün daha iyi performansla aynı görünüm ve izlenimi sağlayıp sağlamayacağına bakın.

will-change özelliğini dikkatli bir şekilde ve yalnızca bir performans sorunuyla karşılaştığınızda kullanın.