Animasyonlar
Teknoloji Seçimleri
Animasyonlar genellikle uygulamaları daha canlı hale getirmek için kullanılır. Günümüzde tarayıcılar CSS animasyonları için iyi bir desteğe sahip ve hızlı JavaScript tabanlı animasyonlar sağlayan çeşitli kütüphaneler bulunmaktadır. Ayrıca, en son teknolojileri kullanmayı tercih ediyorsanız, gelişmekte olan bir Web API ve bir polyfill de mevcuttur.
Mithril.js, zengin ve karmaşık animasyonlar elde etmek için bu diğer seçenekler yeterli olduğundan, herhangi bir animasyon API'si sunmaz. Ancak Mithril.js, animasyonların uygulanmasının geleneksel olarak zor olduğu bazı özel durumlarda işleri kolaylaştırmak için yaşam döngüsü kancaları (hooks) sağlar.
Eleman Oluşturma Animasyonu
Bir elemanın oluşturulmasını CSS ile canlandırmak oldukça basittir. Normalde olduğu gibi bir CSS sınıfına bir animasyon eklemeniz yeterlidir:
.fancy {
animation: fade-in 0.5s;
}
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
var FancyComponent = {
view: function () {
return m('.fancy', 'Merhaba dünya');
},
};
m.mount(document.body, FancyComponent);
Eleman Kaldırma Animasyonu
Bir elemanı kaldırmadan önce animasyon uygulama konusundaki sorun, elemanı tamamen kaldırmak için animasyonun bitmesini beklememiz gerekmesidir. Neyse ki, Mithril.js, elemanın kaldırılmasını geciktirmemize olanak tanıyan onbeforeremove
kancasını sunar.
opacity
değerini 1'den 0'a düşürerek kaybolma efekti veren bir exit
animasyonu oluşturalım.
.exit {
animation: fade-out 0.5s;
}
@keyframes fade-out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
Şimdi, önceki bölümde oluşturduğumuz FancyComponent
'ı gösterip gizleyen basit bir bileşen oluşturalım:
var on = true;
var Toggler = {
view: function () {
return [
m(
'button',
{
onclick: function () {
on = !on;
},
},
'Değiştir'
),
on ? m(FancyComponent) : null,
];
},
};
Ardından, kaldırıldığında solma efektiyle kaldıracak şekilde FancyComponent
'ı değiştirelim:
var FancyComponent = {
onbeforeremove: function (vnode) {
vnode.dom.classList.add('exit');
return new Promise(function (resolve) {
vnode.dom.addEventListener('animationend', resolve);
});
},
view: function () {
return m('.fancy', 'Merhaba dünya');
},
};
vnode.dom
, bileşenin kök DOM elemanına (<div class="fancy">
) işaret eder. Burada exit
sınıfını <div class="fancy">
'ye eklemek için classList
API'sini kullanıyoruz.
Ardından, animationend
olayı tetiklendiğinde çözülen bir Promise döndürüyoruz. onbeforeremove
'dan bir promise döndürdüğümüzde, Mithril.js, promise çözülene kadar bekler ve elemanı yalnızca o zaman kaldırır. Bu durumda, çıkış animasyonunun bitmesini bekler.
Toggler
bileşenini bağlayarak hem giriş hem de çıkış animasyonlarının çalıştığını doğrulayabiliriz:
m.mount(document.body, Toggler);
onbeforeremove
kancasının, bir eleman DOM'dan ayrılırken parentNode
özelliğini kaybeden eleman üzerinde tetiklendiğine dikkat edin. Bu davranışın amacı, sayfa geçişlerinde olası tüm çıkış animasyonlarının aynı anda çalışmasını engelleyerek daha tutarlı bir kullanıcı deneyimi sağlamaktır. Çıkış animasyonunuz çalışmıyorsa, animasyon kodunuzun çağrıldığından emin olmak için onbeforeremove
işleyicisini DOM ağacında mümkün olan en üst seviyeye eklediğinizden emin olun.
Performans
Animasyon oluştururken, modern tarayıcılar tarafından donanım ile hızlandırılabilen ve top
, left
, width
ve height
özelliklerini canlandırmaktan daha iyi performans sağladıkları için yalnızca opacity
ve transform
CSS özelliklerini kullanmanız önerilir.
Ayrıca, box-shadow
özelliği ve :nth-child
gibi seçicilerden kaçınmanız önerilir; çünkü bunlar da kaynak yoğun seçeneklerdir. Bir box-shadow
'u canlandırmak istiyorsanız, box-shadow
özelliğini bir sözde elemana uygulayıp, o elemanın şeffaflığını animasyonlandırmayı düşünebilirsiniz. Performansı düşürebilecek diğer şeyler arasında büyük veya dinamik olarak ölçeklenmiş resimler ve farklı position
değerlerine sahip (örneğin, position: fixed
olan bir elemanın üzerinde position: absolute
olan bir eleman) örtüşen elemanlar bulunur.