CSS Animasyon Rehberi: Geçişler, Keyframe'ler ve Performans
CSS animasyonları arayüze hayat verir, görsel geri bildirim sağlar, kullanıcı dikkatini yönlendirir ve unutulmaz deneyimler yaratır. İyi yapıldığında animasyonlar doğal ve sezgisel hissettirir; kötü yapıldığında takılmalara, dikkat dağılmasına ve hatta fiziksel rahatsızlığa neden olur. Bu rehber, geçişler ve keyframe'lerin temellerinden gelişmiş performans optimizasyonu ve erişilebilirliğe kadar her şeyi kapsar ve size akıcı, amaçlı ve kapsayıcı animasyonlar oluşturma bilgisini verir.
CSS Geçişleri ve Animasyonlar
CSS, animasyon oluşturmak için iki farklı mekanizma sunar: geçişler ve animasyonlar. Her birini ne zaman kullanacağınızı anlamak, etkili CSS animasyon çalışmasının temelidir.
CSS Geçişleri
Geçişler, CSS özelliklerinin iki durum arasındaki değişimini canlandırır. Animasyon yapılacak özelliği, animasyon süresini ve yumuşatma eğrisini tanımlarsınız; tarayıcı başlangıç ve bitiş değerleri arasındaki ara değerleri otomatik olarak hesaplar. Geçişler, hover, focus, sınıf ekleme veya JavaScript özellik değişiklikleri gibi durum değişiklikleriyle tetiklenir.
.button {
background: #3b82f6;
transform: scale(1);
transition: background 0.3s ease, transform 0.2s ease;
}
.button:hover {
background: #2563eb;
transform: scale(1.05);
}Geçişler, basit iki durumlu animasyonlar için idealdir. Minimum kod gerektirir, anlaşılması kolaydır ve tarayıcılarda güvenilir şekilde çalışır. Sınırlama, yalnızca iki değer arasında animasyon yapabilmeleridir — ara adımlar tanımlayamazsınız.
CSS Animasyonları (Keyframe)
Animasyonlar, @keyframes kuralını kullanarak isteğe bağlı sayıda adımda stil değişiklikleri dizisi tanımlar. Geçişlerin aksine, animasyonlar durum değişikliklerinden bağımsız olarak çalışabilir, sonsuz döngü yapabilir, tersine oynatılabilir ve duraklatılabilir. Animasyonun her karesi üzerinde hassas kontrol sağlarlar.
@keyframes pulse {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.05);
opacity: 0.8;
}
100% {
transform: scale(1);
opacity: 1;
}
}
.pulse-element {
animation: pulse 2s ease-in-out infinite;
}Hangisini Ne Zaman Kullanmalı
| Senaryo | Geçiş Kullan | Animasyon Kullan |
|---|---|---|
| Hover Efekti | Evet | Hayır |
| Focus Durumu | Evet | Hayır |
| Görünürlük Değişimi | Evet | Belki |
| Çok Adımlı Dizi | Hayır | Evet |
| Döngü Animasyonu | Hayır | Evet |
| Durumdan Bağımsız | Hayır | Evet |
| Giriş Animasyonu | Belki | Evet |
Keyframe Sözdizimi Derinlemesine
@keyframes kuralı, CSS animasyonlarının kalbidir. Sözdizimini tam olarak anlamak, çok adımlı animasyon dizilerinin tüm gücünü ortaya çıkarır.
Yüzde Tabanlı Keyframe'ler
Keyframe'ler, animasyon zaman çizelgesindeki ilerlemeyi temsil eden %0'dan %100'e kadar yüzde değerleri kullanılarak tanımlanır. İhtiyacınız kadar keyframe tanımlayabilirsiniz; tarayıcı bunlar arasında ara değer hesaplar:
@keyframes bounce {
0%, 100% {
transform: translateY(0);
}
25% {
transform: translateY(-20px);
}
50% {
transform: translateY(0);
}
75% {
transform: translateY(-10px);
}
}Birden fazla keyframe, yukarıdaki örnekteki 0%, 100% gibi virgülle ayrılmış yüzde değerleriyle aynı stil bloğunu paylaşabilir. Bu, başlangıç durumuna dönen animasyonlar için kullanışlıdır.
Animasyon Kısayol Özelliği
animation kısayol özelliği, sekiz alt özelliği tek bir bildirimde birleştirir. Sıralama şöyledir: name, duration, timing-function, delay, iteration-count, direction, fill-mode ve play-state.
.element {
animation: slideIn 0.5s ease-out 0.2s 1 forwards running;
}
/* Equivalent longhand */
.element {
animation-name: slideIn;
animation-duration: 0.5s;
animation-timing-function: ease-out;
animation-delay: 0.2s;
animation-iteration-count: 1;
animation-direction: normal;
animation-fill-mode: forwards;
animation-play-state: running;
}Animasyon Doldurma Modu
animation-fill-mode özelliği, animasyon çalışmadan önce ve sonra hangi stillerin uygulanacağını kontrol eder. Bu, en sık yanlış anlaşılan animasyon özelliklerinden biridir:
- none (varsayılan): Animasyon bittiğinde öğe animasyon öncesi stillerine döner.
- forwards: Animasyon bittikten sonra öğe son karenin stillerini korur. Giriş animasyonlarında öğenin son konumunda kalmasını istediğiniz durumlar için kritiktir.
- backwards: Animasyon gecikmesi sırasında (animasyon başlamadan önce), öğe ilk karenin stillerini uygular.
- both: forwards ve backwards davranışlarını birleştirir. Öğe gecikme sırasında ilk kareyi gösterir, tamamlandıktan sonra son kareyi korur.
Yumuşatma Fonksiyonları
Yumuşatma fonksiyonları (timing functions olarak da bilinir), animasyonun ivme eğrisini tanımlar. Animasyonun yavaş başlayıp hızlanmasını mı, hızlı başlayıp yavaşlamasını mı, yoksa daha karmaşık bir desen izlemesini mi belirler. Doğru yumuşatma fonksiyonu animasyonu doğal hissettirir; yanlış olanı mekanik veya sert hissettirir.
Yerleşik Yumuşatma Fonksiyonları
- linear: Animasyon boyunca sabit hız. Gerçek dünyadaki nesneler sabit hızda hareket etmediği için nadiren doğal görünür. Mekanik veya döndürme animasyonları için uygundur.
- ease (varsayılan): Yavaş başlar, ortada hızlanır, sonunda yavaşlar. Çoğu UI geçişi için iyi bir genel amaçlı yumuşatmadır.
- ease-in: Yavaş başlar sonra hızlanır. 'Momentum kazanma' hissi yaratır. Öğelerin ekrandan çıkması veya düşmesi için uygundur.
- ease-out: Hızlı başlar sonra yavaşlar. 'Yerine oturma' hissi yaratır. UI öğelerinin ekrana girmesi için en sık kullanılan yumuşatmadır.
- ease-in-out: Yavaş başlar ve biter, ortada daha hızlıdır. ease'e benzer ancak hızlanma ve yavaşlama daha belirgindir. Daha büyük, daha dramatik geçişler için uygundur.
Kübik Bezier Eğrileri
cubic-bezier() fonksiyonu, hassas kontrolle özel yumuşatma eğrileri tanımlamanıza olanak tanır. Kübik bezier eğrisinin kontrol noktalarını temsil eden dört parametre alır: cubic-bezier(x1, y1, x2, y2). x değerleri zamanı (0-1), y değerleri ilerlemeyi (aşma efekti için 0-1 aralığının dışına çıkabilir) temsil eder.
.element {
/* Smooth deceleration - great for entrances */
transition: transform 0.3s cubic-bezier(0.0, 0.0, 0.2, 1.0);
/* Smooth acceleration - great for exits */
transition: transform 0.2s cubic-bezier(0.4, 0.0, 1, 1);
/* Material Design standard easing */
transition: transform 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
}Adım Fonksiyonları
steps() fonksiyonu, yumuşak ara değer hesaplama yerine ayrık kare kare animasyon oluşturur. Bu, sprite animasyonları veya 'daktilo' efekti oluşturmak için kullanışlıdır:
@keyframes typing {
from { width: 0; }
to { width: 100%; }
}
.typing-effect {
animation: typing 3s steps(40, end);
overflow: hidden;
white-space: nowrap;
}Performans Optimizasyonu
Akıcı animasyonlar saniyede 60 kare (fps) gerektirir, bu da her karenin 16,67 milisaniye içinde tamamlanması gerektiği anlamına gelir. Bu bütçeyi karşılayamamak, görünür takılmalara — ekran titremesi, kare atlama ve bozulmuş kullanıcı deneyimine — yol açar. Tarayıcı render pipeline'ını anlamak, yüksek performanslı animasyonlar yazmanın anahtarıdır.
Render Pipeline
Bir CSS özelliği değiştiğinde, tarayıcı ekranı güncellemek için en fazla üç aşamadan geçer:
- Stil: Hangi CSS kurallarının hangi öğelere uygulanacağını belirler.
- Layout: Her öğenin boyutunu ve konumunu hesaplar. width, height, margin, padding, top, left, font-size ve diğer geometri özelliklerindeki değişikliklerle tetiklenir.
- Paint: Her öğe için pikselleri doldurur. color, background, box-shadow, border-radius ve diğer görsel özelliklerdeki değişikliklerle tetiklenir.
- Composite: Boyalı katmanları doğru sırada birleştirir. Yalnızca bu adım GPU'da çalışır. transform ve opacity değişiklikleriyle tetiklenir.
Yalnızca compositing adımını tetikleyen animasyonlar en iyi performansı gösterir, çünkü layout ve paint adımlarını tamamen atlarlar. Bu nedenle transform ve opacity, yüksek performanslı CSS animasyonlarının altın standardıdır.
Yalnızca Compositor Özellikleri
| Özellik | Layout Tetikler? | Paint Tetikler? | GPU Composite? |
|---|---|---|---|
| transform | Hayır | Hayır | Evet |
| opacity | Hayır | Hayır | Evet |
| filter | Hayır | Evet | Bazen |
| top / left | Evet | Evet | Hayır |
| width / height | Evet | Evet | Hayır |
| margin / padding | Evet | Evet | Hayır |
| background-color | Hayır | Evet | Hayır |
| box-shadow | Hayır | Evet | Hayır |
will-change Kullanımı
will-change özelliği, tarayıcıya hangi özelliklerin değişmesinin beklendiğini söyler ve öğeyi kendi compositor katmanına yükselterek önceden optimize etmesine olanak tanır. Ancak, dikkatli kullanılmalıdır:
/* Apply will-change just before the animation */
.element:hover {
will-change: transform;
}
/* Remove it after the animation completes */
.element {
transition: transform 0.3s ease;
}will-change'in yaygın hataları arasında çok fazla öğeye uygulamak (her compositor katmanı GPU belleği tüketir) ve kalıcı olarak tutmak (kaynakları boşa harcar) bulunur. İyi uygulama, animasyon başlamadan önce JavaScript ile will-change eklemek ve animasyon bittikten sonra kaldırmaktır.
Layout Özellikleri Yerine Transform Kullanma
En etkili performans optimizasyonu, layout'u tetikleyen özellikleri transform ile değiştirmektir:
- left: 100px yerine transform: translateX(100px) kullanın
- top: 50px yerine transform: translateY(50px) kullanın
- width: 150%; height: 150% yerine transform: scale(1.5) kullanın
- Layout ile döndürme yerine transform: rotate(45deg) kullanın
Yaygın Animasyon Desenleri
Belirli animasyon desenleri web arayüzlerinde tekrar tekrar ortaya çıkar. Bu desenlerde ustalaşmak, size en yaygın UI animasyon ihtiyaçları için bir araç seti sağlar.
1. Fade In
En basit ve en çok yönlü giriş animasyonu. Öğe saydamdan opağa geçiş yapar:
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.fade-in {
animation: fadeIn 0.4s ease-out forwards;
}2. Yukarı Kayarak Fade In
Dikey hareket ve opaklık değişimini birleştiren daha dinamik bir giriş efekti. Bu, öğenin aşağıdan geldiği hissini yaratır:
@keyframes slideUpFade {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.slide-up {
animation: slideUpFade 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}3. Hover'da Büyüme
Hover'da hafif bir ölçek artışı, tatmin edici bir etkileşim geri bildirimi sağlar:
.card {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card:hover {
transform: translateY(-4px) scale(1.02);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}4. Kademeli Liste Animasyonu
Bir öğe listesi göründüğünde, her öğe için kademeli animasyon gecikmesi ayarlamak, bakışı yönlendiren bir çağlayan efekti oluşturur:
.list-item {
opacity: 0;
transform: translateY(10px);
animation: slideUpFade 0.3s ease-out forwards;
}
.list-item:nth-child(1) { animation-delay: 0.0s; }
.list-item:nth-child(2) { animation-delay: 0.05s; }
.list-item:nth-child(3) { animation-delay: 0.1s; }
.list-item:nth-child(4) { animation-delay: 0.15s; }
.list-item:nth-child(5) { animation-delay: 0.2s; }Dinamik listeler için, her öğenin indeksine göre animation-delay ayarlamak üzere JavaScript kullanın veya CSS özel özelliklerini kullanın: style="animation-delay: calc(var(--i) * 0.05s)".
5. Yükleme Döndürücüsü
Pürüzsüz sürekli döndürme, klasik yükleme göstergesidir:
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
width: 24px;
height: 24px;
border: 3px solid rgba(255, 255, 255, 0.2);
border-top-color: #3b82f6;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}Animasyon Erişilebilirliği: prefers-reduced-motion
Tüm kullanıcılar animasyondan faydalanmaz. Vestibüler bozuklukları, hareket hassasiyeti veya belirli bilişsel durumları olan kişiler için animasyonlar baş dönmesine, mide bulantısına veya nöbetlere neden olabilir. prefers-reduced-motion medya sorgusu, kullanıcının sistem düzeyindeki azaltılmış animasyon tercihine saygı duymanızı sağlar.
Azaltılmış Animasyonu Uygulama
Önerilen yaklaşım, animasyonları azaltılmış animasyon tercihi ayarlanmamış kullanıcılar için etkinleştirmektir:
/* Default: no animation for users who prefer reduced motion */
.element {
opacity: 1;
transform: none;
}
/* Only animate for users who have no motion preference */
@media (prefers-reduced-motion: no-preference) {
.element {
animation: slideUpFade 0.5s ease-out forwards;
}
}Alternatif olarak, azaltılmış animasyon tercih eden kullanıcılar için belirli animasyonları devre dışı bırakabilirsiniz:
.element {
animation: slideUpFade 0.5s ease-out forwards;
}
@media (prefers-reduced-motion: reduce) {
.element {
animation: none;
opacity: 1;
transform: none;
}
/* Keep functional transitions but shorten duration */
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}Neleri Korumalı ve Neleri Kaldırmalı
Kullanıcı azaltılmış animasyon tercih ettiğinde, tüm animasyonlar kaldırılmamalıdır. Anlam veya durum ileten işlevsel animasyonlar korunmalı, sadece basitleştirilmelidir:
- Kaldırın: Dekoratif animasyonlar, parallax kaydırma, otomatik oynatılan carousel'ler, nabız efektleri ve döngü arka plan animasyonları.
- Basitleştirin: Geçiş süreleri, durum değişikliklerinin hala algılanabilir olması için tamamen kaldırmak yerine neredeyse anlık (0,01ms) olacak şekilde kısaltılmalıdır.
- Koruyun: İşlevsel durum geçişleri (hover, focus, active durumları), ilerleme göstergeleri ve önemli bilgi ileten tüm animasyonlar.
Animasyon Kütüphaneleri
CSS animasyonları çoğu UI ihtiyacını karşılarken, JavaScript animasyon kütüphaneleri fizik tabanlı hareket, kaydırma bağlantılı animasyonlar ve karmaşık dizilerin orkestrasyonu gibi gelişmiş özellikler sunar.
CSS Öncelikli Kütüphaneler
- Animate.css: Önceden oluşturulmuş CSS animasyon sınıfları koleksiyonu. Öğelere sınıf adı ekleyerek animasyon uygulayın. Hızlı prototipleme için iyidir, ancak aşırı kullanılırsa tek tip animasyonlara yol açabilir.
- Hamburgers: Tamamı saf CSS ile gerçekleştirilmiş animasyonlu hamburger menü simgesi geçişleri koleksiyonu.
JavaScript Animasyon Kütüphaneleri
- Framer Motion: Yay fiziği, layout animasyonları ve jest desteği sunan bildirimsel animasyon API'sine sahip React animasyon kütüphanesi. React uygulamaları için en iyi seçim.
- GSAP (GreenSock): En güçlü JavaScript animasyon kütüphanesi. Hassas zaman çizelgesi kontrolü, karmaşık yumuşatma, SVG morphing ve kaydırma tetiklemeli animasyonlar sunar. Büyük markalar tarafından pazarlama siteleri ve etkileşimli deneyimler için kullanılır.
- Anime.js: Temiz bir API'ye sahip hafif JavaScript animasyon kütüphanesi. CSS özelliklerini, SVG, DOM özelliklerini ve JavaScript nesnelerini destekler. CSS ve GSAP arasında iyi bir orta seçenek.
- Motion One: Web Animations API üzerine inşa edilmiş modern hafif animasyon kütüphanesi. Minimal API, yay fiziği ve zaman çizelgeleri sunar.
Ne Zaman JavaScript vs CSS Kullanmalı
CSS, durum değişikliklerine yanıt veren basit bildirimsel animasyonlar için kullanılır. JavaScript ise şunlar için: fizik tabanlı hareket (yay, momentum), kaydırma bağlantılı animasyonlar, hassas zamanlama kontrolüne sahip karmaşık diziler, çalışma zamanında hesaplanan dinamik animasyon parametreleri veya programatik olarak duraklatılması, tersine çevrilmesi veya sürüklenmesi gereken animasyonlar.
Animasyon Hata Ayıklama
Animasyon hataları incelikli ve teşhis edilmesi zor olabilir. Doğru hata ayıklama araçları ve teknikleri süreci daha verimli hale getirir.
Chrome DevTools Animasyon Paneli
Chrome DevTools, güçlü hata ayıklama özellikleri sağlayan özel bir animasyon paneli içerir:
- Zaman Çizelgesi Görünümü: Sayfadaki tüm aktif animasyonları süreleri, gecikmeleri ve keyframe'leriyle birlikte görüntüleyin.
- Oynatma Kontrolleri: Animasyonları 1/4 hıza yavaşlatın, duraklatın veya zaman çizelgesinde kare kare sürükleyin.
- Özellik İnceleme: Her keyframe'deki tam CSS özelliklerini ve değerlerini görmek için zaman çizelgesindeki bir animasyona tıklayın.
- Canlı Düzenleme: Sayfayı yeniden yüklemeden animasyon süresini, gecikmesini ve yumuşatmayı gerçek zamanlı olarak değiştirin.
Performans Profili Oluşturma
Animasyon takılmalarını belirlemek için Chrome DevTools'daki Performance panelini kullanın:
- Animasyon çalışırken performans kaydı alın
- 16,67ms bütçesini aşan kareleri bulun (kare grafiğinde kırmızı çubuklar olarak gösterilir)
- Animasyon karelerinde, layout'u tetikleyen özellikleri belirten 'Layout' işlemlerini kontrol edin
- Paint flashing'i (yeniden boyanan alanları yeşil olarak gösterir) ve Layer borders'ı (compositor katmanlarını gösterir) etkinleştirmek için 'Rendering' sekmesini kullanın
Yaygın Hata Ayıklama Senaryoları
- Animasyon çalışmıyor: animation-fill-mode'un doğru ayarlandığını kontrol edin. forwards veya both olmadan, öğe animasyon öncesi duruma döner. Ayrıca öğenin doğru boyutlara sahip olduğunu doğrulayın — transform: scale(0) öğeyi görünmez yapar ancak hala mevcuttur.
- Animasyon takılıyor: Uzun kareleri bulmak için Performance panelini açın. Layout'u tetikleyen özellikleri animasyon yapıp yapmadığınızı kontrol edin. transform ve opacity'ye geçin.
- Animasyon gecikmesi yanlış hissediliyor: animation-delay'in animasyon başlamadan önce bir boşluk oluşturduğunu unutmayın. Bu boşluk sırasında, animation-fill-mode: backwards veya both ayarlanmadığı sürece öğe animasyon öncesi durumu gösterir.
- Animasyon Chrome'da çalışıyor ancak Safari'de çalışmıyor: Safari, animation kısayolu için daha katı ayrıştırma kurallarına sahiptir. Tüm değerlerin doğru sırada olduğundan ve desteklenmeyen özellikler kullanmadığınızdan emin olun.
CSS mi kullanıyorsunuz? Stil sayfalarınızı üretim için biçimlendirmek, sıkıştırmak ve optimize etmek için ücretsiz CSS araçlarımızı deneyin.
CSS FormatlayıcıCSS SıkıştırıcıSıkça Sorulan Sorular
CSS geçişlerini mi yoksa CSS animasyonlarını mı kullanmalıyım?
CSS geçişleri, hover efektleri, focus durumları ve görünürlük değişimleri gibi A noktasından B noktasına basit durum değişiklikleri içindir. CSS animasyonları (keyframe), karmaşık çok adımlı diziler, döngü animasyonları veya durum değişikliklerinden bağımsız çalışması gereken animasyonlar içindir. Geçişler daha basittir; animasyonlar daha fazla kontrol sunar.
Performans için animasyon yapması güvenli CSS özellikleri nelerdir?
Animasyon performansı için en iyi özellikler transform ve opacity'dir, çünkü tamamen GPU compositor tarafından işlenebilir ve layout veya paint tetiklemez. width, height, margin ve top gibi diğer özellikler layout yeniden hesaplamasını tetikler ve çok maliyetlidir. Her zaman left yerine transform: translateX(), width/height değişiklikleri yerine transform: scale() kullanmayı tercih edin.
Animasyona duyarlı kullanıcılar için erişilebilirliği nasıl sağlarım?
İşletim sisteminde 'animasyonu azalt' ayarını etkinleştirmiş kullanıcılar için animasyonları devre dışı bırakmak veya basitleştirmek üzere prefers-reduced-motion medya sorgusunu kullanın. Gerekli olmayan animasyonları @media (prefers-reduced-motion: no-preference) içine sarın ve azaltılmış animasyon tercih eden kullanıcılar için yedek olarak anlık durum değişiklikleri sağlayın.
will-change nedir ve ne zaman kullanılmalıdır?
will-change, tarayıcıya gelecekte hangi özelliklerin değişeceğini bildiren ve önceden optimize etmesine olanak tanıyan bir CSS özelliğidir. Dikkatli kullanın, yalnızca performans sorunları gözlemlediğinizde uygulayın. Animasyon başlamadan önce uygulayın ve animasyon bittikten sonra kaldırın. will-change'i aşırı kullanmak GPU belleğini boşa harcar ve aslında performansa zarar verebilir.
CSS animasyonlarını nasıl hata ayıklarım?
Chrome DevTools, güçlü animasyon hata ayıklama araçları sunar. Tüm aktif animasyonları görüntülemek, zaman çizelgesini sürüklemek, süre ve gecikmeyi gerçek zamanlı değiştirmek ve animasyonları 1/4 hıza yavaşlatmak için Animasyonlar panelini (Diğer Araçlar menüsünde) açın. Animasyon takılmalarını ve layout thrashing'i belirlemek için Performance panelini de kullanabilirsiniz.