ToolHub
View All Posts

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ı

SenaryoGeçiş KullanAnimasyon Kullan
Hover EfektiEvetHayır
Focus DurumuEvetHayır
Görünürlük DeğişimiEvetBelki
Çok Adımlı DiziHayırEvet
Döngü AnimasyonuHayırEvet
Durumdan BağımsızHayırEvet
Giriş AnimasyonuBelkiEvet

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:

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ı

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:

  1. Stil: Hangi CSS kurallarının hangi öğelere uygulanacağını belirler.
  2. Layout: Her öğenin boyutunu ve konumunu hesaplar. width, height, margin, padding, top, left, font-size ve diğer geometri özelliklerindeki değişikliklerle tetiklenir.
  3. Paint: Her öğe için pikselleri doldurur. color, background, box-shadow, border-radius ve diğer görsel özelliklerdeki değişikliklerle tetiklenir.
  4. 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

ÖzellikLayout Tetikler?Paint Tetikler?GPU Composite?
transformHayırHayırEvet
opacityHayırHayırEvet
filterHayırEvetBazen
top / leftEvetEvetHayır
width / heightEvetEvetHayır
margin / paddingEvetEvetHayır
background-colorHayırEvetHayır
box-shadowHayırEvetHayı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:

Performans Kuralı: Aynı görsel efekti transform veya opacity ile elde edebiliyorsanız, her zaman layout veya paint tetikleyen özellikler yerine bunları tercih edin. Bu ilke, çoğu animasyon performans sorununu ortadan kaldırır.

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:

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

JavaScript Animasyon Kütüphaneleri

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:

Performans Profili Oluşturma

Animasyon takılmalarını belirlemek için Chrome DevTools'daki Performance panelini kullanın:

Yaygın Hata Ayıklama Senaryoları

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.