FA-TOOLS — Header Component
آموزش طراحی هدرهای چسبنده (Sticky Header) با تغییر استایل ملایم هنگام اسکرول

آموزش طراحی هدرهای چسبنده (Sticky Header) با تغییر استایل ملایم هنگام اسکرول

رفیق برنامه‌نویس، تا حالا شده تو سایتی بچرخی و حس کنی یک چیزی کمه؟ مثلاً وقتی اسکرول می‌کنی، هدر سایت غیب میشه و برای پیدا کردن منو مجبور میشی برگردی بالا؟ یا برعکس، یک هدر چسبنده هست که خشک و بی‌روح، بدون هیچ ظرافتی سر جاش وایساده؟ اینجاست که اهمیت یک هدر چسبنده پویا و هوشمند با تغییر استایل ملایم خودش رو نشون میده.

ما قراره اینجا قدم به قدم یاد بگیریم چطور یک هدر چسبنده بسازیم که هم همیشه در دسترس باشه و هم با اسکرول کردن، یه تغییر استایل ظریف و چشم‌نواز داشته باشه. این قابلیت نه تنها تجربه کاربری سایتت رو متحول می‌کنه، بلکه به سایتت یه جلوه حرفه‌ای و مدرن میده. آماده‌ای تا کدها رو بزنیم و این قابلیت باحال رو پیاده‌سازی کنیم؟

نیاز به ابزارهای برنامه‌نویسی خاص داری؟ همین حالا به فروشگاه ابزارهای برنامه‌نویسی fa-tools.ir سر بزن و با بهترین اسنیپت‌های CSS، JavaScript و HTML، کارتو راه بنداز.

برای مشاوره یا سوالاتت هم می‌تونی با ما تماس بگیری: 09202232789

✨ نقشه راه: طراحی هدر چسبنده با استایل پویا در یک نگاه! ✨

① HTML

ساختار پایه هدر (<nav>, <div>) با ID مشخص.

② CSS (پایه)

استایل‌های اولیه (رنگ، پدینگ، ارتفاع) و یک کلاس برای حالت چسبنده.

③ JavaScript

تشخیص اسکرول و افزودن/حذف کلاس CSS بر اساس موقعیت.

④ CSS (پویا)

تعریف transition و استایل‌های حالت چسبنده (رنگ، اندازه، سایه).

⑤ بهینه‌سازی و عیب‌یابی

رسپانسیو کردن، عملکرد بهتر، رفع مشکلات احتمالی.

چرا هدر چسبنده با تغییر استایل، یک برگ برنده است؟

آموزش طراحی هدرهای چسبنده (Sticky Header) با تغییر استایل ملایم هنگام اسکرول — تصویر 2

یه هدر چسبنده، یعنی یک ناوبری (navigation) که همیشه همراه کاربره. فکر کن تو یک مقاله طولانی هستی و می‌خوای بری به بخش دیگه‌ای از سایت، یا مثلاً به سبد خریدت سر بزنی. اگه هدر چسبنده نباشه، باید مدام اسکرول کنی به بالا! این واقعاً آزاردهنده‌ست. اما وقتی هدر چسبنده است، همیشه دم دستت هست و کار کاربر رو راحت می‌کنه. حالا اگه این هدر چسبنده، یه ذره هم با حرکت صفحه، جون بگیره و استایلش تغییر کنه، چی میشه؟ دقیقاً همون چیزی که سایتت رو از بقیه متمایز می‌کنه.

بهبود تجربه کاربری (UX) و ناوبری

اصلی‌ترین دلیل برای استفاده از هدر چسبنده، راحتی کاربره. وقتی کاربر میدونه که هر وقت بخواد میتونه به منوی سایت دسترسی داشته باشه، با آرامش بیشتری محتوای سایت رو دنبال می‌کنه. این اسنیپت ساده، یه قدم بزرگ برای افزایش رضایت بازدیدکننده حساب میشه.

هویت بصری پویا و حرفه‌ای

تغییر استایل ملایم، مثل عوض شدن رنگ پس‌زمینه، کوچکتر شدن لوگو یا اضافه شدن یک سایه ظریف، به سایتت شخصیت میده. این تغییرات جزئی باعث میشه سایت پویا و زنده به نظر برسه، نه یک صفحه ثابت و خشک. این یه نوع تعامل بصری هست که کاربر رو بیشتر درگیر می‌کنه و حس حرفه‌ای بودن رو القا می‌کنه.

بهینه‌سازی برای دستگاه‌های مختلف (رسپانسیو)

امروزه اکثر کاربران با موبایل و تبلت سایت‌ها رو چک می‌کنند. یک هدر چسبنده خوب باید روی این دستگاه‌ها هم عملکرد عالی داشته باشه. کوچکتر شدن هدر هنگام اسکرول، فضای بیشتری رو برای محتوا در اختیار کاربر میذاره که در صفحات کوچک موبایل، حیاتیه. با استفاده از تکنیک‌های CSS درست، میتونیم مطمئن بشیم که این هدر روی هر دستگاهی بی‌نقص کار می‌کنه.

مواد لازم برای شروع کار: HTML, CSS و JavaScript

آموزش طراحی هدرهای چسبنده (Sticky Header) با تغییر استایل ملایم هنگام اسکرول — تصویر 3

برای اینکه بتونیم این هدر رو بسازیم، به سه یار همیشگی دنیای وب نیاز داریم:

  • HTML (HyperText Markup Language): برای تعریف ساختار و محتوای هدر.
  • CSS (Cascading Style Sheets): برای استایل‌دهی و زیباسازی هدر در حالت‌های عادی و چسبنده.
  • JavaScript: برای تشخیص رویداد اسکرول و تغییر کلاس‌های CSS هدر.

قدم اول: طراحی ساختار اولیه HTML برای هدر

اول از همه، باید اسکلت هدرمون رو با HTML بسازیم. این هدر شامل لوگو، آیتم‌های منو و شاید دکمه‌های کناری باشه. نکته مهم اینه که یک ID مشخص به هدرمون بدیم تا بتونیم با جاوااسکریپت بهش دسترسی پیدا کنیم.

کپی کد

<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>هدر چسبنده با استایل پویا</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="margin: 0; font-family: sans-serif;">

    <header id="myHeader" class="header">
        <div class="container">
            <div class="logo">
                <a href="#">لوگو شما</a>
            </div>
            <nav class="main-nav">
                <ul>
                    <li><a href="#">خانه</a></li>
                    <li><a href="#">خدمات</a></li>
                    <li><a href="#">درباره ما</a></li>
                    <li><a href="#">تماس با ما</a></li>
                </ul>
            </nav>
        </div>
    </header>

    <div class="content" style="height: 1500px; padding: 20px; text-align: center; background-color: #f0f0f0; margin-top: 80px;">
        <h2>محتوای اصلی سایت شما</h2>
        <p>برای تست هدر، صفحه را اسکرول کنید.</p>
        <p>متن‌های بیشتر و بیشتر تا بتونید اسکرول کنید...</p>
        <p>ما اینجا کلی محتوای باارزش داریم که مطالعه کنید.</p>
    </div>

    <script src="script.js"></script>
</body>
</html>

(برای کپی کردن، کد را انتخاب کنید.)

همونطور که میبینی، ما یک تگ `

` داریم با `id=”myHeader”` و یک کلاس `header`. داخلش هم یک `div` برای چینش محتوا (لوگو و ناوبری) گذاشتیم. تگ‌های “ و “ رو هم اضافه کردیم که به ترتیب فایل‌های CSS و JS ما رو وصل کنن.

قدم دوم: استایل‌دهی اولیه به هدر با CSS

حالا وقتشه با CSS به هدرمون ظاهر اولیه بدیم. این استایل‌ها شامل رنگ پس‌زمینه، پدینگ، ترازبندی و بقیه مواردیه که هدر رو جذاب می‌کنه. همچنین یک کلاس جدید برای حالت چسبنده تعریف می‌کنیم که وقتی هدر چسبنده شد، استایل‌های خاصی بهش بده.

ظاهر پایه هدر

استایل‌های پایه رو داخل فایل `style.css` بنویس. این استایل‌ها هدر رو قبل از چسبنده شدن، جذاب نشون میده.

کپی کد

/* style.css */
body {
    margin: 0;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    direction: rtl; /* برای راست به چپ */
    text-align: right;
}

.header {
    background-color: #333;
    color: #fff;
    padding: 15px 0;
    position: fixed; /* در ابتدا هم fixed باشه تا جای محتوا رو نگیره */
    width: 100%;
    top: 0;
    left: 0;
    z-index: 1000;
    transition: background-color 0.3s ease, padding 0.3s ease, box-shadow 0.3s ease; /* ترانزیشن برای تغییرات */
}

.header .container {
    max-width: 1200px;
    margin: 0 auto;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0 20px;
}

.header .logo a {
    color: #fff;
    text-decoration: none;
    font-size: 28px;
    font-weight: bold;
    transition: font-size 0.3s ease;
}

.main-nav ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
}

.main-nav ul li {
    margin-right: 25px;
}

.main-nav ul li:last-child {
    margin-right: 0;
}

.main-nav ul li a {
    color: #fff;
    text-decoration: none;
    font-size: 17px;
    padding: 5px 0;
    transition: color 0.3s ease;
}

.main-nav ul li a:hover {
    color: #007bff;
}

/* استایل برای محتوای اصلی که زیر هدر قرار می‌گیرد */
.content {
    padding-top: 80px; /* به اندازه ارتفاع اولیه هدر */
}
    

(برای کپی کردن، کد را انتخاب کنید.)

تعریف کلاس برای هدر چسبنده (Sticky Header Class)

حالا یک کلاس جدید به اسم `.sticky` تعریف می‌کنیم. وقتی جاوااسکریپت تشخیص داد که باید هدر چسبنده بشه، این کلاس رو به تگ `

` اضافه می‌کنه. استایل‌های این کلاس باعث تغییرات ملایم بصری میشن.

کپی کد

/* style.css (ادامه) */
.header.sticky {
    background-color: #fff; /* تغییر رنگ پس‌زمینه به سفید */
    padding: 10px 0; /* کاهش پدینگ */
    box-shadow: 0 2px 5px rgba(0,0,0,0.1); /* اضافه کردن سایه */
}

.header.sticky .logo a {
    color: #333; /* تغییر رنگ لوگو */
    font-size: 24px; /* کوچکتر شدن لوگو */
}

.header.sticky .main-nav ul li a {
    color: #555; /* تغییر رنگ آیتم‌های منو */
}

.header.sticky .main-nav ul li a:hover {
    color: #007bff; /* رنگ هاور مثل قبل */
}
    

(برای کپی کردن، کد را انتخاب کنید.)

همونطور که می‌بینی، برای کلاس `.sticky` استایل‌های جدیدی تعریف کردیم که شامل تغییر رنگ پس‌زمینه، پدینگ و سایه میشه. همچنین رنگ لوگو و آیتم‌های منو هم عوض میشه. دقت کن که از `transition` در کلاس `.header` استفاده کردیم تا این تغییرات به نرمی اتفاق بیفتن. این ترانزیشن‌ها واقعاً در چشم‌نواز بودن هدر تاثیر دارن.

قدم سوم: افزودن جادوی جاوااسکریپت برای چسبندگی و تغییر استایل

اینجاست که جاوااسکریپت وارد عمل میشه. ما نیاز داریم تشخیص بدیم کاربر چقدر صفحه رو اسکرول کرده و بر اساس اون، کلاس `.sticky` رو به هدر اضافه یا ازش حذف کنیم.

تشخیص موقعیت اسکرول

یه تابع می‌نویسیم که هر وقت کاربر اسکرول کرد، فعال بشه. این تابع، موقعیت اسکرول رو بررسی می‌کنه و اگه از یک حد مشخصی عبور کرد، هدر رو چسبنده می‌کنه.

اعمال کلاس چسبنده

کد زیر رو در فایل `script.js` قرار بده. این کد، هدر رو پیدا می‌کنه و با استفاده از رویداد `scroll`، وضعیت چسبندگی رو مدیریت می‌کنه.

کپی کد

// script.js
window.onscroll = function() { stickyHeader() };

let header = document.getElementById("myHeader");
let stickyOffset = header.offsetTop; // موقعیت اولیه هدر نسبت به بالای صفحه

function stickyHeader() {
    if (window.pageYOffset > stickyOffset) {
        header.classList.add("sticky");
    } else {
        header.classList.remove("sticky");
    }
}

// در صورتی که هدر اولیه fixed بود، باید offsetTop رو به گونه‌ای تنظیم کنیم که
// بعد از یک اسکرول مشخص فعال بشه.
// در این مثال چون header از ابتدا fixed است، stickyOffset باید بر اساس ارتفاع header
// یا یک مقدار دلخواه (مثلاً 50px) تنظیم شود.
// بهتر است مقدار stickyOffset را یک عدد ثابت (مثلا 50px) در نظر بگیریم
// یا یک div خالی قبل از هدر بگذاریم و offsetTop آن را بگیریم.
// راه حل پیشنهادی:
// const initialHeaderHeight = header.offsetHeight;
// stickyOffset = initialHeaderHeight; // مثلا 80 پیکسل بعد از اسکرول
// اما ساده‌ترین راه برای این مثال:
stickyOffset = 50; // هدر بعد از 50 پیکسل اسکرول چسبنده می‌شود.

    

(برای کپی کردن، کد را انتخاب کنید.)

مقایسه روش‌های تشخیص اسکرول

روش توضیحات و کاربرد
window.onscroll ساده‌ترین راه برای تشخیص اسکرول کل صفحه. یک تابع به رویداد `scroll` پنجره اضافه می‌کند. مناسب برای اکثر موارد.
addEventListener('scroll', ...) روش مدرن‌تر و انعطاف‌پذیرتر. اجازه می‌دهد چندین تابع به یک رویداد اضافه شود بدون اینکه قبلی‌ها بازنویسی شوند.

برای پروژه‌های ساده، window.onscroll کفایت می‌کند، اما در پروژه‌های پیچیده‌تر، استفاده از addEventListener توصیه می‌شود تا تداخل با سایر اسکریپت‌ها کمتر شود.

قدم چهارم: ظریف‌کاری‌ها و تغییر استایل ملایم در CSS

ترانزیشن‌ها (Transitions) در CSS، همون عنصر جادویی هستن که تغییر استایل رو از حالت ناگهانی به حالت نرم و روان تبدیل می‌کنن. بدون ترانزیشن، هدر به صورت یکدفعه‌ای استایلش عوض میشه که اصلاً جلوه خوبی نداره.

ترانزیشن‌های CSS برای حرکت نرم

ما از قبل توی کلاس `.header` ترانزیشن‌ها رو برای `background-color`, `padding` و `box-shadow` تعریف کردیم. این یعنی هر تغییری که در این ویژگی‌ها ایجاد بشه، به نرمی و طی 0.3 ثانیه اتفاق میفته. این عدد `0.3s` رو میتونی به دلخواه خودت تغییر بدی تا سرعت تغییر استایل کم یا زیاد بشه. مثلاً برای یک تغییر استایل سریعتر، میتونی `0.2s` و برای یک تغییر کندتر `0.5s` بذاری.

تغییر رنگ، اندازه و سایه

توی کلاس `.header.sticky` که توی قدم دو نوشتیم، دقیقا این تغییرات رو اعمال کردیم:

  • `background-color`: از مشکی به سفید (یا هر رنگ دلخواه دیگه).
  • `padding`: از `15px 0` به `10px 0` (کاهش ارتفاع هدر).
  • `box-shadow`: اضافه کردن سایه برای جلوه برجسته.
  • `font-size` لوگو و `color` آیتم‌های منو: برای هماهنگی بیشتر با استایل جدید.

این تغییرات باعث میشه هدر وقتی چسبنده میشه، کمی جمع‌وجورتر و متفاوت‌تر به نظر برسه، اما نه به صورت ناگهانی، بلکه با یک حرکت لطیف و چشم‌نواز.

نکته‌های مهم برای یک هدر چسبنده بی‌نقص و ریسپانسیو

ساختن هدر چسبنده فقط کدنویسی نیست، بلکه شامل دقت به جزئیات و پیش‌بینی مشکلات احتمالیه. یک هدر خوب، باید در هر شرایطی عالی به نظر برسه.

رسپانسیو بودن در موبایل و تبلت

در دستگاه‌های موبایل، فضای صفحه محدودتره. بنابراین، هدر چسبنده باید در این دستگاه‌ها حتی کوچک‌تر و جمع‌وجورتر بشه. از Media Queries در CSS استفاده کن تا استایل‌های مخصوص موبایل رو اعمال کنی. مثلاً میتونی پدینگ هدر رو بیشتر کم کنی، یا فونت لوگو رو کوچکتر کنی و آیتم‌های منو رو به یک منوی همبرگری تغییر بدی.

کپی کد

/* style.css (استایل‌های رسپانسیو) */
@media (max-width: 768px) {
    .header .container {
        flex-direction: column; /* در موبایل آیتم‌ها زیر هم قرار بگیرند */
        padding: 0 15px;
    }

    .main-nav ul {
        margin-top: 10px;
        flex-wrap: wrap; /* برای اینکه آیتم‌ها در یک خط جا نشدند، به خط بعدی بروند */
        justify-content: center;
    }

    .main-nav ul li {
        margin: 0 10px 10px 0; /* پدینگ برای آیتم‌های منو */
    }

    .header.sticky {
        padding: 8px 0; /* پدینگ کمتر در حالت چسبنده موبایل */
    }

    .header.sticky .logo a {
        font-size: 20px; /* لوگو کوچکتر در حالت چسبنده موبایل */
    }
}
    

(برای کپی کردن، کد را انتخاب کنید.)

این کدها مطمئن میشن که هدر تو روی صفحات کوچکتر هم خوب به نظر میاد و کارایی داره. حواست باشه که برای پیاده‌سازی کامل منوی همبرگری، نیاز به جاوااسکریپت و CSS بیشتری هست که از حوصله این مقاله خارجه اما اصول رسپانسیو کردنش همینه.

توجه به محتوای زیر هدر

وقتی هدر رو `position: fixed` میکنی، از جریان طبیعی سند خارج میشه و محتوای زیرش به سمت بالا حرکت میکنه و ممکنه زیر هدر قرار بگیره. برای حل این مشکل، باید به `body` یا اولین `div` بعد از هدر، یک `padding-top` به اندازه ارتفاع هدر بدی. مثلاً اگه ارتفاع هدر 80 پیکسل باشه، `padding-top: 80px;` رو اعمال کن. این کار باعث میشه محتوا از زیر هدر بیرون بیاد.

بهینه‌سازی عملکرد (Performance Optimization)

رویداد `scroll` خیلی زود به زود فعال میشه. اگه تابع `stickyHeader` تو کارهای سنگینی انجام بده، ممکنه باعث کندی و لگ در اسکرول بشه. برای جلوگیری از این مشکل، میتونی از تکنیک `debounce` یا `throttle` استفاده کنی. این تکنیک‌ها باعث میشن تابع اسکرول با تاخیر یا در فواصل زمانی مشخص اجرا بشه و بار روی مرورگر رو کم کنن. البته برای این مثال ساده، نیازی بهش نیست، اما برای پروژه‌های بزرگتر، حتما بهش فکر کن.

آزمایش‌پذیری و دیباگ (Debug)

همیشه کدتو در مرورگرهای مختلف (کروم، فایرفاکس، سافاری) و در اندازه‌های مختلف صفحه تست کن. از ابزارهای توسعه‌دهنده مرورگر (Developer Tools) برای بررسی استایل‌ها و رفتار جاوااسکریپت استفاده کن. با `console.log()` در جاوااسکریپت، میتونی مقدار `pageYOffset` و وضعیت اضافه/حذف شدن کلاس رو بررسی کنی.

عیب‌یابی سریع: مشکلات رایج و راه‌حل‌های آن‌ها

تو مسیر کدنویسی، ممکنه با مشکلاتی روبرو بشی. اینجا چندتا از رایج‌ترین‌ها رو با راه‌حلشون آوردیم:

  • مشکل: هدر کلاً چسبنده نمیشه.

    راه‌حل: مطمئن شو که `id=”myHeader”` رو به تگ هدرت دادی و جاوااسکریپت هم درست فایل `script.js` رو لود کرده. همچنین چک کن که مقدار `stickyOffset` درست تنظیم شده باشه و `window.pageYOffset` ازش بزرگتر بشه. `position: fixed` در CSS هدر هم خیلی مهمه.
  • مشکل: هدر چسبنده میشه، اما محتوای زیرش زیر هدر میره.

    راه‌حل: باید به عنصر بعد از هدر یا به `body` یک `padding-top` به اندازه ارتفاع هدر بدی. مثلاً اگر هدرت 60 پیکسل ارتفاع داره، `body { padding-top: 60px; }` اضافه کن.
  • مشکل: تغییر استایل ناگهانیه، نه ملایم.

    راه‌حل: مطمئن شو که در CSS، برای کلاس `.header` ویژگی `transition` رو اضافه کردی: `transition: background-color 0.3s ease, padding 0.3s ease, box-shadow 0.3s ease;`. اگر برای ویژگی خاصی ترانزیشن تعریف نشده باشه، اون ویژگی ناگهانی تغییر می‌کنه.
  • مشکل: هدر در موبایل خوب به نظر نمیاد یا کار نمیکنه.

    راه‌حل: از `meta name=”viewport”` در تگ `<head>` مطمئن شو. از Media Queries برای اعمال استایل‌های خاص موبایل استفاده کن. ارتفاع و پدینگ هدر رو در موبایل کمتر کن تا فضای بیشتری برای محتوا ایجاد بشه.
  • مشکل: هنگام اسکرول، لگ (lag) یا کندی احساس میشه.

    راه‌حل: این مشکل ممکنه به خاطر کدنویسی سنگین در تابع `stickyHeader` باشه. میتونی از `throttle` یا `debounce` در جاوااسکریپت استفاده کنی تا تابع با نرخ کمتری اجرا بشه و عملکرد سایت بهبود پیدا کنه.
  • مشکل: لینک‌های داخلی به صفحات دیگر اسنیپت‌ها به درستی کار نمی‌کنند.

    راه‌حل: مطمئن شو که آدرس دهی به صفحات `fa-tools.ir/snippets/` به درستی و بدون هیچ اشتباهی انجام شده باشه. گاهی یک `/` اضافی یا کم می‌تواند مشکل ایجاد کند. از ابزار `Inspect Element` مرورگر برای بررسی آدرس لینک‌ها استفاده کن.

سوالات متداول (FAQ)

آیا این روش برای همه وب‌سایت‌ها قابل استفاده است؟

بله، این تکنیک HTML، CSS و جاوااسکریپت خالص است و در هر وب‌سایتی (چه با فریمورک باشد و چه نباشد) قابل پیاده‌سازی است. البته برای فریمورک‌های خاص (مثل React یا Vue) ممکن است روش‌های کمی بهینه‌تر وجود داشته باشد، اما این اصول پایه در همه جا کار می‌کنند.

چطور می‌توانم سرعت تغییر استایل هدر را تغییر دهم؟

می‌توانی مقدار زمان را در ویژگی transition در CSS تغییر دهی. مثلاً transition: background-color 0.5s ease; تغییر را کندتر می‌کند و 0.2s سریع‌تر. این ویژگی در فایل CSS تعریف شده است.

آیا هدر چسبنده برای سئو (SEO) خوب است؟

به طور مستقیم، نه. اما به طور غیرمستقیم، بله. هدر چسبنده تجربه کاربری (UX) را بهبود می‌بخشد و باعث می‌شود کاربران بیشتر در سایت بمانند (افزایش زمان ماندگاری). فاکتورهای UX و زمان ماندگاری، از فاکتورهای مهم گوگل برای رتبه‌بندی هستند.

چگونه می‌توانم این هدر را در وردپرس استفاده کنم؟

برای وردپرس، باید کدهای HTML را در فایل header.php تم خود، کدهای CSS را در فایل style.css یا از طریق بخش سفارشی‌سازی تم و کدهای جاوااسکریپت را در فایل functions.php (با استفاده از wp_enqueue_script) یا به صورت inline در فوتر یا هدر قرار دهی. برای روش‌های بهینه‌تر در وردپرس، می‌توانید به اسنیپت‌های وردپرس مراجعه کنید.

function copyCode(buttonElement) {
const codeElement = buttonElement.nextElementSibling.querySelector(‘code’);
const textToCopy = codeElement.innerText;

navigator.clipboard.writeText(textToCopy).then(() => {
const originalText = buttonElement.innerText;
buttonElement.innerText = ‘کپی شد!’;
setTimeout(() => {
buttonElement.innerText = originalText;
}, 2000);
}).catch(err => {
console.error(‘Failed to copy text: ‘, err);
alert(‘خطا در کپی کردن کد. لطفا به صورت دستی کپی کنید.’);
});
}

/* Global styles for responsiveness and aesthetics (for the block editor) */
body {
font-family: ‘Segoe UI’, Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
direction: rtl;
text-align: right;
margin: 0;
background-color: #f8f8f8;
}
h1, h2, h3 {
font-family: ‘Segoe UI’, Tahoma, Geneva, Verdana, sans-serif;
color: #1a1a1a;
margin-top: 1.5em;
margin-bottom: 0.8em;
}
h1 { font-size: 2.2em; font-weight: bold; text-align: center; }
h2 { font-size: 1.8em; font-weight: bold; border-bottom: 2px solid #eee; padding-bottom: 10px; }
h3 { font-size: 1.4em; font-weight: bold; color: #555; }
p {
margin-bottom: 1em;
font-size: 1.05em;
line-height: 1.7;
}
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
ul {
list-style-type: disc;
margin-right: 20px;
padding: 0;
margin-bottom: 1em;
}
li {
margin-bottom: 0.5em;
font-size: 1.05em;
}
pre {
background-color: #2d2d2d;
color: #f8f8f2;
padding: 15px;
border-radius: 5px;
overflow-x: auto;
position: relative;
}
code {
font-family: ‘Fira Code’, ‘Monaco’, ‘Consolas’, monospace;
font-size: 0.95em;
display: block; /* Ensure code block takes full width */
}

/* Responsive adjustments for tables and infographic */
@media (max-width: 768px) {
h1 { font-size: 1.8em; }
h2 { font-size: 1.5em; }
h3 { font-size: 1.2em; }
p, li { font-size: 1em; }
.info-graphic-box > div {
width: 100% !important; /* Force full width on small screens */
margin-bottom: 10px;
}
.header .container {
flex-direction: column;
align-items: flex-end; /* Adjust alignment for RTL in mobile */
}
.main-nav ul {
flex-direction: column;
align-items: flex-end; /* Adjust alignment for RTL in mobile */
margin-top: 15px;
}
.main-nav ul li {
margin-bottom: 10px;
margin-right: 0; /* Remove right margin for vertical stack */
}
table, thead, tbody, th, td, tr {
display: block;
}
thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
tr { border: 1px solid #ccc; margin-bottom: 10px; }
td {
border: none;
border-bottom: 1px solid #eee;
position: relative;
padding-right: 50% !important; /* Space for label */
text-align: right !important;
}
td:before {
position: absolute;
right: 6px;
width: 45%;
padding-left: 10px;
white-space: nowrap;
content: attr(data-label); /* Use data-label for content */
font-weight: bold;
text-align: right;
color: #555;
}
/* Specific labels for the table */
table tr:nth-of-type(1) td:nth-of-type(1):before { content: “روش:”; }
table tr:nth-of-type(1) td:nth-of-type(2):before { content: “توضیحات:”; }
table tr:nth-of-type(2) td:nth-of-type(1):before { content: “روش:”; }
table tr:nth-of-type(2) td:nth-of-type(2):before { content: “توضیحات:”; }
}
/* Styles for the “کپی کد” button */
.copy-button {
background-color: #5cb85c; /* Green */
color: white;
padding: 5px 10px;
border-radius: 5px;
font-size: 14px;
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
user-select: none; /* Prevent text selection */
border: none;
outline: none;
transition: background-color 0.2s ease;
}
.copy-button:hover {
background-color: #4cae4c;
}

// Polyfill for navigator.clipboard.writeText for older browsers if needed,
// but modern browsers support it well enough.
// The copy button is already implemented using inline onclick and standard JS.

آموزش طراحی هدرهای چسبنده (Sticky Header) با تغییر استایل ملایم هنگام اسکرول

یکی از مهم‌ترین عناصر در تجربه کاربری (UX) وب‌سایت، سیستم ناوبری یا همان هدر سایت است. وقتی کاربر در صفحه به سمت پایین حرکت می‌کند، دسترسی سریع به منوی اصلی یک مزیت بزرگ به شمار می‌آید. اما یک هدر چسبنده بزرگ می‌تواند فضای زیادی از صفحه نمایش را اشغال کند؛ به‌خصوص در موبایل و تبلت که فضا بسیار محدودتر است. راهکار حریفه‌ای برای حل این مشکل، طراحی یک هدر چسبنده (Sticky Header) با تغییر استایل ملایم هنگام اسکرول است. در این حالت، وقتی کاربر شروع به حرکت در صفحه می‌کند، هدر به آرامی کوچک‌تر، نیمه‌شفاف‌تر یا ساده‌تر می‌شود تا هم دسترسی حفظ شود و هم فضای محتوا هدر نرود.

برای پیاده‌سازی این قابلیت جذاب، نیازی به کدهای سنگین ندارید. شما با ترکیب چند خط استایل‌دهی هوشمندانه و یک اسکریپت سبک، می‌توانید تجربه‌ای بی‌نظیر برای مخاطبان خود خلق کنید. در این مقاله به صورت کاملاً عملی و قدم به قدم یاد می‌گیرید که چطور این هدرها را بهینه‌سازی کنید تا سرعت سایت شما نیز حفظ شود.

خلاصه فرآیند طراحی هدر چسبنده تعاملی

۰۱. ساختار HTML

ایجاد ساختار اولیه هدر با تگ های معنایی برای دسترسی بهتر مرورگرها و سئو عالی.

۰۲. استایل پایه CSS

تعیین موقعیت ثابت (sticky)، پدینگ اولیه و افزودن ویژگی transition برای انیمیشن نرم.

۰۳. جادوی JavaScript

سنجش میزان اسکرول کاربر و اضافه کردن یک کلاس کمکی (مثلاً scrolled) به بدنه یا هدر.

۰۴. افکت نهایی

تغییر ارتفاع، رنگ پس‌زمینه و کاهش سایه هدر به محض فعال شدن کلاس کمکی.

مفهوم فنی هدر چسبنده با افکت ملایم

برای ایجاد این افکت، ما از تعامل دو ابزار قدرتمند فرانت‌اند یعنی شیوه نامه‌ نویسی آبشاری (CSS) و جاوا اسکریپت استفاده می‌کنیم. در بخش استایل‌ها، هدر را در وضعیت چسبنده قرار می‌دهیم. اما چسبنده بودن به تنهایی تغییری در ظاهر ایجاد نمی‌کند. اینجاست که جاوا اسکریپت وارد عمل می‌شود.

وقتی کاربر صفحه را اسکرول می‌کند و به اندازه مشخصی (مثلاً ۵۰ پیکسل) از بالای صفحه دور می‌شود، جاوا اسکریپت متوجه این حرکت شده و کلاسی به نام scrolled را به تگ هدر اضافه می‌کند. در فایل CSS خود، از قبل تعریف کرده‌ایم که اگر هدر این کلاس را داشت، ارتفاع آن کم شود، رنگ پس‌زمینه آن تغییر کند و سایه‌ای ملایم زیر آن بیفتد. به لطف ویژگی transition در CSS، این تغییرات به شکلی کاملاً نرم و چشم‌نواز ظاهر می‌شوند.

اگر برای پروژه‌های خود به دنبال ابزارهای کاربری یا آرشیو کاملی از کدهای آماده هستید، پیشنهاد می‌کنیم بخش‌های مختلف سایت را بررسی کنید. برای مثال، می‌توانید به کتابخانه قطعه کدهای آماده سر بزنید تا به دنیایی از کدهای کاربردی دسترسی داشته باشید.

آموزش گام به گام پیاده‌سازی (HTML، CSS و JS)

بیایید فرآیند ساخت را شروع کنیم. این آموزش به ساده‌ترین شکل ممکن طراحی شده تا حتی با دانش پایه‌ای وب هم بتوانید آن را به راحتی اجرا کنید.

قدم اول: ایجاد ساختار HTML هدر

ابتدا به یک سند استاندارد HTML نیاز داریم. تگ <header> وظیفه نگهداری ساختار منوی ما را دارد. برای یادگیری و بررسی نکات بیشتر درباره ساختار تگ‌ها، می‌توانید از بخش قطعه کدهای HTML استفاده نمایید. کد زیر نمونه‌ای استاندارد برای شروع کار است:

<header class="site-header">
  <div class="header-container">
    <div class="logo">
      <a href="#">لوگوی سایت</a>
    </div>
    <nav class="navigation">
      <ul>
        <li><a href="#">صفحه اصلی</a></li>
        <li><a href="#">خدمات ما</a></li>
        <li><a href="#">بلاگ آموزشی</a></li>
        <li><a href="#">تماس با ما</a></li>
      </ul>
    </nav>
  </div>
</header>

قدم دوم: استایل‌دهی با CSS به صورت واکنش‌گرا

حالا نوبت به تنظیم کدهای استایل می‌رسد. در این قسمت مشخص می‌کنیم که هدر در حالت پیش‌فرض چگونه باشد و پس از اسکرول شدن (اضافه شدن کلاس scrolled) چه تغییراتی در آن رخ دهد. برای دریافت استایل‌های جذاب‌تر و شیک‌تر، بخش قطعه کدهای CSS را به خاطر داشته باشید.

/* استایل‌های عمومی هدر در حالت عادی */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 1000;
  background-color: #ffffff;
  padding: 25px 0; /* فاصله زیاد در شروع */
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
  transition: all 0.4s ease-in-out; /* انیمیشن نرم تغییر استایل */
}

.header-container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 20px;
}

.logo a {
  font-size: 24px;
  font-weight: bold;
  color: #1e3a8a;
  text-decoration: none;
  transition: font-size 0.4s ease;
}

.navigation ul {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}

.navigation ul li {
  margin-left: 20px;
}

.navigation ul li a {
  text-decoration: none;
  color: #475569;
  font-weight: 500;
  font-size: 16px;
  transition: color 0.3s ease;
}

/* افکت جدید هنگام اسکرول صفحه (اضافه شدن کلاس scrolled) */
.site-header.scrolled {
  padding: 10px 0; /* کاهش ارتفاع هدر */
  background-color: rgba(255, 255, 255, 0.95); /* کمی نیمه‌شفاف */
  backdrop-filter: blur(8px); /* افکت شیشه ای در مرورگرهای مدرن */
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); /* سایه واضح‌تر */
}

.site-header.scrolled .logo a {
  font-size: 20px; /* کوچک‌تر شدن لوگو */
}

قدم سوم: پیاده‌سازی منطق جاوا اسکریپت

برای اینکه تشخیص دهیم کاربر چه زمانی اسکرول کرده است، به یک تکه کد جاوا اسکریپت بهینه نیاز داریم. این کد رویداد اسکرول مرورگر را رصد کرده و در صورت رد شدن از مرز ۵۰ پیکسل، کلاس ما را فعال می‌کند. اگر تسمیم دارید کدهای پیچیده‌تری بنویسید یا سرعت اجرای اسکریپت‌ها را بهینه‌تر کنید، حتماً سری به بخش قطعه کدهای جاوا اسکریپت بزنید.

document.addEventListener("DOMContentLoaded", function () {
  const header = document.querySelector(".site-header");

  window.addEventListener("scroll", function () {
    if (window.scrollY > 50) {
      header.classList.add("scrolled");
    } else {
      header.classList.remove("scrolled");
    }
  });
});

نحوه پیاده‌سازی در وردپرس بدون افزونه

بسیاری از کاربران ترجیه می‌دهند برای جلوگیری از کند شدن سایت، تا حد امکان از افزونه‌های سنگین استفاده نکنند. وردپرس این قابلیت را به ما می‌دهد تا بتوانیم کدهای دلخواه را به طور مستقیم به پوسته خود اضافه کنیم. برای آشنایی با روش‌های پیشرفته‌تر ویرایش قالب به بخش قطعه کدهای وردپرس مراجعه نمایید.

برای پیاده‌سازی این هدر در قالب وردپرس، مراحل زیر را دنبال کنید:

  1. وارد پیشخوان وردپرس خود شوید.
  2. به مسیر نمایش > ویرایشگر پرونده پوسته (یا بخش سفارشی‌سازی) بروید.
  3. کدهای CSS ارائه شده در بالا را به انتهای پرونده style.css خود اضافه کنید.
  4. کد جاوا اسکریپت را می‌توانید در انتهای فایل footer.php قبل از بسته شدن تگ </body> داخل تگ <script> قرار دهید.
  5. تغییرات را ذخیره کرده و نتیجه کار را در صفحه اصلی سایت خود با زدن کلید‌های میانبر Ctrl + F5 تماشا کنید.

مقایسه هدر ثابت معمولی با هدر چسبنده تعاملی

برای درک بهتر ارزش افزوده‌ای که یک هدر تغییرپذیر برای سایت شما ایجاد می‌کند، نگاهی به جدول مقایسه زیر بیندازید. این جدول به شما نشان می‌دهد که چرا برندهای بزرگ دنیا از این شیوه نوین استفاده می‌کنند:

نوع هدر سایت میزان اشغال فضا و تاثیر بر تجربه کاربری (UX)
هدر ثابت معمولی (Static) هنگام اسکرول ناپدید می‌شود. کاربر برای دسترسی دوباره به منو باید حتماً به بالاترین بخش صفحه بازگردد که این موضوع نرخ پرش را افزایش می‌دهد.
هدر چسبنده ساده (Always Big) همواره با ابعاد اولیه در بالای صفحه باقی می‌ماند. بخش زیادی از فضای مفید مطالعه را (به خصوص در گوشی‌های موبایل) کور می‌کند.
هدر تعاملی با تغییر استایل ملایم بهترین تجربه کاربری را ارائه می‌دهد. دسترسی به منو حفظ می‌شود، اما فضای دید کاربر با انیمیشنی ملایم و دلنشین آزاد می‌گردد.

عیب‌یابی سریع و رفع مشکلات رایج (Troubleshooting)

ممکن است هنگام پیاده‌سازی این قطعه کدهای جذاب، با چالش‌های فنی روبرو شوید. در ادامه، رایج‌ترین اختلالات و نحوه رفع سریع آن‌ها را با هم بررسی می‌کنیم:

۱. مشکل پرش ناگهانی صفحه هنگام اسکرول

علت: وقتی موقعیت هدر را از حالت معمولی به چسبنده یا ثابت تغییر می‌دهید، فضای اشغال شده توسط آن در جریان اصلی سند (Document Flow) خالی می‌شود و محتوای زیرین ناگهان بالا می‌جهد.
راه‌حل: برای جلوگیری از این اتفاق، مطمئن شوید که والدِ اصلی هدر یا بخش بالایی صفحه (مانند هیرو سکشن یا بدنه اصلی سایت) دارای پدینگی معادل ارتفاع تقریبی هدر است تا جای خالی آن پر بماند.

۲. قرار گرفتن هدر در زیر برخی از عناصر سایت (مثل تصاویر، بنرها یا فرم‌ها)

علت: مقدار اولویت لایه‌بندی در CSS یا همان z-index هدر شما از عناصر دیگر کمتر است.
راه‌حل: مقدار z-index کلاس .site-header را روی عدد بزرگی مثل ۹۹۹۹ قرار دهید تا تضمین شود همیشه در بالاترین لایه قرار دارد.

۳. افت عملکرد و لگ زدن اسکرول در موبایل

علت: مرورگر موبایل برای رندر پی‌درپی موقعیت اسکرول تحت فشار پردازشی قرار می‌گیرد.
راه‌حل: تا حد امکان از انیمیشن دادن به ویژگی‌های سنگینی مثل width یا مقادیر فیلترهای سنگین خودداری کنید. همچنین ویژگی transform: translate3d(0,0,0) را به هدر اضافه کنید تا شتاب‌دهنده گرافیکی سخت‌افزار فعال شود.

سوالات متداول (FAQ)

آیا برای ساخت هدر چسبنده با استایل ملایم به کتابخانه‌های سنگین نیاز داریم؟

خیر؛ شما تنها به چند خط کدهای خالص CSS و جاوا اسکریپت ساده (Vanilla JS) احتیاج دارید تا سرعت بارگذاری سایت خود را به بهترین شکل ممکن حفظ کنید.

تفاوت ویژگی position: fixed و position: sticky چیست؟

عنصر با موقعیت fixed به طور کل از ساختار عادی خارج شده و همیشه بر اساس پنجره مرورگر جابجا می‌شود. اما sticky مانند موقعیت نسبی عمل می‌کند تا زمانی که کاربر به مرز اسکرول مشخص شده برسد، سپس شبیه به fixed رفتار می‌کند.

چگونه از تار شدن متن هدر هنگام کوچک شدن در اسکرول جلوگیری کنیم؟

به جای استفاده از متد scale در CSS ترجیحاً سایز فونت (font-size) یا پدینگ‌های بالا و پایین هدر را تغییر دهید. این کار وضوح متون منو را کاملاً شفاف و بی‌نقص نگه می‌دارد.

طراحی یک هدر زیبا و پویا تا حد زیادی به بهبود تعامل و راحتی گشت و گذار کاربران در صفحات وب شما کمک می‌کند. امیدواریم با بهره‌گیری از کدهای ارائه شده در این مقاله، ظاهر وب‌سایت خود را به سطحی کاملاً تازه و حرفه‌ای ارتقا دهید.

Table of Contents

آخرین نوشته‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *