@angular/animations paketi v20.2 itibarıyla kullanım dışı bırakılmıştır (deprecated). Aynı sürümde uygulamanıza animasyonlar eklemek için yeni animate.enter ve animate.leave özelliği de tanıtılmıştır. Bu yeni özellikleri kullanarak, @angular/animations tabanlı tüm animasyonları düz CSS veya JS animasyon kütüphaneleri ile değiştirebilirsiniz. @angular/animations'i uygulamanızdan kaldırmak JavaScript paketinizin boyutunu önemli ölçüde azaltabilir. Yerel CSS animasyonları genellikle donanım hızlandırmasından yararlanabildikleri için üstün performans sunar. Bu rehber, kodunuzu @angular/animations'dan yerel CSS animasyonlarına yeniden düzenleme sürecini anlatır.
Animasyon paketinde olduğu gibi, uygulamanız genelinde paylaşabileceğiniz yeniden kullanılabilir animasyonlar oluşturabilirsiniz. Animasyon paketinin sürümü, paylaşılmış bir TypeScript dosyasında animation() fonksiyonunu kullanmanızı gerektiriyordu. Yerel CSS sürümü benzerdir, ancak paylaşılmış bir CSS dosyasında yer alır.
Animasyon paketi, bir bileşen içinde state() fonksiyonunu kullanarak çeşitli durumlar tanımlamanıza izin veriyordu. Örnekler, her ilgili durumun tanımında yer alan stillerle birlikte open veya closed durumu olabilir. Örneğin:
open veya closed durumunu tetiklemek, bileşeninizdeki eleman üzerinde sınıfları değiştirerek yapılır. Bunu nasıl yapacağınıza dair örnekleri şablon rehberimizde bulabilirsiniz.
Animasyon paketinin animate() fonksiyonu, süre, gecikme ve yumuşaklık gibi zamanlama sağlamanıza olanak tanır. Bu, CSS'de birçok CSS özelliği veya kısayol özellikleri kullanılarak yerel olarak yapılabilir.
CSS'de bir anahtar kare animasyonu için animation-duration, animation-delay ve animation-timing-function belirtin veya alternatif olarak animation kısayol özelliğini kullanın.
Benzer şekilde, @keyframes kullanmayan animasyonlar için transition-duration, transition-delay, transition-timing-function ve transition kısayolunu kullanabilirsiniz.
Animasyon paketi, trigger() fonksiyonunu kullanarak tetikleyiciler belirtmeyi ve tüm durumlarınızı onun içinde iç içe yerleştirmeyi gerektiriyordu. Yerel CSS ile buna gerek yoktur. Animasyonlar CSS stilleri veya sınıfları değiştirerek tetiklenebilir. Bir sınıf bir elemanda mevcut olduğunda, animasyon gerçekleşir. Sınıfı kaldırmak, elemanı o eleman için tanımlanmış CSS'e geri döndürecektir. Bu, aynı animasyonu yapmak için önemli ölçüde daha az kodla sonuçlanır. İşte bir örnek:
Animasyon paketi, tanımladığınız durumları dizeler aracılığıyla bir geçişle eşleştirme yeteneğini sunuyordu. Örneğin, açıktan kapalıya animasyonlamak open => closed şeklinde olurdu. Herhangi bir durumu hedef durumla eşleştirmek için * => closed gibi joker karakterler kullanabilirsiniz ve giriş ve çıkış durumları için void anahtar sözcüğü kullanılabilir. Örneğin: bir eleman görünümden ayrılırken * => void veya eleman görünüme girerken void => *.
Bu durum eşleme kalıpları, doğrudan CSS ile animasyon yaparken hiç gerekli değildir. Elemanlara ayarladığınız sınıflara ve/veya stillere göre hangi geçişlerin ve @keyframes animasyonlarının uygulanacağını yönetebilirsiniz. Ayrıca elemanın DOM'a girdiği andaki görünümünü kontrol etmek için @starting-style ekleyebilirsiniz.
Animasyon paketi, height: auto'ya animasyon yapmak gibi tarihsel olarak animasyonlanması zor olan şeyleri animasyonlama yeteneğini sunuyordu. Artık bunu saf CSS ile de yapabilirsiniz.
Daha önce bahsedilen :enter ve :leave'e ek olarak, :increment ve :decrement de vardır. Bunları da sınıflar ekleyip kaldırarak animasyonlayabilirsiniz. Animasyon paketinin yerleşik takma adlarının aksine, değerler yukarı veya aşağı gittiğinde sınıfların otomatik olarak uygulanması yoktur. Uygun sınıfları programatik olarak uygulayabilirsiniz. İşte bir örnek:
Animasyon paketinden farklı olarak, belirli bir bileşen içinde birden fazla animasyon belirlendiğinde, hiçbir animasyonun diğerine önceliği yoktur ve hiçbir şey herhangi bir animasyonun çalışmasını engellemez. Animasyonların sıralanması, CSS animasyonunuzun tanımı, animasyon/geçiş gecikmesi ve/veya sonraki animasyonlanacak CSS'i eklemeyi işlemek için animationend veya transitionend kullanılarak yönetilmelidir.
Alt animasyonlar yalnızca aynı bileşen şablonu içinde çalışır. @angular/animations paketinde üst animasyonlar, query() ve animateChild() kullanarak iç içe alt bileşenlerdeki animasyonları sorgulayıp tetikleyebiliyordu. animate.leave ve yerel CSS animasyonlarıyla, iç içe alt bileşen şablonlarında tanımlanan animasyonlar, bir üst bileşen bir elemanı veya görünümü kaldırdığında çalışmaz. Yalnızca aynı Angular bileşen şablonu içindeki iç içe animasyonlar yürütülür. Bu konuda daha fazla bilgi için Giriş ve Çıkış animasyonları rehberine bakın.
Bu sınıfı bir elemana uygulamak, o eleman üzerindeki herhangi bir animasyonun çalışmasını engeller. Alternatif olarak, bu davranışı uygulamak için bunu tüm DOM'unuza veya DOM'unuzun bir bölümüne kapsayabilirsiniz. Ancak bu, animasyon olaylarının çalışmasını engeller. Eleman kaldırma için animasyon olaylarını bekliyorsanız, bu çözüm işe yaramaz. Geçici bir çözüm, süreleri 1 milisaniyeye ayarlamaktır.
Daha az animasyon tercih eden kullanıcılar için hiçbir animasyonun çalmamasını sağlamak için prefers-reduced-motion medya sorgusunu kullanın.
Programatik olarak animasyon sınıfları eklemeyi engelleyin
Animasyon paketi, animasyon bittiğinde bir şeyler yapmak istemeniz durumunda kullanmanız için geri çağırmalar sunuyordu. Yerel CSS animasyonlarının da bu geri çağırmaları vardır.
Web Animations API birçok ek işlev sunar. Mevcut tüm animasyon API'lerini görmek için belgelere göz atın.
NOTE: Bu geri çağırmalarla kabarcıklanma sorunlarına dikkat edin. Alt ve üst elemanları animasyonluyorsanız, olaylar alt elemanlardan üst elemanlara doğru kabarcıklanır. Bir alt düğümden kabarcıklanan bir olaya değil, istediğiniz olay hedefine yanıt verdiğinizden emin olmak için yayılımı durdurun veya olay içindeki daha fazla ayrıntı inceleyin. Doğru düğümlere sahip olduğunuzu doğrulamak için animationname özelliğini veya geçişi yapılan özellikleri inceleyebilirsiniz.
Animasyon paketinde, document.querySelector()'a benzer bir CSS sınıf adı ile belirli elemanları bulmak için query() fonksiyonunu kullanarak belirli elemanları hedefleyebilirdiniz. Yerel CSS animasyon dünyasında buna gerek yoktur. Bunun yerine, alt sınıfları hedeflemek ve istediğiniz transform veya animation'i uygulamak için CSS seçicilerinizi kullanabilirsiniz.
Bir şablon içindeki alt düğümlerin sınıfları için değiştirmek için, animasyonları doğru noktalarda eklemek için sınıf ve stil bağlamalarını kullanabilirsiniz.
stagger() fonksiyonu, kademeli bir etki oluşturmak için bir listedeki her öğenin animasyonunu belirtilen bir süre geciktirmenize olanak tanıyordu. Bu davranışı animation-delay veya transition-delay kullanarak yerel CSS'de kopyalayabilirsiniz. Bu CSS'nin nasıl görünebileceğine dair bir örnek.
Animasyon paketinde aynı anda birden fazla animasyon oynatmak için group() fonksiyonu vardır. CSS'de animasyon zamanlaması üzerinde tam kontrol sahibisiniz. Tanımlanmış birden fazla animasyonunuz varsa, hepsini aynı anda uygulayabilirsiniz.
Listede yeniden sıralanan öğeler, daha önce açıklanan teknikleri kullanarak kutudan çıkar çıkmaz çalışır. Ek özel bir çalışma gerekmez. Bir @for döngüsündeki öğeler düzgün şekilde kaldırılıp yeniden eklenecek, bu da giriş animasyonları için @starting-styles kullanılarak animasyonları tetikleyecektir. Alternatif olarak, aynı davranış için animate.enter kullanabilirsiniz. Yukarıdaki örnekte görüldüğü gibi elemanlar kaldırılırken animasyonlamak için animate.leave kullanın.
AnimationPlayer sınıfı, duraklatma, oynatma, yeniden başlatma ve bir animasyonu kod aracılığıyla bitirme gibi daha gelişmiş şeyler yapabilmek için bir animasyona erişim sağlar. Tüm bunlar yerel olarak da ele alınabilir.
Element.getAnimations() kullanarak bir elemandaki animasyonları doğrudan alabilirsiniz. Bu, o elemandaki her Animation'in bir dizisini döndürür. Animasyon paketinin AnimationPlayer'ının sunduğu şeylerden çok daha fazlasını yapmak için Animation API'sini kullanabilirsiniz. Buradan cancel(), play(), pause(), reverse() ve çok daha fazlasını yapabilirsiniz. Bu yerel API, animasyonlarınızı kontrol etmeniz için ihtiyacınız olan her şeyi sağlamalıdır.