Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Penasaran gimana cara bikin navigasi menu game di website tampil seamless tanpa reload? Yuk belajar View Transitions CSS untuk web developer game dari nol!
Tutorial view transitions css game menu navigasi halus lagi sering dicari karena pemain pengin dapet pengalaman terbaik tapi tetap hemat dan aman. Di artikel ini kita bahas poin penting + rangkuman dari sumber terbaru, terus lanjut ke langkah yang bisa langsung kamu praktekkan.

Kalau kamu pernah buka website game yang transisinya patah-patah, loading terasa lama, atau halaman berubah secara kasar — kamu tahu betapa frustasinya pengalaman itu. Nah, View Transitions API di CSS hadir sebagai solusi buat解决这个问题.
View Transitions memungkinkan perpindahan antar halaman atau tampilan terjadi dengan animasi halus, hampir mirip kayak cutscene di game konsol. Alih-alih halaman langsung “hilang” lalu muncul yang baru, kamu bisa atur elemen tertentu agar fade, slide, atau bahkan morph secara natural.
MDN sendiri baru saja melakukan rebuild frontend mereka dari nol demi pengalaman navigasi yang lebih mulus. Kalau situs edukasi sebesar MDN saja menganggap ini penting, masa kamu masih ragu?
View Transitions API memungkinkan kamu bikin transisi visual antar halaman tanpa harus reload seluruh DOM. Ini kabar bagus buat web developer yang pengen bikin pengalaman gaming-like di browser.
Di tutorial ini, kita bakal bahas gimana cara pasang View Transitions di website bertema game — mulai dari setup dasar sampai teknik lanjutan biar menu game kamu terasa seperti aplikasi native.
View Transitions API adalah fitur CSS modern yang bikin perpindahan antar “tampilan” (view) bisa dianimasikan tanpa harus reload seluruh halaman. Awalnya fitur ini cuma support di single-page apps, tapi sekarang sudah bisa dipakai juga untuk navigasi antar halaman berbeda.
Caranya simpel: cukup tambahin satu baris CSS, dan browser otomatis bikin transisi default berupa fade. Tapi kamu juga bisa kustomisasi sepenuhnya.
Untuk cek dukungan browser terbaru, kamu bisa lihat di dokumentasi MDN tentang View Transitions. Intinya, majority browser modern sudah support, jadi aman buat produksi.
Sebelum mulai, pastikan kamu sudah punya struktur HTML sederhana. Misalnya, kamu lagi bikin website portfolio game dengan halaman home, game list, dan detail game. Mari kita setup step by step.
Di file CSS utama kamu, tambahkan ini:
document-startViewTransition {
view-transition-name: root;
}
if (document.startViewTransition) {
document.startViewTransition(() => {
// update DOM di sini
});
}Browser sudah kasih animasi fade secara default. Tapi kalau kamu mau custom, Override pseudo-element ::view-transition-old dan ::view-transition-new:
::view-transition-old(root) {
animation: slideOut 400ms ease-out forwards;
}
::view-transition-new(root) {
animation: slideIn 400ms ease-in forwards;
}
@keyframes slideOut {
from { opacity: 1; transform: translateX(0); }
to { opacity: 0; transform: translateX(-30px); }
}
@keyframes slideIn {
from { opacity: 0; transform: translateX(30px); }
to { opacity: 1; transform: translateX(0); }
}Di bagian menu game, kita pengen transisi terasa seperti memilih opsi di menu game konsol — responsif, cepat, dan satisfying. Kode JavaScript-nya:
// Fungsi navigasi dengan View Transitions
async function navigateTo(url) {
if (!document.startViewTransition) {
// Fallback untuk browser yang belum support
window.location.href = url;
return;
}
document.startViewTransition(async () => {
const response = await fetch(url);
const html = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
// Ganti konten utama
const newContent = doc.querySelector('#main-content');
document.querySelector('#main-content').replaceWith(newContent);
// Update URL tanpa reload
history.pushState(null, '', url);
});
}
// Pasang event listener ke menu
document.querySelectorAll('.game-menu a').forEach(link => {
link.addEventListener('click', (e) => {
e.preventDefault();
navigateTo(link.href);
});
});Selesai! Sekarang setiap kali pemain klik menu, transisinya bakal terasa halus kayak di game. Kalau kamu pengen tahu lebih dalam soal arsitektur frontend modern yang Mendukung fitur ini, cek artikel kami tentang panduan memilih hardware gaming — karena performanya juga tergantung dispositif yang dipakai.
Transisi dasar itu sudah bagus, tapi buat website game yang keren, kamu butuh lebih. Kamu bisa kasih view-transition-name ke elemen spesifik biar elemen itu “bergerak” sendiri saat navigasi, bukan ikut fade bareng halaman.
Misalnya kamu punya halaman daftar game. Setiap kartu game punya thumbnail. Saat pemain klik kartu dan masuk ke halaman detail, kamu pengen thumbnail-nya “membesar” sampai jadi hero image di halaman detail. Ini teknik yang sering dipakai di game portal besar:
.game-card .cover-art {
view-transition-name: game-cover;
}
.game-detail .hero-cover {
view-transition-name: game-cover;
}
::view-transition-group(game-cover) {
animation-duration: 600ms;
animation-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1);
}Dengan kode di atas, browser otomatis bikin animasi “morph” — thumbnail kecil di kartu akan membesar dan bergerak ke posisi hero image tanpa kamu perlu kode JavaScript tambahan.
Biar makin terasa seperti game, kamu bisa kasih karakter berbeda tiap halaman:
::view-transition-old(root) {
animation: 300ms ease-out both slideUp;
}
::view-transition-new(root) {
animation: 300ms ease-in both slideFromBottom;
}
.detail-page::view-transition-old(root) {
animation: 200ms ease-out both scaleDown;
}
.detail-page::view-transition-new(root) {
animation: 400ms cubic-bezier(0.34, 1.56, 0.64, 1) both scaleUp;
}
@keyframes slideUp {
to { transform: translateY(-20px); opacity: 0; }
}
@keyframes slideFromBottom {
from { transform: translateY(20px); opacity: 0; }
}
@keyframes scaleDown {
to { transform: scale(0.95); opacity: 0; }
}
@keyframes scaleUp {
from { transform: scale(0.9); opacity: 0; }
}Pastikan kamu pasang class detail-page di elemen <html> atau <body> setiap kali halaman detail dimuat. Ini cara gampang buat switch antara berbagai jenis transisi.
Transisi yang halus cuma bakal keren kalau performanya stabil di 60FPS. Berikut tips optimasi biar View Transitions kamu tidak bikin browser ngos-ngosan:
Selalu pakai @keyframes CSS untuk animasi, bukan requestAnimationFrame di JS. Browser bisa mengoptimasi animasi CSS di compositor thread terpisah, jadi tidak ngaruh ke main thread yang sibuk proses game logic.
Image format yang kamu pakai untuk cover art game sangat memengaruhi waktu load. Berdasarkan panduan dari MDN tentang codec dan tool kompresi gambar, kamu bisa pakai format modern seperti WebP atau AVIF buat dapat ukuran kecil tapi kualitas tetap tinggi.
Gunakan format AVIF untuk screenshot game yang detail, dan WebP untuk thumbnail yang butuh transparansi. Hindari PNG atau JPEG untuk web — performanya jauh di bawah.
Waktu transisi 300-400ms itu cukup buat preload halaman berikutnya tanpa pemain sadari:
// Preload halaman saat hover
document.querySelectorAll('.game-menu a').forEach(link => {
link.addEventListener('mouseenter', () => {
const url = link.href;
if (document.preload) {
document.preload(url, { as: 'document' });
}
});
});Di dalam callback startViewTransition, hindari mengubah layout (misalnya menambah/menghapus banyak elemen). Ubah konten secukupnya dan biarkan browser handle sisanya. Kalau kamu pengen tahu lebih lengkap soal optimasi performa website secara keseluruhan, baca artikel kami tentang optimasi performa gaming.
Sekarang kita masuk ke praktik nyata. Kita bakal bikin menu utama game RPG sederhana yang terdiri dari Home, Play, Inventory, dan Settings. Setiap menu punya transisi unik.
<nav class="game-menu">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/play">Play</a></li>
<li><a href="/inventory">Inventory</a></li>
<li><a href="/settings">Settings</a></li>
</ul>
</nav>
<main id="main-content">
<!-- Konten dimuat secara dinamis -->
</main>.game-menu {
background: linear-gradient(135deg, #1a1a2e, #16213e);
border-right: 2px solid #e94560;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 2rem;
font-family: 'Press Start 2P', monospace;
}
.game-menu ul {
list-style: none;
padding: 0;
}
.game-menu li {
margin: 1.5rem 0;
}
.game-menu a {
color: #eaeaea;
text-decoration: none;
font-size: 0.9rem;
padding: 0.75rem 1.5rem;
display: block;
border: 2px solid transparent;
transition: all 0.2s ease;
position: relative;
}
.game-menu a::before {
content: '>';
margin-right: 0.5rem;
opacity: 0;
transform: translateX(-10px);
transition: all 0.2s ease;
}
.game-menu a:hover::before,
.game-menu a:focus::before {
opacity: 1;
transform: translateX(0);
}
.game-menu a:hover {
color: #e94560;
border-left: 2px solid #e94560;
padding-left: 2rem;
}
.game-menu a.active {
color: #0f3460;
background: #e94560;
}
::view-transition-old(root) {
animation: rpgFadeOut 250ms ease-in forwards;
}
::view-transition-new(root) {
animation: rpgFadeIn 350ms ease-out forwards;
}
@keyframes rpgFadeOut {
to { opacity: 0; filter: blur(4px); }
}
@keyframes rpgFadeIn {
from { opacity: 0; filter: blur(4px); }
to { opacity: 1; filter: blur(0); }
}class GameRouter {
constructor() {
this.setupNavigation();
window.addEventListener('popstate', () => this.handleRoute());
}
async navigate(path) {
if (!document.startViewTransition) {
window.location.href = path;
return;
}
document.startViewTransition(async () => {
await this.loadContent(path);
history.pushState(null, '', path);
this.updateActiveMenu(path);
});
}
async loadContent(path) {
const res = await fetch(path);
const html = await res.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
const newContent = doc.getElementById('main-content');
document.getElementById('main-content').replaceWith(newContent);
}
setupNavigation() {
document.querySelectorAll('.game-menu a').forEach(link => {
link.addEventListener('click', (e) => {
e.preventDefault();
this.navigate(link.getAttribute('href'));
});
});
}
updateActiveMenu(path) {
document.querySelectorAll('.game-menu a').forEach(a => {
a.classList.toggle('active', a.getAttribute('href') === path);
});
}
async handleRoute() {
await this.loadContent(window.location.pathname);
this.updateActiveMenu(window.location.pathname);
}
}
const router = new GameRouter();Sekarang menu RPG kamu sudah punya transisi halus! Kalau kamu pengen lihat referensi implementasi lebih lanjut dari sisi arsitektur frontend, MDN menulis panjang lebar soal bagaimana mereka melakukan deep dive ke frontend baru mereka yang salah satunya mengadopsi View Transitions.
Meskipun View Transitions terlihat simpel, ada beberapa masalah umum yang sering muncul:
Penyebab: Callback di startViewTransition throw error atau menghasilkan Promise yang tidak resolve.
Solusi: Bungkus callback dengan try-catch dan cek console:
document.startViewTransition(async () => {
try {
await loadContent();
} catch (err) {
console.error('Gagal memuat konten:', err);
throw err; // Penting! Kalau tidak di-throw, transisi akan hang
}
});Penyebab: Animasi duration terlalu pendek atau animation-timing-function terlalu agresif.
Solusi: Set minimum 200ms untuk transisi keluar dan 300ms untuk transisi masuk. Jangan pakai linear — pakai ease-out untuk keluar dan ease-in untuk masuk.
Penyebab: Dua elemen di halaman berbeda pakai view-transition-name yang sama tapi bukan pasangan yang seharusnya.
Solusi: Pastikan nama unik dan hanya dipakai di elemen yang memang dituju. Kamu bisa debug dengan:
// Cetak semua view-transition-name yang aktif
document.querySelectorAll('[style*="view-transition-name"]').forEach(el => {
console.log(el.tagName, el.style.viewTransitionName);
});Kalau kamu baru mulai belajar CSS modern, artikel panduan view transitions CSS dari nol bisa jadi referensi tambahan buat memahami dasar-dasarnya lebih dalam.
Berikut referensi yang digunakan dalam artikel ini:

“Lebih penting konsisten + ngerti konsep, daripada sekadar ikut-ikutan setting.”
View Transitions API adalah fitur CSS modern yang memungkinkan perpindahan antar tampilan (view) di halaman web terjadi dengan animasi halus, tanpa harus reload seluruh halaman. Cukup satu baris CSS, browser otomatis bikin transisi, dan kamu bisa kustomisasi sepenuhnya lewat pseudo-element ::view-transition-old dan ::view-transition-new.
Mayoritas browser modern sudah mendukung, termasuk Chrome 111+, Edge 111+, Samsung Internet 22+, Safari 18+, dan Firefox 129+ (dengan flag). Untuk website game yang ditargetkan ke audiens luas, pastikan selalu ada fallback berupa redirect biasa ke halaman tujuan.
Kamu bisa kasih class unik di elemen body/html setiap halaman dimuat, lalu gunakan selektor CSS bertingkat untuk override transisi default. Misalnya, halaman detail game pakai animasi scale bounce, sementara halaman inventory pakai fade blur. Pastikan durasi transisi minimum 200ms keluar dan 300ms masuk agar terasa natural.
Kemungkinan penyebabnya ada tiga: (1) durasi animasi terlalu pendek, (2) timing function terlalu agresif seperti linear, atau (3) callback startViewTransition throw error sehingga transisi gagal. Cek console browser dan pastikan kamu pakai minimum 200ms dengan ease-out untuk keluar. Selalu bungkus callback dengan try-catch.
Tidak, View Transitions hanya bekerja dalam konteks origin yang sama karena browser butuh akses ke DOM halaman sebelumnya dan berikutnya. Untuk navigasi antar domain, browser akan fallback ke perilaku default (navigasi biasa). Fitur ini ideal buat single-page application atau multi-page app yang served dari server yang sama.
Sangat bagus! View Transitions berjalan di compositor thread browser, jadi tidak membebani main thread yang juga mungkin menjalankan game engine lain. Untuk perangkat mobile, pastikan kamu preload halaman berikutnya saat hover, kompres semua gambar pakai WebP atau AVIF, dan gunakan durasi transisi tidak lebih dari 400ms agar terasa responsif di koneksi seluler.
Kalau kamu punya pengalaman atau trik soal tutorial view transitions css game menu navigasi halus, drop di komentar ya — biar kita saling bantu komunitas.
[…] Tutorial View Transitions CSS: Bikin Navigasi Menu Game di Website Jadi Super Halus dan Smooth […]
[…] Tutorial View Transitions CSS: Bikin Navigasi Menu Game di Website Jadi Super Halus dan Smooth […]
[…] Tutorial View Transitions CSS: Bikin Navigasi Menu Game di Website Jadi Super Halus dan Smooth […]