Genişletilmiş Ekosistem
Eski Animasyonlar

Angular'ın Animasyon paketinden geçiş

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

Yerel CSS'de animasyonlar nasıl yazılır

Daha önce yerel CSS animasyonları yazmadıysanız, başlangıç için bir dizi mükemmel rehber vardır. Bunlardan birkaçı: MDN CSS Animasyonları rehberi W3Schools CSS3 Animasyonları rehberi Eksiksiz CSS Animasyonları Eğitimi Yeni Başlayanlar İçin CSS Animasyonu

ve birkaç video: 9 Dakikada CSS Animasyonu Öğrenin Net Ninja CSS Animasyon Eğitimi Oynatma Listesi

Bu çeşitli rehber ve eğitimlerin bazılarına göz atın, ardından bu rehbere geri dönün.

Yeniden kullanılabilir animasyonlar oluşturma

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 paketiyle

animations.ts

export const sharedAnimation = animation([
  style({
    height: 0,
    opacity: 1,
    backgroundColor: 'red',
  }),
  animate('1s'),
]);

Yerel CSS ile

animations.css

@keyframes sharedAnimation {
  to {
    height: 0;
    opacity: 1;
    background-color: 'red';
  }
}

.animated-class {
  animation: sharedAnimation 1s;
}

animated-class sınıfını bir elemana eklemek, o eleman üzerinde animasyonu tetikler.

Bir geçişi animasyonlama

Durum ve stilleri animasyonlama

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:

Animasyon paketiyle

open-close.ts

// ...
state(
  'open',
  style({
    height: '200px',
    opacity: 1,
    backgroundColor: 'yellow',
  }),
),

Aynı davranış, anahtar kare animasyonu veya geçiş stili kullanan CSS sınıfları ile yerel olarak gerçekleştirilebilir.

Yerel CSS ile

animations.css

.open {
  height: '200px';
  opacity: 1;
  background-color: 'yellow';
  transition: all 1s;
}

.closed {
  height: '100px';
  opacity: 0.8;
  background-color: 'blue';
  transition: all 1s;
}

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.

Stilleri doğrudan animasyonlama için şablon rehberinde benzer örnekler görebilirsiniz.

Geçişler, zamanlama ve yumuşatma

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.

animations.css

.example-element {
  animation-duration: 1s;
  animation-delay: 500ms;
  animation-timing-function: ease-in-out;
}

.example-shorthand {
  animation: exampleAnimation 1s ease-in-out 500ms;
}

Benzer şekilde, @keyframes kullanmayan animasyonlar için transition-duration, transition-delay, transition-timing-function ve transition kısayolunu kullanabilirsiniz.

animations.css

.example-element {
  transition-duration: 1s;
  transition-delay: 500ms;
  transition-timing-function: ease-in-out;
  transition-property: margin-right;
}

.example-shorthand {
  transition: margin-right 1s ease-in-out 500ms;
}

Bir animasyonu tetikleme

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 paketiyle

Yerel CSS ile

Geçiş ve tetikleyiciler

Önceden tanımlanmış durum ve joker karakter eşleştirme

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.

Joker karakterlerle otomatik özellik hesaplama

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.

Animasyon paketiyle

Otomatik yüksekliğe animasyon yapmak için CSS Grid kullanabilirsiniz.

Yerel CSS ile

Tüm tarayıcıları destekleme konusunda endişelenmeniz gerekmiyorsa, otomatik yüksekliğe animasyon yapmanın gerçek çözümü olan calc-size()'i da inceleyebilirsiniz. Daha fazla bilgi için MDN belgelerine ve (bu eğitime)[https://frontendmasters.com/blog/one-of-the-boss-battles-of-css-is-almost-won-transitioning-to-auto/] bakın.

Görünüme giriş ve çıkış animasyonu

Animasyon paketi, giriş ve çıkış için daha önce bahsedilen kalıp eşlemeyi sunuyordu ve ayrıca :enter ve :leave kısayol takma adlarını da içeriyordu.

Animasyon paketiyle

Yerel CSS ile

Yerel CSS ile

animate.enter ve animate.leave hakkında daha fazla bilgi için Giriş ve Çıkış animasyonları rehberine bakın.

Artırma ve azaltma animasyonu

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 paketiyle

Yerel CSS ile

Üst / Alt animasyonlar

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.

Bir animasyonu veya tüm animasyonları devre dışı bırakma

Yerel CSS animasyonlarıyla, belirttiğiniz animasyonları devre dışı bırakmak istiyorsanız, birden fazla seçeneğiniz vardır.

  1. Animasyon ve geçişi none olarak zorlayan özel bir sınıf oluşturun.
.no-animation {
  animation: none !important;
  transition: none !important;
}

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.

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

  2. Programatik olarak animasyon sınıfları eklemeyi engelleyin

Animasyon geri çağırmaları

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.

OnAnimationStart OnAnimationEnd OnAnimationIteration OnAnimationCancel

OnTransitionStart OnTransitionRun OnTransitionEnd OnTransitionCancel

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.

Karmaşık diziler

Animasyon paketi karmaşık diziler oluşturmak için yerleşik işlevselliğe sahiptir. Bu dizilerin tümü animasyon paketi olmadan tamamen mümkündür.

Belirli elemanları hedefleme

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()

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 paketiyle

Yerel CSS ile

Paralel animasyonlar

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.

.target-element {
  animation:
    rotate 3s,
    fade-in 2s;
}

Bu örnekte, rotate ve fade-in animasyonları aynı anda başlar.

Yeniden sıralanan listenin öğelerini animasyonlama

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.

Animasyon paketiyle

Yerel CSS ile

AnimationPlayer kullanımlarını taşıma

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.

Rota geçişleri

Rotalar arasında animasyon yapmak için görünüm geçişlerini kullanabilirsiniz. Başlamak için Rota Geçiş Animasyonları Rehberine bakın.