چگونه هدر چسبنده (Sticky Header) هوشمند بسازیم که هنگام اسکرول مخفی شود؟
⭐ نقشه راه: ساخت هدر هوشمند در یک نگاه ⭐
💡 مرحله ۱: HTML پایه
ساختار اصلی هدر و محتوای صفحه رو میچنیم.
- <header> و <nav>
- محتوای کافی برای اسکرول
💡 مرحله ۲: CSS چسبنده
هدر رو با CSS چسبنده میکنیم و استایل میدیم.
position: fixed;top: 0;transitionبرای انیمیشن
💡 مرحله ۳: JavaScript هوشمند
منطق نمایش/مخفیسازی هدر رو با JS پیاده میکنیم.
- ردیابی جهت اسکرول
- اضافه/حذف کلاسهای CSS
💡 مرحله ۴: بهینهسازی و نکات
بهبود تجربه کاربری و حل مشکلات رایج.
- رسپانسیو بودن
- عملکرد و دسترسیپذیری
- رفع اشکال
رفیق برنامهنویس، تا حالا شده توی یه سایت بچرخی و ببینی هدرش موقع اسکرول به پایین غیب میشه و فقط وقتی به بالا اسکرول میکنی دوباره ظاهر میشه؟ این قابلیت نه تنها خفن به نظر میرسه، بلکه تجربه کاربری (UX) رو هم حسابی ارتقا میده. به این میگن “هدر چسبنده هوشمند” (Sticky Header). امروز میخوام مرحله به مرحله با هم بسازیمش، از پایه تا پیشرفته. آمادهای؟ بزن بریم!
ضمناً، اگه دنبال ابزارهای خفن و کدهای آمادهای که کارت رو راه بندازه، یه سر به فروشگاه ابزارهای ما بزن. شاید همون چیزی که دنبالشی اونجا باشه!
چرا هدر چسبنده هوشمند، اصلاً چی هست و چرا لازمه؟
خب، قبل از اینکه دست به کد بشیم، بیاید ببینیم این هدر چیه و چرا باید هوشمندش کنیم. هدر چسبنده یا Sticky Header همون نوار بالای سایتته که وقتی اسکرول میکنی، همیشه بالا ثابت میمونه. مزیتش اینه که کاربر هر جا باشه، همیشه به منوها و بخشهای اصلی سایت دسترسی داره.
حالا هوشمند بودنش از کجا میاد؟ اگه هدر همیشه بالا باشه، مخصوصاً تو موبایل که صفحه کوچیکه، ممکنه فضای زیادی رو اشغال کنه و مانع دید محتوا بشه. هدر هوشمند کاری میکنه که وقتی کاربر داره به سمت پایین اسکرول میکنه (یعنی میخواد محتوا بخونه)، هدر محو شه یا به بالا بره تا صفحه بیشتری در اختیار محتوا باشه. اما به محض اینکه کاربر کمی به سمت بالا اسکرول کرد (یعنی احتمالا دنبال منو یا جستجوئه)، هدر دوباره ظاهر میشه. این یعنی یه UX بینظیر!
مزایای هدر هوشمند:
- افزایش فضای محتوا: به خصوص در دستگاههای کوچکتر مثل موبایل، با پنهان شدن هدر، کاربر فضای بیشتری برای دیدن محتوا در اختیار داره.
- دسترسی سریع به ناوبری: کاربر هر وقت که بخواد به منوها دسترسی پیدا کنه، فقط کافیه کمی به بالا اسکرول کنه و هدر سریع ظاهر میشه.
- تجربه کاربری روانتر: این نوع طراحی حس مدرن و صیقلی بودن به سایت میده و کاربر احساس کنترل بیشتری داره.
- زیبایی بصری: انیمیشنهای ظریف ورود و خروج هدر، ظاهر سایت رو جذابتر میکنه.
شروع کار: HTML، CSS و JavaScript، سه یار جدا نشدنی
برای ساخت هدر هوشمندمون، به مثلث طلایی توسعه وب نیاز داریم: HTML برای ساختار، CSS برای زیبایی و چسبندگی اولیه، و JavaScript برای هوشمندی.
مرحله ۱: ساختار HTML (فونداسیون کار)
اول از همه، یه فایل index.html بساز و کدهای زیر رو توش کپی کن. این فونداسیون هدر و محتوای اصلی صفحهمونه. دقت کن که برای تست، به محتوای کافی نیاز داریم تا صفحه قابل اسکرول باشه.
function copyCode(button, elementId) {
var codeElement = document.getElementById(elementId);
var textToCopy = codeElement.textContent || codeElement.innerText;
var tempTextArea = document.createElement(“textarea”);
tempTextArea.value = textToCopy;
document.body.appendChild(tempTextArea);
tempTextArea.select();
document.execCommand(“copy”);
document.body.removeChild(tempTextArea);
button.textContent = “کپی شد!”;
setTimeout(() => {
button.textContent = “کپی کد”;
}, 2000);
}
توی این کد:
-
یه تگ
<header>باid="smartHeader"داریم که قراره هدر هوشمندمون باشه. -
داخل هدر، یه لوگو و یه منوی ناوبری
<nav>ساده داریم. -
سه بخش
<section>با محتوای زیاد گذاشتم تا صفحه به اندازه کافی بلند باشه و بتونیم اسکرول کنیم. اینجوری رفتار هدر رو بهتر میتونیم تست کنیم. -
فایلهای
style.cssوscript.jsرو هم لینک کردیم که قراره تو مراحل بعدی پرشون کنیم.
مرحله ۲: استایلدهی با CSS (چسبندگی و زیبایی)
حالا نوبت فایل style.css هست. یه فایل به همین اسم کنار index.html بساز و کدهای زیر رو توش بریز. این استایلها هدر رو چسبنده میکنن و ظاهرش رو هم قشنگتر میکنن. مهمترین بخش اینجا position: fixed; هست که هدر رو به بالای صفحه میچسبونه.
چند نکته مهم در مورد این CSS:
-
position: fixed; top: 0; left: 0; width: 100%;هدر رو در بالای صفحه ثابت نگه میداره. -
z-index: 1000;مطمئن میشه که هدر همیشه روی بقیه محتوا قرار بگیره. -
transition: top 0.3s ease-in-out;این باعث میشه وقتی هدر مخفی میشه یا ظاهر میشه، به جای اینکه یهو غیب و ظاهر شه، یه انیمیشن نرم و قشنگ داشته باشه. -
کلاس
.hideرو تعریف کردیم که باtop: -100px;(یا هر مقداری بیشتر از ارتفاع هدرت) هدر رو از دید خارج کنه. JavaScript قراره این کلاس رو اضافه و حذف کنه. -
.main-content { padding-top: 80px; }خیلی مهمه! چون هدر از جریان سند (document flow) خارج شده و ثابت شده، محتوای اصلی به زیرش میره. با اینpadding-top، محتوا رو از زیر هدر بیرون میکشیم. این مقدار رو باید با ارتفاع هدرت تنظیم کنی. -
بخش
@media (max-width: 768px)هم برای رسپانسیو بودن هدر در موبایل و تبلت هست که مطمئن شیم تو همه دستگاهها خوب به نظر میرسه. یادت باشه که این جزئیات طراحی، برای رسپانسیو بودن برای موبایل و تبلت و لپتاب و حتی تلوزیون حیاتیه.
مرحله ۳: منطق هوشمند با JavaScript
اینجا قلب تپنده هدر هوشمندمونه. یه فایل script.js بساز و کدهای زیر رو توش بنویس. این کد میفهمه که کاربر داره به کدوم سمت اسکرول میکنه و بر اساس اون، کلاس .hide رو به هدر اضافه یا ازش حذف میکنه.
شرح کد جاوااسکریپت:
-
DOMContentLoaded: مطمئن میشه که کد جاوااسکریپت بعد از بارگذاری کامل DOM اجرا میشه. -
header: عنصر هدر رو انتخاب میکنه. -
lastScrollY: آخرین موقعیت عمودی اسکرول رو نگهداری میکنه تا بتونیم جهت اسکرول رو تشخیص بدیم. -
headerHeight: ارتفاع هدر رو میگیریم که برای محاسبه دقیقتر نقطه شروع مخفی شدن هدر، لازمه. -
scrollThreshold: یه آستانه رو مشخص میکنه. مثلاً اگه فقط ۱۰ پیکسل اسکرول کردی، هدر قایم نشه یا ظاهر نشه که یه حس لرزش به کاربر نده. حداقل ۵۰ پیکسل پیشنهاد میشه. -
window.addEventListener('scroll', ...): به رویداد اسکرول گوش میده. هر وقت صفحه اسکرول شه، تابع داخلش اجرا میشه. -
داخل تابع،
currentScrollYموقعیت فعلی اسکرول رو میگیره. -
چند تا شرط داریم:
-
اگه
currentScrollY === 0بود (یعنی کاربر به بالای صفحه برگشته)، هدر رو نشون بده. -
اگه
currentScrollY > lastScrollYبود (اسکرول به پایین) و از یه آستانه مشخصی عبور کرد، هدر رو مخفی کن (header.classList.add('hide')). -
اگه
currentScrollY < lastScrollYبود (اسکرول به بالا)، هدر رو نشون بده (header.classList.remove('hide')).
-
اگه
-
در نهایت،
lastScrollYرو بهروزرسانی میکنیم برای مقایسه در اسکرول بعدی.
نکات پیشرفته و بهینهسازی (برای یه برنامهنویس خفن!)
کارمون تا اینجا اوکیه، ولی همیشه میشه بهترش کرد. یه برنامهنویس واقعی فقط به عملکرد فکر نمیکنه، بلکه به پرفورمنس، دسترسیپذیری و مقیاسپذیری هم اهمیت میده.
۱. پرفورمنس: throttling یا debouncing (مهمه!)
رویداد scroll خیلی سریع و بارها اجرا میشه. اگه منطق سنگینی داخلش داشته باشی، ممکنه سایت کند شه. برای جلوگیری از این مشکل، میتونیم از تکنیکهای throttling یا debouncing استفاده کنیم. اینها کاری میکنن که تابع اسکرول فقط هر چند میلیثانیه یک بار یا بعد از اتمام اسکرول اجرا بشه.
برای throttling، یه تابع کمکی بساز:
این کار باعث میشه تابع اصلی اسکرول شما تو بازههای زمانی مشخصی اجرا بشه و بار روی مرورگر کاهش پیدا کنه.
۲. دسترسیپذیری (Accessibility)
همیشه به فکر کاربرانی باش که از کیبورد یا صفحهخوان استفاده میکنن. مطمئن شو که هدر حتی وقتی مخفیه هم با Tab قابل دسترسی باشه. میتونی از aria-hidden="true" وقتی هدر مخفیه استفاده کنی و وقتی ظاهر شد اون رو حذف کنی. اما بهترین راهکار اینه که وقتی هدر مخفی میشه، روی اون display: none; یا visibility: hidden; نذاری، بلکه با transform: translateY(-100%); اون رو به بالا بفرستی، چون transform روی فوکوس کیبورد تاثیر نمیذاره.
۳. ارتفاع هدر پویا (Dynamic Header Height)
اگه ارتفاع هدرت ممکنه تغییر کنه (مثلاً تو موبایل ممکنه چند خطه بشه)، بهتره headerHeight رو داخل رویداد اسکرول بهروزرسانی کنی یا حداقل مطمئن شی که مقداری که برای top: -XXXpx; تو CSS و headerHeight + scrollThreshold تو JS در نظر گرفتی، همیشه از بلندترین حالت هدرت بیشتر باشه.
عیبیابی سریع (Troubleshooting) – حل مشکلات رایج
خب، حتماً پیش میاد که یه چیزی اونجوری که میخوای کار نکنه. اینجا چند تا مشکل رایج و راه حلشون رو لیست کردم که کارت سریع راه بیفته:
۱. هدر از اول مخفیه یا اصلا ظاهر نمیشه.
راه حل: مطمئن شو که کلاس .hide از اول روی تگ <header> نیست. هدر باید با استایل اولیه بدون این کلاس لود بشه. همچنین، z-index هدر رو چک کن که از بقیه عناصر صفحه کمتر نباشه.
۲. هدر موقع اسکرول به بالا، یک دفعه ظاهر میشه و انیمیشن نداره.
راه حل: حتماً transition: top 0.3s ease-in-out; رو توی CSS برای .main-header اضافه کردی. اگه از transform: translateY() برای مخفی کردن استفاده میکنی، transition: transform 0.3s ease-in-out; رو اضافه کن.
۳. محتوای صفحه زیر هدر پنهان میشه.
راه حل: این مشکل رایجیه چون position: fixed; هدر رو از جریان عادی صفحه خارج میکنه. باید به <main> یا <body> یه padding-top بدی که برابر با ارتفاع هدرت باشه. مثلاً اگه هدرت ۷۰ پیکسل ارتفاع داره، padding-top: 70px; رو به .main-content اضافه کن.
۴. هدر در بالا و پایین صفحه هی چشمک میزنه.
راه حل: این بخاطر اجرای بیش از حد و حساس بودن رویداد اسکروله. از تکنیک throttling که بالاتر توضیح دادم استفاده کن. همچنین، scrollThreshold رو کمی افزایش بده تا هدر به هر اسکرول کوچکی واکنش نده. این مشکل اغلب در پیمایش سریع رخ میدهد.
۵. در موبایل هدر درست کار نمیکنه یا بهم ریخته است.
راه حل: اول <meta name="viewport" content="width=device-width, initial-scale=1.0"> رو تو بخش <head> چک کن. بعد، حتماً از @media queries تو CSS استفاده کن تا استایلها برای سایزهای مختلف صفحه بهینه بشن. ارتفاع هدر در موبایل ممکنه فرق داشته باشه، پس top: -XXXpx; در .main-header.hide رو هم متناسب با ارتفاع هدرت در موبایل تنظیم کن.
جدول مقایسهای: Sticky Header ساده در مقابل Sticky Header هوشمند
برای اینکه تفاوت و ارزش کارمون بهتر درک بشه، بیا یه مقایسه سریع بندازیم بین یه هدر چسبنده ساده و هدر چسبنده هوشمند:
نتیجهگیری
ساخت یه هدر چسبنده هوشمند شاید در نگاه اول کمی پیچیده به نظر بیاد، ولی دیدی که با ترکیب HTML، CSS و JavaScript، میشه یه قابلیت خیلی کاربردی و جذاب رو پیاده کرد. این تکنیک نه تنها به سایتت یه ظاهر مدرن و حرفهای میده، بلکه تجربه کاربری رو هم حسابی بهبود میبخشه. همیشه یادت باشه، ریزهکاریها و بهینهسازیها هستن که یه سایت خوب رو از یه سایت فوقالعاده متمایز میکنن. پس این نکات رو جدی بگیر و تو پروژههات پیادهسازی کن.
اگه تو مسیر کدنویسی به کدهای آماده و اسنیپتهای بیشتر نیاز پیدا کردی یا دنبال ابزارهایی هستی که کارت رو سریعتر و بهتر انجام بده، فروشگاه ابزارهای FATools همیشه در دسترسه. خوشحال میشم نظرت رو در مورد این آموزش بدونم!
پرسشهای متداول (FAQ)
۱. آیا استفاده از هدر چسبنده هوشمند برای سئو (SEO) خوب است؟
بله، اگر به درستی پیادهسازی شود. بهبود تجربه کاربری (UX) و افزایش زمان ماندگاری کاربر در سایت، سیگنالهای مثبتی برای گوگل هستند. مطمئن شوید که هدر محتوای اصلی را پنهان نمیکند و سرعت بارگذاری صفحه را کاهش نمیدهد.
۲. چه مرورگرهایی از این نوع هدر پشتیبانی میکنند؟
کدهای HTML، CSS و JavaScript ارائه شده در این مقاله، از استانداردها پیروی میکنند و تقریباً در تمام مرورگرهای مدرن (Chrome, Firefox, Safari, Edge) و حتی نسخههای قدیمیتر به خوبی کار میکنند.
۳. آیا میتوانم این هدر را بدون JavaScript بسازم؟
ساخت یک هدر “چسبنده” بدون JavaScript امکانپذیر است (فقط با position: fixed در CSS). اما برای ایجاد رفتار “هوشمند” (مخفی شدن هنگام اسکرول به پایین و ظاهر شدن هنگام اسکرول به بالا)، نیاز به JavaScript برای ردیابی جهت اسکرول و تغییر کلاسهای CSS داریم.
۴. چه مقدار padding-top باید به .main-content بدهم؟
باید برابر با ارتفاع دقیق هدر شما باشد. بهترین راه این است که ارتفاع هدر را در مرورگر (با ابزارهای توسعهدهنده) اندازهگیری کنید و همان مقدار را به عنوان padding-top به عنصر اصلی محتوای خود (مثلاً <main> یا .main-content) اختصاص دهید تا محتوا زیر هدر پنهان نشود.
۵. اگر بخواهم هدر در موبایل همیشه ثابت بماند و هوشمند نباشد، چکار کنم؟
میتوانید منطق JavaScript را با استفاده از @media queries یا window.innerWidth غیرفعال کنید. مثلاً، در JavaScript چک کنید که اگر عرض صفحه کمتر از ۷۶۸ پیکسل است، تابع اسکرول را متوقف کنید یا کلاس .hide را اعمال نکنید.
© تمامی حقوق برای FATools محفوظ است.
برای ارتباط با تیم فنی، میتوانید با شماره ۰۹۲۰۲۲۳۲۷۸۹ تماس بگیرید.


