Proyek Mini: Landing Page Lengkap
Rangkai semua yang dipelajari: bangun landing page responsif dengan navbar sticky, hero, fitur grid, dan footer.
Misi: landing page "Kopi Senja"
Kita bangun landing page fiktif untuk kedai kopi, memakai hampir semua teknik di track ini: variabel, flexbox, grid, positioning, transisi, clamp, dan media query. Struktur HTML-nya:
<header class="navbar">
<a class="logo" href="#">Kopi Senja</a>
<nav class="menu">
<a href="#fitur">Fitur</a>
<a href="#menu">Menu</a>
<a href="#kontak" class="btn">Pesan</a>
</nav>
</header>
<section class="hero">
<div class="hero-teks">
<h1>Ngopi santai, rasa juara.</h1>
<p>Biji kopi pilihan petani lokal, diseduh dengan cinta setiap pagi.</p>
<a href="#menu" class="btn btn-besar">Lihat Menu</a>
</div>
</section>
<section id="fitur" class="fitur">
<h2>Kenapa kami?</h2>
<div class="grid-fitur">
<div class="kartu">...</div>
<div class="kartu">...</div>
<div class="kartu">...</div>
</div>
</section>
<footer class="footer">...</footer>Langkah 1: fondasi dan variabel
* { box-sizing: border-box; }
:root {
--primer: #8b5cf6;
--gelap: #0f172a;
--teks: #334155;
--radius: 12px;
--h1: clamp(2rem, 1.3rem + 3vw, 3.5rem);
}
body {
margin: 0;
font-family: "Inter", sans-serif;
color: var(--teks);
line-height: 1.6;
}Langkah 2: navbar sticky
.navbar {
position: sticky;
top: 0;
z-index: 50;
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid #e2e8f0;
}
.menu {
display: flex;
align-items: center;
gap: 24px;
}
.menu a { text-decoration: none; color: var(--teks); }
.btn {
display: inline-block;
background: var(--primer);
color: white;
padding: 10px 24px;
border-radius: 999px;
text-decoration: none;
transition: transform 0.2s ease-out, background 0.2s;
}
.btn:hover {
transform: translateY(-2px);
background: #7c3aed;
}Langkah 3: hero dengan overlay
.hero {
position: relative;
min-height: 80vh;
display: flex;
align-items: center;
padding: 48px 24px;
background: url("kopi.jpg") center / cover;
color: white;
}
.hero::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(to right, rgba(15, 23, 42, 0.8), rgba(15, 23, 42, 0.3));
}
.hero-teks {
position: relative;
z-index: 1;
max-width: 600px;
}
.hero-teks h1 {
font-size: var(--h1);
line-height: 1.15;
margin: 0 0 16px;
}Overlay via ::after bikin teks terbaca di atas foto. z-index: 1 mengangkat teks di atas overlay.
Langkah 4: grid fitur responsif
.fitur {
padding: 80px 24px;
max-width: 1100px;
margin: 0 auto;
}
.fitur h2 {
text-align: center;
margin-bottom: 40px;
}
.grid-fitur {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 24px;
}
.kartu {
padding: 32px 24px;
border: 1px solid #e2e8f0;
border-radius: var(--radius);
transition: transform 0.25s ease-out, box-shadow 0.25s ease-out;
}
.kartu:hover {
transform: translateY(-6px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.1);
}Langkah 5: sentuhan mobile
.footer {
background: var(--gelap);
color: #cbd5e1;
text-align: center;
padding: 32px 24px;
}
@media (max-width: 640px) {
.menu a:not(.btn) {
display: none; /* sederhanakan menu di HP */
}
.hero {
min-height: 60vh;
}
}Catatan teknis: di project nyata, menu yang disembunyikan di HP biasanya diganti hamburger menu (butuh sedikit JavaScript). Untuk latihan ini, menyembunyikan link sekunder adalah solusi yang sah dan umum dipakai di prototype.
Yang sudah dipakai
Cek berapa banyak teknik track ini yang masuk ke satu halaman: variabel, clamp, sticky, z-index, flexbox, backdrop-filter, transisi, ::after overlay, grid auto-fit, hover lift, media query, object positioning. Inilah cara profesional bekerja: bukan satu teknik raksasa, tapi banyak teknik kecil yang dirangkai rapi.
Rangkuman
Satu landing page utuh = fondasi variabel + navbar sticky kaca + hero overlay + grid fitur + sentuhan mobile. Pola ini bisa dipakai ulang buat portofolio, company profile, atau produk apa pun. Coba ganti warna primer dan fotonya, dan kamu punya desain yang terasa beda.