CSS Animasyonlar
Geçişler bir tetikleyicide A → B öğretti. Transform çizilen kutunun nereye gittiğini gösterdi. Animasyonlar bir zaman çizelgesi yazar: durum noktası nabız alsın, yükleyici sonsuza dönsün, kartlar sırayla girsin — adımlar @keyframes ile, oynatma animation ile.
Animasyon nedir?
İki parça: yüzdelerde (veya from / to) stilleri sıralayan adlı keyframe kümesi (@keyframes) ve bu adı süre, isteğe bağlı gecikme, tekrar sayısı, yön, zamanlama fonksiyonu ve fill-mode ile çalan kural. Tarayıcı keyframe durakları arasında ara değer üretir.
Ad eşleşmesi katıdır: animation-name: pulse yalnızca @keyframes pulse varsa çalışır. Birini diğerini değiştirmeden yeniden adlandırırsanız hiçbir şey kıpırdamaz.
Animasyon kontrolleri — bir bakışta
📊 Temel animation parçaları
| Parça | Görev |
|---|---|
@keyframes name { … } |
% / from / to noktalarında özellik değerleri zaman çizelgesi |
animation-name |
Hangi keyframe kümesi oynatılacak |
animation-duration |
Bir döngünün süresi (s veya ms) |
animation-timing-function |
Döngü içi yumuşatma (ease, linear, …) |
animation-delay |
İlk döngüden önce bekleme |
animation-iteration-count |
Kaç döngü (number veya infinite) |
animation-direction |
normal, reverse, alternate, alternate-reverse |
animation-fill-mode |
Önce/sonra stiller (none, forwards, backwards, both) |
animation shorthand |
name → duration → timing → delay → iteration → direction → fill-mode (yaygın sıra) |
Her longhand’i aynı anda kullanmanız gerekmez. name + duration ile başlayın; yükleyiciler için infinite, geri sekme için alternate, son keyframe kalsın diyorsanız forwards ekleyin.
İlk zaman çizelgesi — sakin bir pulse
Opacity ve transform boyama dostudur. Yumuşak bir pulse, ilk @keyframes alıştırması için klasiktir.
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.55;
transform: scale(0.92);
}
}
.status-dot {
display: inline-block;
width: 0.75rem;
height: 0.75rem;
border-radius: 50%;
background: #16a34a;
animation: pulse 1.4s ease-in-out infinite;
}
0% ve 100% eşleşir; döngü temiz kapanır. infinite döngüyü sürdürür — küçük durum göstergesi için uygun; tüm sayfa hero’sunu animate ederseniz gürültülü olur.
Sonsuz dönüş — yükleyiciler linear sever
linear ve infinite ile dönüş sürekli spinner gibi okunur. prefers-reduced-motion yedeği ekleyin: dönüşü gizleyin veya dondurun.
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.loader {
width: 2rem;
height: 2rem;
border: 3px solid #e5e7eb;
border-top-color: #2563eb;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
.loader {
animation: none;
border-top-color: #e5e7eb;
}
}
to, 100% kısaltmasıdır. Yalnızca dönüşün sonu önemliyse varsayılan 0% (transform yok) yeterlidir.
Gecikme ve stagger — aynı keyframes, farklı başlangıçlar
Tek keyframe kümesi birçok öğeyi sürebilir. animation-delay ile stagger yapın; üç ayrı animasyon yazmadan liste sıralı hissettirsin.
@keyframes fade-up {
from {
opacity: 0;
transform: translateY(0.75rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.reveal-list li {
opacity: 0;
animation: fade-up 0.45s ease forwards;
}
.reveal-list li:nth-child(1) { animation-delay: 0s; }
.reveal-list li:nth-child(2) { animation-delay: 0.08s; }
.reveal-list li:nth-child(3) { animation-delay: 0.16s; }
forwards, döngü bitince son keyframe stillerini tutar — yoksa öğeler taban kuraldaki opacity: 0’a geri sıçrayabilir. İşte animation-fill-mode burada devreye girer.
Tek seferlik girişte fill-mode
Giriş hareketleri çoğu zaman bir kez oynar. Fill-mode, gecikmeden önce ve son kareden sonra stillerin uygulanıp uygulanmayacağını belirler.
@keyframes card-in {
from {
opacity: 0;
transform: translateY(1rem) scale(0.98);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.card-enter {
animation: card-in 0.5s ease 0.1s both;
}
Buradaki shorthand: ad card-in, süre 0.5s, easing ease, gecikme 0.1s, fill-mode both. both, gecikme sırasında ilk keyframe’i uygular ve sonrasında son keyframe’i tutar.
Yön, play state ve ne zaman animate etmeyin
animation-direction: alternate tek döngülerde ileri, çiftlerde geri oynatır — keyframe’leri çoğaltmadan hafif bounce için kullanışlıdır. animation-play-state: paused çalışan animasyonu dondurur (dekoratif döngüde hover’da duraklatma gibi).
Basit hover renk değişimi için transition kullanmaya devam edin. Döngü, çok adımlı hikâye veya tek durum anahtarına bağlı olmayan hareket gerektiğinde animasyona geçin. Keyframe içinde transform ve opacity tercih edin; width, height veya top animate etmek daha ağır ve layout’u sıklıkla titretir.
Deneyin
- Yalnızca opacity ile üç duraklı (
0%/50%/100%) pulse yapın; sonra azscaleekleyin. spin+linear+infinitespinner;ease’e geçip düzensiz hissi fark edin.- Aynı
fade-upkeyframes ve0s,0.1s,0.2sgecikmelerle üç rozeti stagger edin —forwardsile ve olmadan karşılaştırın. - Bir panelde
animation: card-in 0.5s ease 0.15s both;both’u kaldırıp geri sıçramayı izleyin. prefers-reduced-motion: reducealtında dekoratif döngülerdeanimation: none(veya kısa bir fade) kullanın.
Sık hatalar
- Hover A→B solmasının «döngüye» girmesini beklemek — bu animation alanı, yalnız transition değil
animation-nameile@keyframesadı arasında yazım uyuşmazlığı — sessiz no-op- Durak veya reduced-motion planı olmadan büyük, dikkat çeken bölgelerde
infinite - transform/opacity yetecekken layout özelliklerini (
width,margin,top) animate etmek - Taban kuralda
opacity: 0ile tek seferlik reveal’lardaforwards/botheksikliği
Özet
@keyframeszaman çizelgesini tanımlar;animation(veya longhand’ler) oynatır- iteration, direction, delay ve fill-mode — döngü, geri sekme, stagger ve yapışkan son için
- transform/opacity tercih edin; dekoratif harekette prefers-reduced-motion’a saygı
- Basit durum değişimleri transition; çok adımlı ve tekrarlayan hareket animation
- Effects & Motion’da sırada: CSS Filters
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek