Kuasai Layout & Animasi Modern
Navigasi: ← → atau geser layar · Tekan F11 untuk layar penuh
Setelah menyelesaikan bab ini, kamu akan mampu:
Memahami position: relative, absolute, fixed, dan sticky.
Membedakan display block, inline, dan inline-block.
Menyusun antarmuka dengan Flexbox secara otomatis & rapi.
Mendesain tata letak kompleks memakai CSS Grid.
Menggunakan transition, animation, dan transform.
Klik salah satu topik untuk langsung melompat ke materinya.
Property position menentukan di mana sebuah elemen diletakkan di halaman. Ada 4 nilai utama: relative, absolute, fixed, dan sticky.
Mengatur posisi elemen itu seperti menata furnitur. Ruangan = halaman, furnitur = elemen. Coba seret furnitur di bawah — kamu sedang memindahkan "posisi" mereka, persis seperti CSS!
left: 50px:🔍 Bagaimana absolute mencari patokan?
position
→.kartu (relative) ✓
→Patokan ditemukan! Posisi dihitung dari sini.
Jika tidak ada parent ber-position → acuan menjadi viewport/halaman (biasanya tidak diinginkan!).
top: 10px → 10px dari atas patokan ⬇
right: 10px → 10px dari kanan patokan ⬅
bottom: 10px → 10px dari bawah patokan ⬆
left: 10px → 10px dari kiri patokan ➡
🛍️ Contoh Nyata: Kartu Produk
Badge -50% di pojok kiri atas menggunakan position: absolute; top:10px; left:10px
.produk {
position: relative; /* patokan */
}
.diskon {
position: absolute; /* menempel */
top: 10px;
left: 10px;
}⚡ Pola Wajib Hafal — Paling Sering Dipakai:
/* ✅ Parent menjadi patokan */
.parent {
position: relative;
}
/* ✅ Child menempel ke patokan */
.child {
position: absolute;
top: 10px;
right: 10px;
}Tetap di tempat yang sama walau halaman di-scroll. Cocok untuk tombol chat atau navbar yang selalu terlihat.
Awalnya ikut mengalir, lalu "nempel" di tepi layar ketika kamu scroll melewatinya — seperti pembatas buku.
Scroll area di bawah ini ke bawah. Perhatikan header ungu yang "menempel" (sticky) dan badge emas yang tetap di pojok (fixed-like).
.navbar {
position: sticky;
top: 0; /* nempel di atas */
}
.tombol-chat {
position: fixed;
bottom: 20px;
right: 20px; /* selalu di pojok */
}Tekan tombol untuk melihat 4 kotak terbang ke posisinya masing-masing — seperti puzzle yang menyusun diri.
.relative { position: relative; top: 10px; left: 10px; }
.absolute { position: absolute; top: 10px; right: 10px; }
.fixed { position: fixed; bottom: 10px; left: 10px; }
.sticky { position: sticky; top: 0; }block seperti dus besar yang memakan satu baris penuh (kulkas, lemari). inline seperti stiker kecil yang menempel berjajar dalam satu baris. inline-block = stiker yang bisa diatur ukurannya seperti dus.
Satu baris penuh. Contoh: <div>, <p>, <h1>
Berjajar, selebar isinya. Contoh: <span>, <a>, <b>
Berjajar TAPI bisa diatur lebar/tinggi.
Klik tombol untuk melihat 4 kotak yang sama berubah tipe tampilan secara langsung.
.block { display: block; } /* turun ke bawah */
.inline { display: inline; } /* berjajar */
.inline-block { display: inline-block; } /* jajar + bisa diukur */Contoh nyata: mengubah daftar link menjadi menu horizontal dengan display: inline-block.
nav a {
display: inline-block; /* link berjajar */
padding: 8px 16px;
color: #C9A84C;
}
nav a:hover {
background: #7B2FBE;
color: #fff;
}Karena inline tidak bisa diberi padding atas-bawah dengan rapi, kita ubah ke inline-block agar tombol menu terlihat enak.
Daripada mengatur posisi setiap mobil satu per satu memakai margin (yang repot & mudah rusak), kita cukup memberi perintah kepada tempat parkirnya (container): "Rapikan mobil ke kiri", "Letakkan di tengah", atau "Beri jarak sama rata". Mobil di dalamnya otomatis menurut!
Elemen <div> default-nya block, jadi mobil selalu menumpuk ke bawah satu per satu.
display: flexCukup pasang display: flex; pada container, semua mobil langsung berjajar mendatar!
🧠 Alur Berpikir Flexbox (5 Langkah):
display: flex
➔3. FLEXBOX AKTIF
➔4. Ada beberapa ITEM
➔5. justify-content atur posisi
justify-content: Mengatur Posisi ItemMobil sudah berjajar. Sekarang kita atur posisi dan jarak mereka pada sumbu utama (kiri ↔ kanan).
Kumpulkan semua mobil di awal (kiri).
Kumpulkan semua mobil tepat di tengah.
Ujung kiri & kanan mentok, sisa jarak dibagi rata (Wajib untuk Navbar: Logo ↔ Menu).
Setiap mobil diberi ruang rata di kiri & kanannya.
🚗 Hasil Visual Tempat Parkir:
Hubungan: KODE ➔ PERINTAH ➔ HASIL VISUAL
.container {
display: flex;
justify-content: flex-start;
}Mengontrol arah aliran item (mendatar/menurun) dan perilaku saat tempat parkir penuh.
Mengubah sumbu utama: row (default, kiri ke kanan) atau column (atas ke bawah seperti daftar menu vertikal).
Dengan wrap, item yang berlebih otomatis pindah ke baris bawahnya secara rapi — sangat penting untuk tampilan HP!
Jika justify-content mengatur posisi horizontal, maka align-items mengatur posisi vertikal (sumbu silang).
Kombinasi 3 baris ini adalah jurus paling terkenal di dunia web developer untuk menengahkan apapun (kotak login, tombol, popup, kartu):
.container {
display: flex;
justify-content: center; /* tengah mendatar */
align-items: center; /* tengah menurun */
height: 100vh;
}Jika Flexbox hanya mengatur 1 arah (1 Dimensi), CSS Grid mengatur 2 Dimensi sekaligus (Baris ➡ DAN Kolom ⬇). Saat sebuah elemen diberi display: grid;, elemen tersebut menjadi Grid Container dan anak-anak di dalamnya menjadi Grid Items.
Induk = Container · Anak langsung = Items
🏙️ Petak-Petak Kota Grid (3 Kolom × 3 Baris = 9 Cell):
fr & repeat()Mengatur pembagian kolom (lebar) dan baris (tinggi) secara fleksibel dengan satuan fr (fraction).
1fr 1fr 1fr membagi sisa layar menjadi 3 bagian sama besar. Jika 1fr 2fr, kolom kedua dapat 2× lebih lebar!
Daripada mengetik 1fr 1fr 1fr 1fr, cukup tulis repeat(4, 1fr). Kode jadi jauh lebih rapi & bersih!
🖼️ Visual Petak Grid:
.galeri {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}Elemen bisa membentang beberapa kolom atau baris menggunakan nomor Grid Line.
📐 Konsep Garis Pembatas (Grid Lines 1 ➔ 4):
Trik Pro: grid-column: 1 / -1; artinya membentang dari garis awal (1) sampai garis paling akhir (-1)!
.header { grid-column: 1 / -1; } /* bentang penuh dari awal ke akhir */
.sidebar { grid-row: span 2; } /* bentang 2 baris ke bawah */
.konten { grid-column: span 2; } /* bentang 2 kolom ke samping */
.container { place-items: center; } /* teks & isi kotak pas di tengah! */
Gunakan rumus ajaib: repeat(auto-fit, minmax(110px, 1fr)).
Artinya: "Buat kolom sebanyak mungkin yang muat. Tiap kolom minimal 110px, dan jika ada sisa ruang boleh membesar (1fr)."
⚔️ Kapan Pakai Flexbox? Kapan Pakai Grid?
| Kriteria | 🚗 CSS Flexbox | ♟️ CSS Grid |
|---|---|---|
| Dimensi | 1 Dimensi (1D) ➔ Baris atau Kolom | 2 Dimensi (2D) ➔ Baris dan Kolom |
| Fokus Utama | Penataan komponen & fleksibilitas isi | Kerangka cetak biru tata letak (blueprint) |
| Cocok Untuk | Navbar, barisan tombol, badge status | Layout halaman penuh, dashboard, galeri foto |
💡 Butuh 1 arah lurus? ➔ Pakai Flexbox | Butuh baris + kolom kotak-kotak? ➔ Pakai Grid
Transition membuat perubahan terjadi perlahan, seperti lampu dimmer yang meredup pelan-pelan — bukan saklar yang langsung mati. Arahkan kursor ke tombol di bawah untuk merasakan perbedaan kurva waktunya.
.tombol {
transition: all 0.5s ease; /* durasi 0.5 detik */
}
.tombol:hover {
transform: scale(1.2);
background: #00D4FF;
}Seperti film kartun yang tersusun dari banyak gambar, @keyframes mendefinisikan kondisi di tiap titik waktu (0%, 50%, 100%). Lihat karakter di bawah berjalan!
@keyframes loncat {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-80px); }
}
.bola {
animation: loncat 1.2s ease-in-out infinite;
}Geser slider untuk mengubah bentuk kotak secara real-time: rotate, scale, translate, dan skew.
.kotak {
transform: rotate(0deg) scale(1) translateX(0px) skewX(0deg);
}
/* rotate=putar · scale=besar-kecil · translate=geser · skew=miring */Arahkan kursor ke setiap kartu untuk melihat 6 efek berbeda. Inilah gabungan transition + transform yang membuat web terasa hidup.
Tekan "Langkah Berikutnya" untuk melihat halaman dibangun bertahap: struktur → layout → animasi.
header, hero, fitur, footer
menata navbar & kartu fitur
tema gelap premium
transition + transform
Semua properti penting dalam satu layar. Boleh di-screenshot untuk catatan!
📋 Instruksi: Buatlah sebuah navigation bar horizontal yang berisi logo di kiri dan 3 menu (Beranda, Tentang, Kontak) di kanan, menggunakan display: flex.
🎯 Output yang diharapkan:
✅ Kriteria Penilaian:
Bungkus menu dalam satu <div>. Pada <nav> pakai display:flex; justify-content:space-between; align-items:center;. Untuk menu pakai <div> ber-flex dengan gap:18px.
📋 Instruksi: Buat galeri foto menggunakan display: grid. Pilih tingkat tantanganmu:
🧱 Template Starter (silakan salin):
.galeri {
display: grid;
grid-template-columns: /* TODO: atur kolom */ ;
gap: 8px;
}
.foto-utama {
/* TANTANGAN: grid-column: span 2; grid-row: span 2; */
}Gunakan grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); agar galeri otomatis responsif.
🚀 Spesifikasi: Buat satu halaman landing page bertema bebas (produk, komunitas, atau profil) yang menggabungkan SEMUA materi Bab 6.
📊 Rubrik Penilaian:
| Aspek | Bobot | Indikator |
|---|---|---|
| Layout (Flex & Grid) | 30% | Struktur rapi & responsif |
| Position | 15% | Penggunaan sticky/fixed tepat |
| Animasi & Hover | 25% | Halus & relevan |
| Desain & Warna | 20% | Konsisten & enak dilihat |
| Kerapian Kode | 10% | Terstruktur & rapi |
🗓️ Pengumpulan: [Deadline: ____] · Kumpulkan file index.html melalui [platform: ____].
🎉 Selamat! Kamu telah menyelesaikan Bab 6 — CSS Advanced
<nav style="display:flex;justify-content:space-between">
<b>Logo</b> <a>Menu</a>
</nav>
<section class="hero">...</section>
<div class="fitur" style="display:grid;
grid-template-columns:repeat(3,1fr)">
<div class="kartu">...</div>
</div>