توسعه دهنده وب | متخصص ری اکت و نکست | طراح سایت |
🎨 تغییر تم (Theme Switching) طراحی سایت با ری اکت و نکست
از مفهوم تا پیادهسازی اصولی تغییر تم در React و Next.js در طراحی سایت تا صفحه فرود
امروزه کاربران انتظار دارند یک وباپلیکیشن با سلیقه و شرایط آنها تطبیق پیدا کند. یکی از واضحترین نمونهها، Dark Mode / Light Mode است.
چرا تغییر تم 🌙 در طراحی سایت مهم است؟
اما تغییر تم فقط تغییر رنگ نیست؛ بخشی از تجربه کاربری، دسترسپذیری (Accessibility) و حتی برندینگ است.
قبل از ورود به جزئیات، بیایید خیلی خلاصه ببینیم وقتی از «تغییر تم» حرف میزنیم، دقیقاً منظور چیست.

تغییر تم یعنی چه؟ (نگاهی سریع)
بهصورت خلاصه، تغییر تم یعنی:
🎨 تغییر مجموعهای از استایلها (رنگ، فونت، سایه، بکگراند)
🧠 جدا کردن منطق ظاهری از منطق بیزینس
💾 امکان ذخیره ترجیح کاربر (مثلاً در LocalStorage یا Cookie)
🌙 پشتیبانی از Dark / Light / System
⚙️ قابل استفاده در کل اپلیکیشن، نه فقط یک کامپوننت
تا اینجا فقط «چیستی تغییر تم» را دیدیم. حالا سراغ تئوری برویم.
تئوری تغییر تم در ری اکت React (بدون وابستگی به فریمورک)
در ری اکت ، تغییر تم یک اصل مهم دارد:
تم باید گلوبال باشد، نه لوکال
چرا؟
چون تم:
روی چندین کامپوننت اثر میگذارد
نباید در هر کامپوننت دوباره تعریف شود
باید قابل تغییر در هنگام اجرا runtime باشد
به همین دلیل، معمولاً از این ابزارها استفاده میشود:
Context API
CSS Variables
یا ترکیب این دو
مدل ذهنی درست برای تم
به این شکل فکر کن:
React → تصمیم میگیرد کدام تم فعال است
CSS → تصمیم میگیرد آن تم چگونه دیده میشود
یعنی:
React = State & Logic
CSS = Appearance
این تفکیک باعث میشود:
کد تمیزتر شود
تغییر تم سریعتر باشد
پرفورمنس و کارایی بهتر بماند
نقش متغیرهای CSS در تغییر تم
متغیرهای CSS ستون فقرات تغییر تم مدرن هستند.
چرا استفاده از متغیرهای CSS؟
در هنگام اجرا قابل تغییر هستند
نیازی به رندر مجدد سنگین ندارند
با Tailwind، MUI، CSS Modules و… سازگارند
مثال مفهومی (نه کد):
بهجای اینکه بگویی:
background:
#fff
میگویی:
background:
var(--bg-color)
و تم فقط مقدار این متغیرها را عوض میکند.
تم در ری اکت: جریان منطقی
بهصورت تئوریک، این اتفاق میافتد:
کاربر تم را انتخاب میکند (Light / Dark / System)
این انتخاب در State ذخیره میشود
مقدار متغیر CSS تغییر میکند
کل رابط کاربری بدون بارگذاری مجدد آپدیت میشود
نکته مهم:
ری اکت مسئول «انتخاب تم» است، نه «رنگ زدن رابط کاربری»
تفاوت ری اکت و نکست در بحث تغییر تم در طراحی سایت و صفحه فرود
اینجا نقطهای است که خیلیها اشتباه میکنند.
ری اکت (یک اپلیکیشن تک صفحه SPA معمولی)
همهچیز در کلاینت اتفاق میافتد
تم بعد از بارگذاری اپ تغییر میکند
مشکل خاصی با رندر سمت سرور SSR نداریم
نکست (اپ روتر یا پیج روتر)
رندر اولیه ممکن است روی سرور انجام شود
اگر تم فقط کلاینت ساید باشد:
❌ Flash of wrong theme (FOUC)
حالت روشن ناگهانی قبل از دارک ❌
پس در نکست باید به رندرینگ سمت سرور SSR فکر کنیم.
چالش اصلی تم در طراحی سایت با نکست
مشکل اصلی این است:
سرور نمیداند کاربر چه تمی را ترجیح میدهد
چون:
سرور به ذخیره محلی LocalStorage دسترسی ندارد
تم معمولاً بعد از هایدریشن (هیدریشن) hydration مشخص میشود
نتیجه:
رابط کاربری یک لحظه با تم اشتباه نمایش داده میشود
راهحل تئوریک در Next.js
برای حل این مشکل، معمولاً از این مفاهیم استفاده میشود:
کوکی Cookie برای ذخیره تم
یا
prefers-color-schemeترجیحات سیستم عاملیا اجرای یک اسکریپت کوچک قبل از هایدریشن hydration
هدف:
تم صحیح قبل از اولین paint اعمال شود
تم پرووایدر Theme Provider چیست و چرا مهم است؟
Theme Provider یک لایه مرکزی است که:
تم فعلی را نگه میدارد
متد تغییر تم را فراهم میکند
کل اپلیکیشن به آن دسترسی دارد
از نظر مفهومی:
مثل Auth Provider
یا Language Provider (i18n)
اشتباهات رایج در طراحی تم
چند خطای پرتکرار:
❌ نگهداشتن تم در هر کامپوننت
❌ وابسته کردن تم به کلاسهای زیاد
❌ نادیده گرفتن رندرینگ سمت سرور SSR در نکست
❌ قاطی کردن منطق رابط کاربری با منطق تم
❌ استفاده بیش از حد از re-render
تم خوب چگونه است:
ساده است
گلوبال است
کمهزینه است
اگر وقت ندارید متن کامل را بخوانید، این مفهوم کلی را بگیرید:
اگر بخواهیم خیلی خلاصه درباره تم در طراحی سایت با نکست و ری اکت بگوییم:
تم = استیت + متغیرهای سی اس اس
ری اکت → تصمیمگیر
سی اس اس → اجراکننده
نکست → نیازمند توجه ویژه به رندرینگ سمت سرور
تم خوب → کمریرندر، قابل توسعه، قابل ذخیره
مرا دنبال کنید. اگر خاطره ای در ابتدای استفاده تغییر تم دارید با من و دیگران در میان بگذارید. اگر سوال یا پیشنهادی دارید نیز بنویسید.
مطلبی دیگر از این انتشارات
چگونه سایت خود را برای افزایش نرخ تبدیل (Conversion Rate) بهینه کنیم؟
مطلبی دیگر از این انتشارات
تجربه کاربری بهتر با ریاکت و نکست جیاس: چرا باید انتخاب شما باشد؟
مطلبی دیگر از این انتشارات
اینترنت بین الملل همراه اولی ها وصل شد