Kenapa ya navbar yang di laptop terlihat rapi banget, begitu dibuka di HP malah jadi berantakan? Tombolnya numpuk, teksnya kepotong, atau malah ada elemen yang keluar dari layar sampai kamu harus scroll ke samping cuma buat lihat menu “Kontak”. Kalau kamu pernah bertanya-tanya kenapa hal ini terus berulang di project-project kamu, kemungkinan besar jawabannya bukan karena kamu kurang teliti, tapi karena ada satu fondasi konsep yang belum benar-benar kamu pahami.
Masalahnya bukan karena kamu nggak bisa CSS. Masalahnya karena banyak yang belajar membuat navbar dengan cara “menghafal kode dari tutorial”, bukan memahami logika di baliknya. Begitu ukuran layar berubah sedikit saja, semuanya runtuh, karena fondasinya memang nggak dirancang untuk fleksibel dari awal.
Kabar baiknya, ada satu tools CSS yang bisa menyelesaikan masalah ini tanpa perlu framework apapun, tanpa Bootstrap, tanpa Tailwind: Flexbox. Cukup CSS native yang sudah didukung semua browser modern. Di artikel ini kita akan bikin navbar responsive dari nol, step by step, sampai kamu benar-benar paham kenapa setiap baris kodenya ditulis seperti itu, bukan sekadar copy-paste tanpa ngerti.
Kenapa Navbar Sering Jadi Sumber Masalah?
Coba pikirkan sejenak, dari semua bagian website, navbar adalah elemen yang paling sering dilihat pengunjung. Dia muncul di setiap halaman, biasanya di posisi paling atas, dan jadi hal pertama yang dilihat orang begitu website terbuka. Kalau navbar-nya berantakan, kesan pertama yang didapat pengunjung langsung negatif, bahkan sebelum mereka sempat baca konten websitenya sama sekali.
Selain itu, navbar juga elemen yang paling banyak “tuntutan”-nya. Dia harus menampung logo, beberapa link menu, kadang search bar, kadang tombol call-to-action seperti “Daftar” atau “Login”, dan semua itu harus tetap rapi baik di layar desktop yang lebar maupun di layar HP yang sempit. Nggak heran kalau navbar sering jadi salah satu bagian paling sering di-redesign ulang dalam proses development.
Sebelum era Flexbox, developer biasanya mengandalkan float, inline-block, atau bahkan position: absolute untuk mengatur layout navbar. Cara-cara ini bisa jalan, tapi ribet banget kalau elemen-elemennya harus menyesuaikan ukuran layar secara dinamis. Kamu harus itung-itungan lebar secara manual dalam persen atau piksel, dan begitu ada elemen baru ditambahkan (misalnya tiba-tiba butuh nambah menu “Blog”), seringnya semua perhitungan itu berantakan lagi dan kamu harus otak-atik ulang dari awal.
Apa Sebenarnya Flexbox Itu?
Flexbox, atau nama lengkapnya Flexible Box Layout, adalah sebuah mode layout di CSS yang dirancang khusus untuk mengatur elemen-elemen dalam satu dimensi, entah itu horizontal (baris) atau vertikal (kolom). Ini beda dengan CSS Grid yang dirancang untuk layout dua dimensi sekaligus (baris dan kolom bersamaan).
Untuk kebutuhan navbar, Flexbox ini pas banget, karena pada dasarnya navbar itu cuma satu baris elemen yang perlu disusun rapi. Kamu tinggal kasih tahu browser, “susun elemen-elemen ini secara horizontal, kasih jarak yang rata, dan sejajarkan secara vertikal”, lalu browser yang akan menghitung semua ukuran dan posisinya secara otomatis. Kamu nggak perlu lagi pusing menghitung lebar setiap elemen dalam persen atau piksel secara manual.
Konsep dasar dari Flexbox ada dua peran: flex container (elemen induk yang diberi display: flex) dan flex item (elemen-elemen anak di dalamnya). Semua pengaturan arah, jarak, dan perataan dilakukan di flex container, sementara flex item-nya otomatis mengikuti aturan yang sudah ditetapkan.
Langkah 1: Siapkan Struktur HTML
Kita mulai dari struktur dasarnya dulu, sebelum masuk ke CSS. Navbar pada umumnya punya tiga bagian utama: logo di kiri, menu navigasi di tengah atau kanan, dan mungkin tombol aksi seperti “Login” atau “Daftar” di ujung kanan.
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<!-- Wajib ada: tanpa baris ini, media query di CSS nggak akan terbaca benar di HP -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Navbar Responsive</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- Elemen <nav> dipakai karena ini section navigasi, bukan <div> biasa -->
<nav class="navbar">
<div class="logo">MyBrand</div>
<!-- <ul>/<li> dipakai karena menu memang sekumpulan link yang berkaitan -->
<ul class="nav-links">
<li><a href="#">Beranda</a></li>
<li><a href="#">Tentang</a></li>
<li><a href="#">Layanan</a></li>
<li><a href="#">Kontak</a></li>
</ul>
<button class="btn-cta">Daftar</button>
</nav>
</body>
</html>
Dokumentasi struktur:
| 📋 Dokumentasi Struktur | |
|---|---|
<nav class="navbar"> | Container utama, nanti jadi flex container |
<div class="logo"> | Flex item pertama, posisi paling kiri |
<ul class="nav-links"> | Flex item kedua, berisi daftar menu |
<button class="btn-cta"> | Flex item ketiga, posisi paling kanan |

Perhatikan beberapa hal penting di sini. Pertama, kita pakai <ul> dan <li> untuk daftar menu, bukan sekadar tumpukan <div>. Ini bukan kebetulan, secara semantik, menu navigasi memang sekumpulan link yang saling berkaitan, jadi wajar dibungkus dalam list. Selain lebih rapi secara struktur, ini juga membantu aksesibilitas, misalnya untuk pengguna pembaca layar (screen reader) yang mengandalkan struktur HTML untuk memahami konten halaman.
Kedua, jangan lupakan baris <meta name="viewport" content="width=device-width, initial-scale=1.0"> di bagian <head>. Baris ini sering banget dilupakan pemula, padahal perannya krusial. Tanpa baris ini, browser di HP akan merender halaman seolah-olah sedang menampilkan layar desktop, lalu di-zoom out otomatis supaya muat. Akibatnya, media query yang nanti kita buat di CSS jadi tidak berfungsi sama sekali, karena browser menganggap lebar layarnya tetap besar walaupun fisiknya kecil.
Langkah 2: Terapkan Flexbox di Container Utama
Sekarang masuk ke bagian intinya. Kita ubah elemen .navbar jadi flex container:
/* Reset dasar, biar nggak ada padding/margin bawaan browser yang bikin kaget */
* {
margin: 0;
padding: 0;
box-sizing: border-box; /* padding & border dihitung dari DALAM lebar elemen */
}
.navbar {
display: flex; /* kunci utama: aktifkan mode flex container */
justify-content: space-between; /* logo nempel kiri, cta nempel kanan */
align-items: center; /* semua elemen sejajar vertikal di tengah */
padding: 16px 32px;
background-color: #8e293b;
}
.logo {
color: white;
font-size: 20px;
font-weight: bold;
}
Tiga baris di dalam .navbar inilah yang melakukan semua pekerjaan berat:
display: flex mengubah navbar menjadi flex container. Begitu baris ini ditulis, semua anak langsungnya, yaitu .logo, .nav-links, dan .btn-cta, otomatis tersusun sejajar secara horizontal tanpa perlu kode tambahan apapun.
justify-content: space-between mengatur jarak antar elemen di sepanjang sumbu utama (dalam hal ini horizontal), dengan elemen pertama menempel di sisi kiri dan elemen terakhir menempel di sisi kanan, sementara elemen di tengah-tengahnya diberi jarak yang merata secara otomatis.
align-items: center menyejajarkan semua elemen secara vertikal di tengah, jadi nggak ada elemen yang posisinya naik-turun tidak rapi meskipun tingginya berbeda-beda, misalnya tombol dengan padding yang lebih besar dari teks link biasa.

Coba refresh browser kamu sekarang. Logo, menu, dan tombol harusnya sudah sejajar rapi dalam satu baris, dengan jarak yang proporsional, tanpa perlu itung-itungan lebar sama sekali. Inilah kekuatan utama Flexbox, kamu cukup mendeskripsikan hasil akhir yang diinginkan, dan browser yang menghitung detail teknisnya.
Langkah 3: Rapikan Menu Link-nya
List menu masih punya bullet point dan padding bawaan browser yang perlu dibersihkan dulu. Selain itu, karena <ul> secara default juga tersusun vertikal ke bawah (masing-masing <li> di baris terpisah), kita perlu menjadikannya flex container juga supaya link-linknya berjajar horizontal.
.nav-links {
display: flex; /* <ul> ikut dijadikan flex container juga */
list-style: none; /* hilangkan bullet point bawaan <li> */
gap: 24px; /* jarak antar menu, tanpa perlu margin manual */
}
.nav-links a {
text-decoration: none;
color: white;
font-weight: 500;
transition: color 0.2s ease; /* animasi halus saat hover */
}
.nav-links a:hover {
color: #38bdf8;
}
Perhatikan properti gap: 24px di sini. Ini salah satu fitur paling enak dari Flexbox modern, dulu sebelum properti gap didukung luas, developer harus memberi margin-right satu per satu ke tiap item, dan biasanya item terakhir perlu dikecualikan supaya nggak ada margin berlebih di ujung. Sekarang, cukup satu baris gap untuk mengatur jarak semua elemen sekaligus secara konsisten.

Kita juga menambahkan sedikit sentuhan interaktif dengan :hover dan transition, supaya ketika pengunjung mengarahkan kursor ke salah satu menu, ada perubahan warna yang halus. Detail kecil seperti ini yang bikin sebuah navbar terasa lebih matang dan profesional, bukan cuma terlihat rapi secara struktur.
Langkah 4: Styling Tombol Call-to-Action
Tombol “Daftar” juga perlu sedikit polesan supaya nggak terlihat seperti tombol bawaan browser yang polos:
.btn-cta {
background-color: #38bdf8;
color: #1e293b;
border: none;
padding: 8px 20px;
border-radius: 6px;
font-weight: 600;
cursor: pointer;
transition: background-color 0.2s ease;
}
.btn-cta:hover {
background-color: #0ea5e9;
}

Sampai tahap ini, navbar kamu di layar desktop harusnya sudah terlihat rapi: logo di kiri, menu di tengah dengan jarak konsisten, dan tombol aksi yang menonjol di kanan. Tapi ini baru setengah jalan, karena kita belum menyentuh bagian yang paling sering bikin developer pemula stres: membuatnya responsive di layar kecil.
Langkah 5: Bikin Responsive dengan Media Query
Ini bagian yang biasanya bikin orang stres, padahal sebenarnya cukup sederhana kalau fondasi Flexbox-nya sudah benar dari awal. Yang perlu kita lakukan cuma mengubah arah susunan flex dari horizontal menjadi vertikal ketika lebar layar mengecil, menggunakan media query.
/* Aktif otomatis kalau lebar layar 768px ke bawah (tablet & HP) */
@media (max-width: 768px) {
.navbar {
flex-direction: column; /* dari baris → jadi tumpukan ke bawah */
align-items: flex-start; /* rata kiri, bukan center lagi */
gap: 16px;
}
.nav-links {
flex-direction: column; /* menu juga ikut ditumpuk ke bawah */
gap: 12px;
width: 100%;
}
.btn-cta {
width: 100%; /* tombol memenuhi lebar layar */
}
}
Dokumentasi breakpoint: angka 768px di sini menandai batas antara tampilan “mobile/tablet” dan “desktop”. Kamu bebas ubah angkanya, misalnya 640px kalau target utamanya HP saja, atau tambah breakpoint kedua (480px) kalau mau penyesuaian lebih detail lagi untuk HP layar kecil.
Perhatikan, kita cuma mengganti flex-direction dari row (nilai default) menjadi column. Itu saja perubahan intinya. Semua elemen yang tadinya berjajar horizontal, sekarang otomatis tersusun ke bawah secara vertikal, tanpa perlu mengatur ulang posisi masing-masing elemen secara manual satu per satu. Inilah kenapa memahami logika Flexbox jauh lebih penting daripada menghafal kodenya, karena begitu kamu paham, membuat versi responsive-nya jadi terasa hampir otomatis.
Sebelum :

Sesudah :

Coba resize browser kamu pelan-pelan dari lebar ke sempit, atau buka lewat DevTools dalam mode responsive (biasanya diakses lewat tombol ikon HP/tablet di pojok DevTools browser). Kamu akan melihat navbar berubah bentuk secara halus begitu lebar layarnya turun di bawah 768 piksel, dari tersusun horizontal menjadi tersusun vertikal ke bawah.
Angka 768px sendiri bukan angka sakral yang harus selalu dipakai. Itu cuma titik breakpoint yang umum dipakai untuk membedakan tampilan tablet ke bawah dengan desktop. Kamu bisa menyesuaikannya sesuai kebutuhan desain, misalnya 640px kalau targetnya lebih fokus ke HP saja.
Kesalahan yang Sering Bikin Navbar Berantakan
Setelah paham langkah-langkah di atas, ada beberapa kesalahan umum yang sering bikin navbar yang katanya sudah “responsive” tapi tetap berantakan begitu dibuka di HP asli:
Yang pertama, lupa memasang viewport meta tag seperti yang sudah disinggung sebelumnya. Ini kesalahan paling sering terjadi dan paling membingungkan, karena di komputer terlihat baik-baik saja, tapi begitu dibuka di HP sungguhan, seluruh media query seperti tidak berfungsi. Selalu cek dulu baris ini ada di <head> sebelum menuduh CSS-nya yang salah.
Yang kedua, menggunakan lebar fixed dalam satuan piksel untuk elemen di dalam navbar. Kalau logo atau tombolnya diberi width: 300px misalnya, dia tidak akan menyesuaikan ukurannya di layar yang lebih kecil dari itu, dan akan menyebabkan overflow horizontal yang bikin ada scroll ke samping yang tidak diinginkan. Lebih aman menggunakan max-width, satuan persen, atau membiarkan Flexbox yang mengatur ukurannya secara otomatis.
Yang ketiga, tidak melakukan testing di ukuran layar yang beragam. Menyempitkan window browser di laptop itu memang membantu, tapi beda dengan menguji di HP asli. Kadang ada elemen yang terlihat pas di simulasi DevTools, tapi ternyata sedikit kepotong atau overlap ketika dibuka di device sungguhan, karena perbedaan rendering antar browser dan perangkat.
Yang keempat, lupa mengatur box-sizing: border-box. Tanpa properti ini, padding dan border sebuah elemen akan ditambahkan ke lebar total elemen, bukan dihitung dari dalam. Ini bisa menyebabkan perhitungan lebar jadi meleset, terutama pada elemen seperti tombol yang punya padding besar.
Sedikit Sentuhan Ekstra: Hamburger Menu
Kalau kamu mau navbar-nya terasa lebih rapi dan modern lagi, biasanya di layar kecil menu .nav-links disembunyikan dulu, dan baru muncul ketika tombol hamburger (ikon tiga garis) diklik. Ini butuh sedikit JavaScript untuk toggle class, tapi fondasi CSS Flexbox yang sudah kita buat di atas tetap dipakai, cuma ditambah logika show/hide.
Contoh sederhananya seperti ini:
<!-- onclick toggle class 'active' di .nav-links tiap kali tombol diklik -->
<button class="hamburger" onclick="document.querySelector('.nav-links').classList.toggle('active')">
☰
</button>
.hamburger {
display: none; /* default: disembunyikan di layar desktop */
background: none;
border: none;
font-size: 24px;
color: white;
cursor: pointer;
}
@media (max-width: 768px) {
.hamburger {
display: block; /* tombol hamburger baru muncul di layar kecil */
}
.nav-links {
display: none; /* menu default tersembunyi di layar kecil */
flex-direction: column;
}
.nav-links.active {
display: flex; /* muncul lagi begitu class 'active' ditambahkan JS */
}
}
Dokumentasi alur hamburger menu: tombol diklik → JavaScript menambah/menghapus class active di .nav-links → CSS .nav-links.active mengubah display: none jadi display: flex → menu muncul/hilang. Tiga potongan kode ini saling terhubung lewat nama class active, jadi pastikan penulisannya konsisten di ketiganya.

Perhatikan bagaimana kita memanfaatkan display: none sebagai kondisi awal di layar kecil, lalu class .active yang ditambahkan lewat JavaScript mengubahnya kembali menjadi display: flex. Kombinasi ini yang membuat menu bisa disembunyikan dan dimunculkan sesuai interaksi pengguna, tanpa kehilangan struktur flex yang sudah dibangun sebelumnya. Ini bisa jadi topik latihan lanjutan setelah kamu benar-benar menguasai navbar dasar yang sudah dibuat di langkah-langkah sebelumnya.
Kenapa Pemahaman Ini Penting di Dunia Kerja
Mungkin terlihat sepele, cuma navbar. Tapi di dunia kerja nyata sebagai front-end developer, navbar adalah salah satu komponen yang paling sering dikerjakan ulang, direvisi, dan disesuaikan dengan berbagai breakpoint layar. Kalau fondasi pemahaman Flexbox-mu kuat, mengerjakan revisi semacam ini akan terasa cepat dan tidak bikin stres. Sebaliknya, kalau dasar Flexbox-nya lemah dan hanya mengandalkan hafalan dari framework, begitu ada requirement yang sedikit di luar kebiasaan, kamu akan kesulitan menyesuaikannya.
Selain itu, memahami Flexbox secara native juga membuatmu tidak terlalu bergantung pada framework CSS seperti Bootstrap atau Tailwind. Framework-framework itu sebenarnya di baliknya juga menggunakan Flexbox atau Grid, cuma dibungkus dalam class-class siap pakai. Kalau kamu paham konsep dasarnya, kamu akan lebih cepat beradaptasi dengan framework apapun, karena kamu mengerti apa yang sebenarnya terjadi di balik class-class tersebut, bukan sekadar menghafal nama class tanpa tahu efeknya.
Kesimpulan
Navbar responsive sebenarnya bukan soal menghafal banyak baris kode, tapi soal memahami logika sederhana di baliknya: susun elemen secara horizontal ketika layar besar, lalu ubah menjadi vertikal ketika layar mengecil. Flexbox cuma alat yang membuat logika sederhana itu bisa ditulis dengan sedikit baris kode, tanpa perlu perhitungan lebar yang rumit seperti pendekatan lama.
Kalau dirangkum, ada lima langkah utama yang sudah kita bahas: menyiapkan struktur HTML yang semantik, menjadikan navbar sebagai flex container, merapikan menu link dengan flex dan gap, mempercantik tombol aksi, dan terakhir menerapkan media query untuk mengubah arah susunan di layar kecil. Kelima langkah ini adalah pola yang bisa kamu pakai berulang-ulang untuk hampir semua kebutuhan navbar, apapun desainnya.
Coba sekarang, buka text editor kamu, dan praktikkan langkah-langkah di atas satu per satu, jangan cuma dibaca. Ubah warnanya sesuai selera, tambahkan logo pakai gambar, atau eksperimen dengan breakpoint yang berbeda dari 768px. Semakin sering kamu utak-atik sendiri dan melihat langsung efeknya di browser, semakin cepat kamu hafal pola-pola Flexbox secara natural, tanpa perlu bolak-balik membuka dokumentasi setiap kali menemukan kasus baru.
Penulis : Sandya Gifta Ulimaz Sofiamagaski
