CSS’te animasyon mantığı: “transition” mı, “@keyframes” mi?
CSS ile hareket ve geçiş efektleri yazmanın iki temel yolu vardır: transition ve animation. İkisi de arayüzü daha anlaşılır gösterebilir; fakat kullanım amaçları farklıdır.
- Transition: Bir öğenin bir durumdan başka bir duruma geçişini yumuşatır. En sık kullanım: :hover, :focus, .is-active gibi durum değişiklikleri.
- @keyframes + animation: Zaman çizelgesi üzerinde birden fazla ara adım tanımlayıp animasyonu bağımsız çalıştırır. Döngüler, “loading” hareketleri, daha kompleks sekanslar için uygundur.
Söz dizimi ve alt özellikler için resmi dokümanlar: MDN: Using CSS transitions ve MDN: CSS animations.
1) Transition ile hover efektleri (en hızlı başlangıç)
Hover efektleri için pratik yaklaşım: normal stile transition ekleyin, :hover içinde hedef değerleri değiştirin.
Örnek 1: Buton hover – renk + hafif yükselme
Copy HTML
<a class="btn" href="https://example.com">Get Started</a>
Copy CSS
.btn {
display: inline-block;
padding: 12px 16px;
border-radius: 10px;
background: #1f6feb;
color: white;
text-decoration: none;
transform: translateY(0);
transition: transform 180ms ease, background-color 180ms ease;
}
.btn:hover {
background: #1858c7;
transform: translateY(-2px);
}
- Animasyonlanan özellikler: transform, background-color
- Süre / eğri: 180ms, ease
- Tetikleyici: .btn:hover
İpucu: Transition’ı :hover içinde değil, normal sınıfta tanımlamak hover bittiğinde de yumuşak dönüş sağlar (MDN örnek yaklaşımıyla uyumludur).
Örnek 2: Kart hover – gölge + ölçek
Not (performans): web.dev, bazı özelliklerin animasyon sırasında daha fazla iş (özellikle yeniden boyama veya yerleşim hesapları) tetikleyebileceğini; bu yüzden mümkün olduğunda transform/opacity gibi seçeneklerin tercih edilip değişikliklerin profillenerek doğrulanmasını önerir. (Kaynak: web.dev: Transitions) Box-shadow gibi efektler de öğenin alanı ve cihaz/GPU durumuna göre daha maliyetli olabilir; değerleri hafif tutup gerçek cihazda test edin.
Copy HTML
<div class="card">
<h3>Plan</h3>
<p>Kısa açıklama.</p>
</div>
Copy CSS
.card {
padding: 16px;
border-radius: 14px;
background: #ffffff;
transform: scale(1);
box-shadow: 0 1px 2px rgba(0,0,0,0.08);
transition: transform 200ms ease, box-shadow 200ms ease;
}
.card:hover {
transform: scale(1.02);
box-shadow: 0 10px 24px rgba(0,0,0,0.14);
}
- Animasyonlanan özellikler: transform, box-shadow
- Süre / eğri: 200ms, ease
- Not: Görsel efektler (ör. gölge) bazı senaryolarda daha ağır hissedilebilir; profilleyip test edin (web.dev).
Örnek 3: Link underline animasyonu (background-size yöntemi)
Copy HTML
<a class="u-link" href="https://example.com">Docs</a>
Copy CSS
.u-link {
color: #111827;
text-decoration: none;
background-image: linear-gradient(currentColor, currentColor);
background-repeat: no-repeat;
background-position: 0 100%;
background-size: 0% 2px;
transition: background-size 180ms ease;
}
.u-link:hover {
background-size: 100% 2px;
}
- Animasyonlanan özellik: background-size
- Süre / eğri: 180ms, ease
2) Transition söz dizimi: Ne yazdığınızı bilin
transition kısa gösterimi, birden fazla alt özelliği tek satırda birleştirir (property, duration, timing-function, delay). Detay: MDN: Using CSS transitions.
Okunabilir bir şablon
transition: <property> <duration> <timing-function> <delay>;
- property: Hangi CSS özelliği geçiş yapacak? (örn. transform, opacity, background-color)
- duration: Ne kadar sürecek? (örn. 180ms)
- timing-function: Hız eğrisi (ease, linear, ease-in, ease-out, cubic-bezier(...))
- delay: Başlamadan önce beklenecek süre (opsiyonel)
Timing-function seçimi: küçük bir rehber
- ease: Genel UI geçişlerinde yaygın bir varsayılan.
- ease-out: Hover ile “yaklaşma / yükselme” gibi hareketlerde çoğu zaman doğal hissettirebilir.
- linear: Sürekli akan, tekrar eden hareketlerde (örn. spinner) tutarlı görünür.
3) @keyframes ile animasyon: Zaman çizelgesi kontrolü
Transition “durum değişiminde” çalışır; @keyframes ise animasyonun ara adımlarını tanımlar. Animation özellikleri (duration, timing-function, iteration-count vb.) ile birlikte kullanılır. Detay: MDN: CSS animations.
Örnek 4: Basit pulse (vurgulama) animasyonu
Copy HTML
<span class="badge">New</span>
Copy CSS
@keyframes pulse {
0% { transform: scale(1); opacity: 1; }
70% { transform: scale(1.08); opacity: 0.85; }
100% { transform: scale(1); opacity: 1; }
}
.badge {
display: inline-block;
padding: 6px 10px;
border-radius: 999px;
background: #16a34a;
color: white;
animation: pulse 900ms ease-in-out 0ms 2;
}
- Animasyonlanan özellikler: transform, opacity
- Süre / eğri / tekrar: 900ms, ease-in-out, 2 kez
Örnek 5: Loading spinner (sürekli döngü)
Copy HTML
<div class="spinner" aria-label="Loading"></div>
Copy CSS
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
width: 28px;
height: 28px;
border-radius: 50%;
border: 3px solid rgba(0,0,0,0.15);
border-top-color: rgba(0,0,0,0.55);
animation: spin 800ms linear infinite;
}
- Animasyonlanan özellik: transform: rotate()
- Süre / eğri / tekrar: 800ms, linear, infinite
Örnek 6: Hover ile keyframe tetikleme (isteğe bağlı)
Copy HTML
<span class="icon" aria-label="Icon">*</span>
Copy CSS
@keyframes wiggle {
0% { transform: rotate(0deg); }
25% { transform: rotate(2deg); }
50% { transform: rotate(-2deg); }
75% { transform: rotate(1deg); }
100% { transform: rotate(0deg); }
}
.icon:hover {
animation: wiggle 220ms ease-in-out 0ms 1;
}
- Tetikleyici: .icon:hover
- Süre / eğri / tekrar: 220ms, ease-in-out, 1 kez
4) Transition vs Animation: Hızlı karşılaştırma tablosu
| Konu | transition | @keyframes + animation |
|---|---|---|
| Tetikleme | Durum değişimi (hover/focus/class) | Bağımsız başlatılabilir, döngü olabilir |
| Karmaşıklık | Basit geçişler için ideal | Çok adımlı sekanslar için güçlü |
| Kontrol | Başlangıç-bitiş arasında | 0–100% arası birçok ara kare |
| Tipik kullanım | Hover efektleri, aç/kapa geçişleri | Spinner, pulse, intro/outro, mikro animasyon |
5) Performans: Hangi özellikleri animasyonlamalısınız?
Akıcı animasyon için her karede yapılan iş yükü önemlidir. web.dev, transform ve opacity animasyonlarının çoğu durumda daha elverişli olabildiğini; layout etkileyen değişikliklerin (örn. width/height/top/left) ise ek hesaplamalar tetikleyebileceğini anlatır. Bu nedenle doğru yaklaşım, mümkün oldukça transform/opacity ile çözmek ve sonucu profiling ile doğrulamaktır: web.dev: Transitions.
Pratik kontrol listesi
- Genellikle tercih edilenler: transform (translate/scale/rotate), opacity
- Duruma göre daha maliyetli olabilenler: geniş alanlara uygulanan gölge/efekt türleri (ör. box-shadow) cihaz ve sahne karmaşıklığına göre daha ağır hissedilebilir; küçük değerlerle deneyin ve test edin.
- Layout etkileyenler: width/height/top/left gibi değişimler daha fazla yeniden hesaplama gerektirebilir; gerekiyorsa süreyi kısa tutun ve profilleyin.
En iyi yaklaşım: hedef tarayıcı ve gerçek cihazlarda test etmek; DevTools performans araçlarıyla gözlem yapmaktır.
6) Erişilebilirlik: prefers-reduced-motion ile hareketi azaltın
Animasyonlar bazı kullanıcılar için rahatsız edici olabilir. Bu nedenle prefers-reduced-motion ile animasyon/transition’ları kapatmak veya sadeleştirmek önerilen bir pratiktir: web.dev: Transitions.
Hızlı uygulama örneği
Copy CSS
@media (prefers-reduced-motion: reduce) {
* {
animation: none !important;
transition: none !important;
scroll-behavior: auto !important;
}
}
Not: Bu örnek “genel kapatma” yaklaşımıdır. Üretimde, yalnızca gerekli bileşenlerde azaltma yapmak isteyebilirsiniz.
7) Tarayıcı desteği ve test: Nereden kontrol etmeli?
Transition genel olarak yaygın destek görür; yine de hedef kitlenize göre kontrol etmek iyi bir pratiktir. Can I use: CSS Transitions bu konuda hızlı bir tablo sunar.
- Hedef tarayıcıları belirleyin (özellikle mobil).
- Özelliği Can I Use üzerinden kontrol edin.
- En kritik etkileşimleri gerçek cihazda test edin (hover, focus, dokunmatik davranışlar).
Dokunmatik cihazlarda hover davranışı farklı olabilir; kritik işlevleri yalnızca hover’a bağlamamaya çalışın.
8) Mini “uygula ve öğren” planı (10 dakika)
- Bir buton seçin: .btn sınıfı oluşturun.
- Normal duruma transition ekleyin: transform ve background-color ile başlayın.
- :hover içinde hedef değerleri değiştirin: translateY ve daha koyu bir renk gibi.
- Bir keyframe ekleyin: pulse veya spin gibi.
- prefers-reduced-motion ekleyin: animasyonları azaltıp sayfayı tekrar deneyin.
- Hız eğrisini değiştirin: ease-out ve linear karşılaştırın.
Sonuç
Basit hover efektlerinde transition ile hızlıca temiz bir etkileşim hissi yakalayabilirsiniz. Daha anlatımlı hareketler, döngüler veya çok adımlı sekanslar için @keyframes ve animation devreye girer. Performans ve erişilebilirlik için (özellikle) transform/opacity tercihlerini ve prefers-reduced-motion desteğini ihmal etmeyin.