
CSS animasyonları, bir öğenin görsel özelliklerini zaman içinde değiştirmek için kullanılır. Basit durumlar için transition, daha karmaşık hareketler için ise @keyframes ile tanımlanan animasyonlar uygundur. Keyframes ile animasyonun ara adımlarını ve zamanlamasını belirleyebilirsiniz; bu konuda MDN detaylı teknik bilgi sağlar (MDN - animation-name).
Transition, bir CSS özelliğinin iki durum arasındaki değişimini yumuşatmak için idealdir. Basit hover efektleri (renk, opaklık, transform gibi) için transition kısa, performans dostu ve anlaşılır bir seçenektir.
/* HTML */
<button class="btn">Hover</button>
/* CSS */
.btn {
display: inline-block;
padding: 10px 16px;
background: #0b5fff;
color: #fff;
border-radius: 6px;
transition: transform 200ms ease, background-color 200ms ease;
}
.btn:hover {
transform: translateY(-4px) scale(1.03);
background-color: #084fe0;
}
Bu örnekte sadece transform ve background-color animasyonu uygulanıyor; böylece gereksiz layout yeniden hesaplamaları azaltılır.
@keyframes kullanarak animasyon başlangıç, ara ve bitiş noktalarını tanımlarsınız. Aşağıda üç temel örnek var.
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.pulse { animation: pulse 1.2s ease-in-out infinite; }
@keyframes slideIn {
from { transform: translateX(-100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
.slide-in { animation: slideIn 400ms ease forwards; }
@keyframes rotateIn {
0% { transform: rotate(-15deg); opacity: 0; }
100% { transform: rotate(0); opacity: 1; }
}
.rotate-in { animation: rotateIn 350ms cubic-bezier(.2,.8,.2,1) forwards; }
Keyframes tabanlı bir animasyonu doğrudan :hover ile başlatmak yaygındır. Ancak bazı durumlarda animasyon her hover’da yeniden başlatıldığında görsel yanıp sönme (flicker) veya beklenmeyen sıçramalar görülebilir; bu tip davranışlar için geliştiriciler farklı çözümler tartışmıştır (örnekler ve çözümler için bakınız: Stack Overflow örneği, flicker tartışması).
Yaygın çözümler:
Animasyon performansını iyileştirmek için genel kural, yalnızca kompozit aşamasında işlenebilen özellikleri animasyonlamak; örneğin transform ve opacity genellikle daha az maliyetlidir. Layout veya repaint gerektiren özellikleri (ör. width, height, margin) sık sık animasyonlamak maliyetli olabilir. Bu tür en iyi uygulamalar MDN'de de önerilmektedir (MDN animasyon belgeleri).
Ek olarak, daha ince kontrol gerektiğinde animation-composition gibi modern özellikleri inceleyebilirsiniz; bu özellik animasyonun nasıl birleştirileceğini kontrol eder, fakat tarayıcı desteğine dikkat etmek gerekir.
Hareketi rahatsız edici bulan kullanıcılar olabilir. CSS'de prefers-reduced-motion medya sorgusu ile bu kullanıcı tercihlerini algılayıp animasyonları azaltabilir veya kapatabilirsiniz. Örnek:
@media (prefers-reduced-motion: reduce) {
.animated { animation: none !important; transition: none !important; }
}
Bu yaklaşım, hareket hassasiyeti olan kullanıcıların deneyimini iyileştirir.
Aşağıda hover ile yukarı kalkma, gölge verme ve hafif bir pulse efekti gösteren basit bir kart örneği var. Adımlar: HTML oluştur, temel stilleri ekle, hover için transition ayarla, isteğe bağlı pulse animasyonunu ekle.
/* HTML */
<div class="card"><h3>Başlık</h3><p>Kısa açıklama</p></div>
/* CSS */
.card {
width: 280px;
padding: 18px;
background: #fff;
border-radius: 10px;
box-shadow: 0 6px 18px rgba(0,0,0,0.08);
transition: transform 220ms ease, box-shadow 220ms ease;
}
.card:hover {
transform: translateY(-8px);
box-shadow: 0 18px 36px rgba(0,0,0,0.12);
}
/* isteğe bağlı: hover sırasında hafif pulse */
@keyframes smallPulse { 0%{transform:translateY(-8px) scale(1);}50%{transform:translateY(-9px) scale(1.01);}100%{transform:translateY(-8px) scale(1);} }
.card:hover { animation: smallPulse 800ms ease forwards; }
Bu örnekte transition ile temel hareket sağlanırken, küçük bir keyframes animasyonu hover süresince ekjerlenebilir. Karmaşıklığı abartmadan, kullanıcı deneyimini destekleyecek küçük dokunuşlar tercih edin.
Tarayıcı geliştirici araçlarını kullanarak animasyonun hangi adımda ne kadar CPU/paint ürettiğini gözlemleyin. Farklı tarayıcılarda test etmek önemlidir; bazı CSS özellikleri tarayıcılar arasında farklı davranabilir. Eğer hover ile tetiklenen animasyonlarda yanıp sönme görürseniz, yukarıda bahsedilen animation-fill-mode ve iteration-count çözümlerini deneyin veya transition’a dönmeyi değerlendirin (Stack Overflow tartışmaları yol gösterici olabilir).
Sonuç: Basit hover efektleri için transition çoğu durumda yeterlidir; karmaşık zamanlamalar veya ardışık hareketler için @keyframes kullanın. Performans ve erişilebilirlik en baştan düşünülmeli; MDN dökümantasyonundaki öneriler ve tarayıcı testleri bu süreçte yol gösterir (MDN, animation-composition). Daha ileri sorunlar için Stack Overflow başlıkları pratik çözümler sunuyor.
Kaynaklar/okuma için öneriler: MDN animasyon belgeleri ve ilgili Stack Overflow tartışmaları.
Yorumlar