ساخت نوبار حرفهای با Flexbox (پروژه گام به گام)

ساخت نوبار حرفهای با Flexbox (پروژه گام به گام)
پروژه عملی: ساخت Navbar ریسپانسیو با Flexbox! 🎨
سلام به همگی! تا اینجا کلی در مورد Flexbox یاد گرفتیم. الان وقتشه که دست به کار بشیم و یه پروژهی واقعی بسازیم! قراره یه Navbar (منوی ناوبری) بسازیم که هم زیبا باشه و هم با اندازههای مختلف صفحه نمایش (ریسپانسیو) خودش رو تطبیق بده. Flexbox اینجا قهرمان ماست! آمادهاید که با هم کد بزنیم و یه Navbar خفن بسازیم؟ 💪
1. ساختار HTML: پایه و اساس Navbar 🏗️
اول از همه، یه ساختار ساده HTML برای Navbarمون درست میکنیم. یه تگ <nav>
به عنوان کانتینر اصلی، یه لوگو (میتونه یه تگ <a>
با متن یا عکس باشه) و یه لیست از لینکهای ناوبری (<ul>
و <li>
).
<nav class="main-navbar">
<a href="#" class="navbar-logo">لوگو من</a>
<ul class="navbar-links">
<li><a href="#">خانه</a></li>
<li><a href="#">درباره ما</a></li>
<li><a href="#">خدمات</a></li>
<li><a href="#">تماس با ما</a></li>
</ul>
<!-- دکمه منو برای موبایل (اول مخفی است) -->
<button class="menu-toggle" aria-label="باز کردن منو">
☰
</button>
</nav>
دکمه منو (
.menu-toggle
) رو فعلاً با سه خط افقی (☰) نشون دادیم. بعداً با CSS کاری میکنیم که فقط در موبایل دیده بشه.
2. استایلدهی اولیه و فعال کردن Flexbox 🖌️
حالا میریم سراغ CSS. اول چندتا استایل پایهای برای حذف مارجین و پدینگ پیشفرض مرورگرها و تنظیم رنگها میدیم. بعد، کانتینر اصلی Navbar (.main-navbar
) رو به یه فلکس کانتینر تبدیل میکنیم.
/* استایلهای عمومی */
body {
margin: 0;
font-family: 'vazir', sans-serif;
direction: rtl; /* برای فارسی */
}
a {
text-decoration: none;
color: inherit; /* ارثبری رنگ */
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
/* استایل Navbar */
.main-navbar {
display: flex; /* فعال کردن فلکس! */
justify-content: space-between; /* لوگو سمت چپ، لینکها سمت راست */
align-items: center; /* همه آیتمها در وسط عمودی */
background-color: #00897b; /* یه رنگ سبز تیره */
padding: 10px 20px; /* پدینگ بالا/پایین و چپ/راست */
color: white; /* رنگ متن */
position: relative; /* برای قرار دادن منوی موبایل */
}
.navbar-logo {
font-size: 1.5em;
font-weight: bold;
}
.navbar-links {
display: flex; /* لینکها هم خودشون یه فلکس کانتینر میشن */
}
.navbar-links li {
margin-left: 20px; /* فاصله بین لینکها */
}
.navbar-links a {
padding: 8px 15px;
transition: background-color 0.3s ease; /* انیمیشن ظریف موقع هاور */
}
.navbar-links a:hover {
background-color: #00695c; /* تغییر رنگ موقع هاور */
border-radius: 4px;
}
.menu-toggle {
display: none; /* در دسکتاپ مخفی است */
background: none;
border: none;
color: white;
font-size: 1.8em;
cursor: pointer;
}
با
justify-content: space-between;
وalign-items: center;
، لوگو و لینکها به طور خودکار در دو سمت و وسط عمودی قرار گرفتن! خیلی راحت!
3. استایلدهی برای موبایل و واکنشگرایی 📱
حالا وقتشه که Navbar رو برای صفحههای کوچکتر (موبایل) آماده کنیم. وقتی صفحه کوچیک میشه، لینکهای افقی جا نمیشن. پس باید اونها رو زیر هم ببریم و دکمه منو رو نشون بدیم. برای این کار از Media Queries استفاده میکنیم.
/* استایلهای مخصوص موبایل (مثلاً وقتی عرض صفحه کمتر از 768 پیکسل است) */
@media (max-width: 768px) {
.navbar-links {
flex-direction: column; /* لینکها رو ستونی کن */
width: 100%; /* کل عرض رو بگیره */
position: absolute; /* بالای صفحه */
top: 60px; /* زیر نوار Navbar */
left: 0;
background-color: #00897b;
padding: 10px 0;
display: none; /* اول مخفی باشه */
}
.navbar-links.active {
display: flex; /* وقتی کلاس active گرفت، نمایش داده بشه */
}
.navbar-links li {
margin: 10px 0; /* فاصله عمودی بین آیتمها */
width: 100%;
text-align: center;
}
.navbar-links a {
padding: 10px;
width: 100%;
display: block; /* لینکها هم بلوکی بشن */
}
.menu-toggle {
display: block; /* دکمه منو رو نشون بده */
}
}
4. اضافه کردن قابلیت باز و بسته شدن منو با جاوااسکریپت 🖱️
برای اینکه منوی موبایل با کلیک روی دکمه باز و بسته بشه، یه کم جاوااسکریپت لازم داریم. این کد خیلی ساده است: وقتی روی دکمه کلیک میشه، کلاس .active
به لیست لینکها اضافه یا حذف میشه.
const menuToggle = document.querySelector('.menu-toggle');
const navbarLinks = document.querySelector('.navbar-links');
menuToggle.addEventListener('click', () => {
navbarLinks.classList.toggle('active');
// تغییر آیکون منو (اختیاری)
if (navbarLinks.classList.contains('active')) {
menuToggle.textContent = '✕'; // بستن
menuToggle.setAttribute('aria-label', 'بستن منو');
} else {
menuToggle.textContent = '☰'; // باز کردن
menuToggle.setAttribute('aria-label', 'باز کردن منو');
}
});
با اضافه کردن کلاس
.active
، اون قوانین CSS که برای نمایش منوی موبایل نوشتیم (display: flex;
) فعال میشن و منو ظاهر میشه.
5. نتیجه نهایی و نکات تکمیلی 🎉
تبریک! 🎉 شما یه Navbar ریسپانسیو با استفاده از Flexbox ساختید! در حالت دسکتاپ، لینکها در کنار لوگو قرار دارن و در موبایل، با کلیک روی دکمه منو، لینکها به صورت عمودی زیر هم میان.
نکات تکمیلی:
- میتونید با استفاده از
flex-grow: 1;
روی لینکها، کاری کنید که لوگو همیشه به چپ بچسبه و لینکها فضای باقیمونده رو پر کنن. - برای بهبود دسترسیپذیری (Accessibility)، از
aria-label
برای دکمه منو استفاده کردیم. - اضافه کردن انیمیشنهای CSS موقع باز و بسته شدن منو، ظاهر حرفهایتری بهش میده.
همینطور که دیدید، Flexbox چقدر کار رو برای ساخت Layoutهای پیچیده و ریسپانسیو ساده میکنه. حالا میتونید این الگو رو در پروژههای دیگه هم به کار ببرید! آفرین به شما! 🌟
مقالات مرتبط
آخرین مقالات
کدهای تمیز: با متغیرها، CSS را هوشمند کنید! 💡
متغیرهای CSS (Custom Properties): کد تمیزتر، مدیریت راحتتر! 🎨 سلام به همگی! توی پروژههای CSS، خیلی وقتا پیش میاد که یه رنگ، یه فونت، یا یه فاصله رو بارها و بارها توی جاهای مختلف استفاده میکنیم. مثلاً رنگ اصلی سایتمون...
ساخت انیمیشنهای حرفهای با @keyframes (گام به گام)
CSS Animations: خلق انیمیشنهای پیچیده با @keyframes! 🎬 سلام به همگی! تا الان با Transitionها آشنا شدیم که تغییرات بین دو حالت رو نرم میکنن. اما اگه بخوایم انیمیشنهای پیچیدهتر، چند مرحلهای، یا حتی انیمیشنهایی که مدام تکرار میشن رو...
دگرگونی سایت با CSS: چرخش، تغییر اندازه و جابجایی
CSS Transforms: جابجایی، چرخش، تغییر اندازه و کج کردن عناصر! 🤸♀️ سلام دوستان! تا اینجا با انیمیشنهای نرم و پیوسته (Transitions) آشنا شدیم. اما گاهی وقتها نیاز داریم که عناصر HTML رو جابجا کنیم، بچرخونیم، اندازهشون رو عوض کنیم یا...
انتقالهای نرم: عناصر خود را متحرک کنید!
CSS Transitions: جادوی حرکت نرم و روان! ✨ سلام به همه! تا حالا شده یه سایت رو ببینید که با هاور کردن روی یه دکمه، رنگش نرم و قشنگ عوض میشه؟ یا با تغییر اندازه یه عنصر، انیمیشن ظریفی رو...