Halo teman-teman! 👋
Di artikel terakhir seri CSS ini, kita akan membahas salah satu topik paling seru: Animations & Transitions. Dengan CSS, kita bisa bikin elemen web bergerak, berubah warna, memutar, hingga efek-efek keren lainnya — tanpa JavaScript!
Yuk, kita mulai! 🚀
Apa itu Transitions?
CSS Transitions memungkinkan kamu membuat perubahan properti CSS secara gradual (bertahap) dari nilai awal ke nilai akhir. Jadi perubahan terjadi halus, bukan tiba-tiba.
/* Syntax dasar transition */
.element {
transition: property duration timing-function delay;
}
/* Contoh */
.card {
background-color: #3498db;
transition: background-color 0.3s ease;
}
.card:hover {
background-color: #e74c3c;
}
Properti Transition
.button {
/* shorthand: property duration timing-function delay */
transition: all 0.3s ease-in-out 0s;
/* atau property per property */
transition-property: transform, opacity;
transition-duration: 0.3s, 0.5s;
transition-timing-function: ease;
transition-delay: 0s, 0.1s;
}
Timing Functions
Timing function mengatur kecepatan transisi:
/* ease - default, lambat di awal & akhir */
.box {
transition: transform 0.3s ease;
}
/* linear - kecepatan konstan */
.box {
transition: transform 0.3s linear;
}
/* ease-in - lambat di awal */
.box {
transition: transform 0.3s ease-in;
}
/* ease-out - lambat di akhir */
.box {
transition: transform 0.3s ease-out;
}
/* ease-in-out - lambat di awal dan akhir */
.box {
transition: transform 0.3s ease-in-out;
}
/* cubic-bezier - custom timing */
.box {
transition: transform 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55);
}
Transform
transform memungkinkan kamu memanipulasi elemen: memutar, memperbesar, memindahkan, dan memiringkan.
/* Translate - memindahkan elemen */
.box {
transition: transform 0.3s ease;
}
.box:hover {
transform: translateX(20px); /* geser horizontal */
transform: translateY(-10px); /* geser vertikal */
transform: translate(20px, -10px); /* geser keduanya */
}
/* Rotate - memutar elemen */
.icon {
transition: transform 0.3s ease;
}
.icon:hover {
transform: rotate(45deg); /* putar 45 derajat */
transform: rotate(-45deg); /* putar berlawanan */
}
/* Scale - memperbesar/mengecilkan */
.image {
transition: transform 0.3s ease;
}
.image:hover {
transform: scale(1.2); /* perbesar 120% */
transform: scale(0.8); /* perkecil 80% */
}
/* Skew - memiringkan */
.box {
transition: transform 0.3s ease;
}
.box:hover {
transform: skewX(10deg);
transform: skewY(5deg);
}
/* Kombinasi transform */
.element {
transition: transform 0.4s ease;
}
.element:hover {
transform: translate(10px, -5px) rotate(5deg) scale(1.1);
}
Keyframe Animations
Kalau transitions butuh trigger (seperti hover), keyframe animations bisa berjalan otomatis dan punya lebih banyak kontrol.
Syntax Dasar
/* Definisikan keyframe */
@keyframes slideIn {
0% {
transform: translateX(-100%);
opacity: 0;
}
100% {
transform: translateX(0);
opacity: 1;
}
}
/* Terapkan ke elemen */
.animated-element {
animation: slideIn 0.5s ease forwards;
}
Properti Animation
.element {
/* shorthand: name duration timing-function delay iteration-count direction fill-state play-state */
animation: slideIn 0.5s ease-in-out 0s 1 normal forwards running;
/* atau satu per satu */
animation-name: slideIn;
animation-duration: 0.5s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
animation-iteration-count: 1;
animation-direction: normal;
animation-fill-mode: forwards;
animation-play-state: running;
}
Iteration Count & Direction
/* Berulang terus */
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.loading {
animation: spin 1s linear infinite;
}
/* Berulang 3 kali */
.pulse {
animation: pulse 0.5s ease 3;
}
/* Direction: alternate - bolak-balik */
.bounce {
animation: bounce 0.5s ease-in-out infinite alternate;
}
/* Direction: reverse */
.reverse {
animation: slideIn 0.5s ease reverse;
}
Fill Mode
/* forwards - pertahankan state akhir */
.element {
animation: fadeIn 0.5s ease forwards;
}
/* backwards - apply state awal sebelum animasi mulai */
.element {
animation: fadeIn 0.5s ease 1s backwards;
}
/* both - forwards + backwards */
.element {
animation: fadeIn 0.5s ease 1s both;
}
Contoh Animasi Populer
1. Pulse Animation
@keyframes pulse {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
}
.notification-badge {
animation: pulse 2s ease-in-out infinite;
}
2. Shake Animation (Error)
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
20%, 40%, 60%, 80% { transform: translateX(4px); }
}
.error-input {
animation: shake 0.5s ease;
}
3. Fade In Up (Scroll Reveal)
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.reveal {
animation: fadeInUp 0.6s ease forwards;
opacity: 0; /* awalnya transparan */
}
4. Typing Effect (Animasi Cursor)
@keyframes blink {
0%, 50% { border-right-color: transparent; }
51%, 100% { border-right-color: black; }
}
.typing-text {
border-right: 2px solid black;
animation: blink 1s step-end infinite;
overflow: hidden;
white-space: nowrap;
}
5. Gradient Animation
@keyframes gradientBG {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
.animated-gradient {
background: linear-gradient(270deg, #667eea, #764ba2, #f093fb);
background-size: 200% 200%;
animation: gradientBG 3s ease infinite;
}
6. Bouncing Ball
@keyframes bounce {
0%, 20%, 53%, 80%, 100% {
transform: translateY(0);
}
40%, 43% {
transform: translateY(-30px);
}
70% {
transform: translateY(-15px);
}
90% {
transform: translateY(-4px);
}
}
.bouncing-ball {
animation: bounce 1s ease infinite;
}
Hover Effects yang Keren
1. Button Glow
.glow-button {
background: #6c5ce7;
color: white;
border: none;
padding: 12px 24px;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
}
.glow-button:hover {
box-shadow: 0 0 20px rgba(108, 92, 231, 0.5),
0 0 40px rgba(108, 92, 231, 0.3);
transform: translateY(-2px);
}
2. Card Lift Effect
.card {
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.card:hover {
transform: translateY(-8px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}
3. Image Overlay
.image-wrapper {
position: relative;
overflow: hidden;
border-radius: 8px;
}
.image-wrapper img {
transition: transform 0.5s ease;
}
.image-wrapper:hover img {
transform: scale(1.1);
}
.image-wrapper::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0);
transition: background 0.3s ease;
}
.image-wrapper:hover::after {
background: rgba(0, 0, 0, 0.3);
}
4. Underline Effect
.nav-link {
color: #333;
text-decoration: none;
position: relative;
padding-bottom: 4px;
}
.nav-link::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background: #6c5ce7;
transition: width 0.3s ease;
}
.nav-link:hover::after {
width: 100%;
}
Scroll Animations dengan CSS
1. Scroll-Driven Animations (CSS Only)
/* Animasi berdasarkan scroll */
@keyframes reveal {
from {
opacity: 0;
transform: translateY(100px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.scroll-reveal {
animation: reveal linear forwards;
animation-timeline: view();
animation-range: entry 0% cover 50%;
}
2. Parallax Effect dengan CSS
.parallax-container {
height: 400px;
overflow: hidden;
position: relative;
}
.parallax-bg {
position: absolute;
top: -50px;
left: 0;
right: 0;
bottom: -50px;
background-image: url('background.jpg');
background-size: cover;
background-attachment: fixed;
}
3. Sticky Progress Bar
@keyframes growProgress {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
.progress-bar {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 4px;
background: #6c5ce7;
transform-origin: left;
animation: growProgress linear forwards;
animation-timeline: scroll();
}
Performance Tips ⚡
Ini penting banget! Animasi yang salah bisa bikin website jadi lambat.
✅ Property yang Aman di-Animate
/* Gunakan hanya transform dan opacity untuk animasi smooth */
.optimized {
transition: transform 0.3s ease, opacity 0.3s ease;
}
/* ❌ JANGAN animasi ini (trigger layout/reflow): */
/* width, height, margin, padding, top, left, border */
/* ✅ AMAN di-animasi (tidak trigger layout): */
/* transform, opacity, filter, box-shadow */
✅ Gunakan will-change dengan Bijak
/* Beri hint ke browser tentang property yang akan diubah */
.animated-element {
will-change: transform, opacity;
}
/* Jangan overuse! Hanya untuk elemen yang benar-benar akan dianimasikan */
/* Hapus setelah animasi selesai */
✅ Gunakan transform: translateZ(0) atau backface-visibility
/* Force GPU acceleration */
.smooth-element {
transform: translateZ(0);
/* atau */
backface-visibility: hidden;
}
✅ Gunakan requestAnimationFrame dengan JavaScript
// Untuk animasi yang kompleks, gunakan JS
function animate() {
// update animasi
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
✅ Gunakan CSS Containment
/* Isolasi elemen untuk performa lebih baik */
.animated-section {
contain: layout style;
}
Best Practices 📝
1. Gunakan CSS Custom Properties
:root {
--transition-speed: 0.3s;
--transition-easing: ease;
}
.button {
transition: all var(--transition-speed) var(--transition-easing);
}
/* Mudah diubah untuk dark mode atau prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
:root {
--transition-speed: 0.01s;
}
}
2. Respect User Preferences
/* Hanya animasi untuk user yang suka */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
3. Ketahui Kapan Gunakan Transition vs Animation
| Kapan | Gunakan |
|---|---|
| Perubahan saat hover/focus | transition |
| Animasi berulang/otomatis | @keyframes + animation |
| Scroll-triggered | animation-timeline |
| Satu kali transisi | transition |
4. Naming Convention
/* Gunakan nama yang deskriptif */
@keyframes fadeInUp { /* ... */ }
@keyframes slideInLeft { /* ... */ }
@keyframes pulse { /* ... */ }
@keyframes spin { /* ... */ }
/* Bukan: */
@keyframes anim1 { /* ... */ }
@keyframes awesome { /* ... */ }
Ringkasan
- Transitions → perubahan gradual saat state berubah (hover, focus)
- Transform → rotate, scale, translate, skew tanpa trigger layout
- Keyframe Animations → animasi otomatis dengan banyak kontrol
- Performance → animasikan hanya
transformdanopacity - Accessibility → selalu respect
prefers-reduced-motion