Statik sayfalar profesyonel görünmez. Modern UX, mikro etkileşimler ve akıcı geçişler ile algıyı yumuşatır. Bu gün CSS’in hareketle ilgili tüm araçlarını öğreneceğiz.
1. Transition — Durum Değişimleri
transition, bir CSS değerinin başka değere geçişini animasyonlu yapar.
.btn {
background: #1a1a1a;
color: white;
padding: 12px 24px;
transition: background 0.2s ease;
}
.btn:hover {
background: #a6e22e;
color: black;
}
Tam Sözdizimi
transition: <özellik> <süre> <timing> <delay>;
.card {
transition: transform 0.3s ease 0.1s;
/* özellik: transform | süre: 0.3s | timing: ease | delay: 0.1s */
}
Birden Fazla Özellik
Virgülle ayır:
.card {
transition:
transform 0.3s ease,
box-shadow 0.4s ease,
border-color 0.2s ease;
}
Tüm özellikler için tek transition:
transition: all 0.3s ease; /* kolay ama performans riskli */Production’da spesifik özellikleri belirtmek daha iyidir.
2. Timing Fonksiyonları
Animasyonun hızının zamanla değişimi:
| Fonksiyon | Davranış |
|---|---|
linear | Sabit hız |
ease | Hızlı başlar, yumuşar (varsayılan) |
ease-in | Yavaş başlar, hızlanır |
ease-out | Hızlı başlar, yavaşlar |
ease-in-out | İkisi de |
cubic-bezier(...) | Tam kontrol |
cubic-bezier ile Özel Eğri
.card {
transition: transform 0.4s cubic-bezier(0.2, 0.8, 0.2, 1);
}
Bu “yumuşak başlangıç + hızlı orta + yumuşak biten” bir geçiş — modern UI’da klasik. cubic-bezier.com sitesinden görsel olarak oluşturabilirsin.
steps()
Animasyonu adımlı yapar (caret blink, loading dots için):
.cursor {
animation: blink 1s steps(2) infinite;
}
@keyframes blink {
to { opacity: 0; }
}
3. Transform — 2D/3D Dönüşümler
transform, elementin layout’unu etkilemeden görsel olarak hareket
ettirir. GPU-friendly, çok performanslı.
2D Dönüşümler
.box {
transform: translateX(20px); /* sağa kaydır */
transform: translateY(-10px); /* yukarı */
transform: translate(20px, -10px); /* ikisi */
transform: scale(1.1); /* %10 büyüt */
transform: scaleX(2); /* yatay 2x */
transform: rotate(45deg);
transform: skew(10deg, 5deg);
}
Birden Fazla Aynı Anda
.card:hover {
transform: translateY(-4px) scale(1.02) rotate(-1deg);
}
transform-origin
Dönüşümün referans noktası. Varsayılan: merkez.
.flip {
transform-origin: top left;
transform: rotate(45deg);
}
3D Dönüşümler
.flipper {
transform-style: preserve-3d;
transform: rotateY(180deg);
perspective: 1000px;
}
Önemli: Transform Performansı
transform ve opacity tarayıcı tarafından GPU’da işlenir.
Diğer özellikler (örn. top, left, width) reflow tetikler — yavaş.
/* ✗ Kötü — reflow tetikler */
.box:hover { left: 100px; }
/* ✓ İyi — GPU'da kayar */
.box:hover { transform: translateX(100px); }
4. Keyframe Animasyonları
@keyframes ile çok aşamalı animasyonlar tanımlanır.
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.hero {
animation: fadeInUp 0.8s ease forwards;
}
Birden Fazla Adım
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.dot {
animation: pulse 2s ease-in-out infinite;
}
Animation Tam Sözdizimi
animation: <ad> <süre> <timing> <delay> <iteration> <direction> <fill-mode>;
.spinner {
animation: spin 1.2s linear infinite;
}
Önemli parametreler:
iteration-count—infiniteveya sayıdirection—normal,reverse,alternate,alternate-reversefill-mode—forwards(son hali korur),backwards,bothplay-state—running,paused(JS ile kontrol)
5. will-change ile Performans Optimizasyonu
will-change, tarayıcıya “bu element animasyonlanacak” der —
önceden GPU’ya yükler.
.card {
will-change: transform, opacity;
}
.card:hover {
transform: translateY(-4px);
}
Dikkat:
will-change’i dikkatsizce kullanma. Bellek harcar. Sadece gerçekten animasyonlanacak elementlerde, ve animasyon bitince JS ile kaldırırsan ideal.
6. prefers-reduced-motion
Bazı kullanıcılar azaltılmış hareket tercih eder (vestibular bozukluk gibi sebeplerle). Modern site bunu mutlaka desteklemeli:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
Bu kuralı CSS’inin başına koy. Erişilebilirlik puanın yükselir, kullanıcılar minnetli olur.
Mini Proje 1: Smooth Hover Card
<div class="card">
<h3>Başlık</h3>
<p>Açıklama</p>
</div>
.card {
padding: 24px;
background: #1a1a1a;
border: 1px solid #2a2a2a;
border-radius: 12px;
cursor: pointer;
transition:
transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1),
border-color 0.3s ease,
box-shadow 0.4s ease;
}
.card:hover {
transform: translateY(-4px);
border-color: #a6e22e;
box-shadow: 0 12px 32px rgba(166, 226, 46, 0.15);
}
.card h3 {
margin: 0 0 8px;
transition: color 0.2s ease;
}
.card:hover h3 {
color: #a6e22e;
}
Mini Proje 2: Loading Spinner
<div class="spinner"></div>
.spinner {
width: 40px;
height: 40px;
border: 3px solid #2a2a2a;
border-top-color: #a6e22e;
border-radius: 50%;
animation: spin 0.9s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
Mini Proje 3: Staggered Reveal
Birden fazla elementi sırayla animasyonlu göster:
.item {
opacity: 0;
animation: fadeInUp 0.6s ease forwards;
}
.item:nth-child(1) { animation-delay: 0.0s; }
.item:nth-child(2) { animation-delay: 0.1s; }
.item:nth-child(3) { animation-delay: 0.2s; }
.item:nth-child(4) { animation-delay: 0.3s; }
.item:nth-child(5) { animation-delay: 0.4s; }
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
Pratik Sorular
Soru 1: Bir buton’un hem arka plan hem scale geçişi olsun, ikisi farklı sürelerde.
.btn {
transition:
background 0.15s ease,
transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.btn:hover {
background: #a6e22e;
transform: scale(1.05);
}
Soru 2: Bir sayfanın tüm hover animasyonları, kullanıcı azaltılmış hareket istediğinde anında gerçekleşsin.
@media (prefers-reduced-motion: reduce) {
* {
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
}
}
Soru 3: Bir kart sürekli hafifçe yukarı-aşağı sallansın (idle animasyon).
.floating {
animation: float 3s ease-in-out infinite;
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-6px); }
}
Günün Özeti
Bugün sayfalara hayat katmayı öğrendik:
- Transition ile durum geçişleri
- Timing fonksiyonları ve cubic-bezier
- Transform ile GPU-friendly hareketler
- Keyframe animasyonları
- Performans kuralları (transform/opacity tercih, will-change)
prefers-reduced-motionile erişilebilirlik
Yarın Gün 5’te modern responsive CSS’a bakacağız — custom properties, container queries, dark mode, ve tam responsive landing page.