آموزش طراحی سایت و برنامهنویسی وب
سورس کد منو سایت متحرک با اندیکاتور لغزنده (HTML، CSS و JS)
- در این منو، بهجای تغییر رنگ ساده، یک نشانگر (Indicator) نرم زیر گزینهٔ فعال یا هاورشده میلغزد.
- موقعیت نشانگر با
offsetLeftوoffsetWidthهر گزینه محاسبه میشود و باtransformجابهجا میشود تا روان باشد. - آیکونها SVG داخلی هستند؛ یعنی به هیچ CDN یا فونت آیکون نیاز ندارید.
- در موبایل متن گزینهها پنهان میشود و منو به نوار آیکونی تبدیل میشود.
منوی سایت اولین چیزی است که کاربر با آن کار میکند؛ یک حرکت کوچک و درست در منو، حس حرفهای بودن سایت را بالا میبرد. در این مطلب از طاووس وب سورس کد یک منو سایت متحرک مینیمال را میسازیم که نشانگرش زیر گزینهٔ انتخابشده میلغزد. نسخهٔ قبلی این سورس که با آیکونهای Unicons ساخته شده بود در پیشنمایش اولیه در دسترس است؛ نسخهٔ این مطلب آیکونها را داخل خود کد دارد و سبکتر است.
دموی زنده منو متحرک
روی گزینهها بروید یا کلیک کنید
عرض پنجره را کم کنید تا نسخهٔ موبایل (فقط آیکون) را ببینید. با کلید Tab هم میتوانید بین گزینهها جابهجا شوید.
کد HTML منو
منو یک تگ nav با چند لینک است و نشانگر یک span خالی است که پشت لینکها قرار میگیرد. aria-current صفحهٔ فعلی را به صفحهخوان اعلام میکند:
<nav class="menu" aria-label="منوی اصلی">
<span class="indicator" aria-hidden="true"></span>
<a href="/" class="active" aria-current="page">
<svg><!-- آیکون خانه --></svg><span>خانه</span>
</a>
<a href="/services/"><svg><!-- آیکون --></svg><span>خدمات</span></a>
<a href="/blog/"><svg><!-- آیکون --></svg><span>مقالات</span></a>
<a href="/contact/"><svg><!-- آیکون --></svg><span>تماس</span></a>
</nav>برای آیکونها میتوانید SVG هر مجموعهٔ آیکون آزاد (مثل Unicons یا Lucide) را مستقیم کپی کنید. قرار دادن SVG داخل HTML یک درخواست شبکه و یک فونت آیکون سنگین را حذف میکند.
کد CSS منو و نشانگر
.menu {
position: relative;
display: flex; gap: 4px;
padding: 6px;
background: #fff;
border-radius: 18px;
box-shadow: 0 12px 30px rgba(95,1,175,.08);
}
.menu a {
position: relative; z-index: 1; /* بالای نشانگر */
flex: 1;
display: flex; align-items: center; justify-content: center; gap: 8px;
padding: 12px 8px;
border-radius: 14px;
color: #6d5d86; font-weight: 700; text-decoration: none;
transition: color .25s;
}
.menu a.active, .menu a:hover { color: #fff; }
.menu a:focus-visible { outline: 3px solid #C9A3F5; outline-offset: 2px; }
.indicator {
position: absolute; top: 6px; bottom: 6px; left: 0;
border-radius: 14px;
background: linear-gradient(135deg, #8224E3, #5F01AF);
transition: transform .3s cubic-bezier(.3,.8,.3,1),
width .3s cubic-bezier(.3,.8,.3,1);
}
/* موبایل: فقط آیکون */
@media (max-width: 560px) {
.menu a span { display: none; }
}کد جاوااسکریپت حرکت نشانگر
تابع move عرض و موقعیت نشانگر را هماندازهٔ گزینهٔ هدف میکند. چون از left و translateX استفاده میکنیم، محاسبه در صفحهٔ راستبهچپ هم درست است:
const menu = document.querySelector('.menu');
const indicator = menu.querySelector('.indicator');
const links = menu.querySelectorAll('a');
function move(link) {
indicator.style.width = link.offsetWidth + 'px';
indicator.style.transform = `translateX(${link.offsetLeft}px)`;
}
const active = () => menu.querySelector('a.active');
links.forEach((link) => {
link.addEventListener('mouseenter', () => move(link));
link.addEventListener('focus', () => move(link));
});
// با خروج ماوس، نشانگر به گزینهٔ فعال برمیگردد
menu.addEventListener('mouseleave', () => move(active()));
// با تغییر اندازهٔ پنجره، دوباره محاسبه شود
addEventListener('resize', () => move(active()));
move(active());در سایت واقعی، کلاس active را سمت سرور روی لینک صفحهٔ فعلی قرار دهید (وردپرس بهطور خودکار کلاس current-menu-item را اضافه میکند). اگر از این کلاس وردپرس استفاده میکنید، در تابع active همان را جستوجو کنید.
اصول انیمیشن منو که نباید فراموش کنید
- کوتاه و نرمانیمیشن منو باید بین ۲۰۰ تا ۳۰۰ میلیثانیه باشد. حرکت کندتر، کاربر را منتظر نگه میدارد.
- فقط transform و widthنشانگر با transform جابهجا میشود که روی GPU اجرا میشود و حتی در گوشیهای ضعیف روان است.
- کیبورد و صفحهخوانرویداد focus همان حرکت هاور را برای کاربران کیبورد اجرا میکند و
aria-currentصفحهٔ فعلی را اعلام میکند. - هدف لمسی بزرگدر موبایل هر گزینه باید حداقل ۴۴ پیکسل ارتفاع داشته باشد تا با انگشت بهراحتی انتخاب شود.

اگر به منوی کشویی همبرگری برای موبایل نیاز دارید، سورس کد منو ریسپانسیو موبایل را ببینید. برای مرتب کردن گزینههای منو کنار هم هم آموزش Flexbox توضیح کاملی دارد.
منوی سایت شما کاربر را به مقصد میرساند؟طاووس وب ساختار منو و مسیر حرکت کاربر را طوری طراحی میکند که بازدیدکننده سریع به صفحهٔ خرید یا تماس برسد.
خدمات طراحی سایتسؤالات متداول منو سایت متحرک
آیا منوی متحرک روی سئو اثر دارد؟
انیمیشن بهتنهایی اثری ندارد؛ مهم این است که لینکها تگ a واقعی با آدرس درست باشند تا گوگل آنها را دنبال کند. این سورس همین ساختار را دارد.
چطور این منو را در وردپرس استفاده کنم؟
سادهترین راه، ساخت منو در بخش نمایش > فهرستها و افزودن CSS و JS این مطلب با تغییر نام کلاسها به کلاسهای منوی قالب است. در المنتور هم میتوانید HTML را در ابزارک HTML قرار دهید.
چرا نشانگر بعد از تغییر اندازهٔ صفحه جابهجا میشود؟
چون عرض گزینهها عوض شده است؛ رویداد resize در کد، موقعیت نشانگر را دوباره محاسبه میکند.
میتوانم بهجای پسزمینه، یک خط زیر گزینه داشته باشم؟
بله؛ top را حذف کنید، height نشانگر را ۳ پیکسل بگذارید و bottom: 0 بدهید تا به خط زیرین لغزنده تبدیل شود.
آیکونها از کجا آمدهاند؟
آیکونهای دمو ساده و داخل کد رسم شدهاند. میتوانید SVG هر مجموعهٔ آیکون آزاد مثل Unicons را جایگزین کنید.