ویژگی تصویر

طراحی نوار وضعیت اتصال با CSS

  /  CSS   /  طراحی نوار وضعیت اتصال با CSS
بنر تبلیغاتی الف

نوار وضعیت اتصال (Connection Status Bar) ابزاری ساده ولی بسیار مؤثر برای اطلاع‌رسانی وضعیت شبکه یا سرویس به کاربران است. این عناصر در اپلیکیشن‌های تحت وب، پنل‌های مدیریت، و اپلیکیشن‌های موبایل وبی کاربرد دارند. در این مقاله به طراحی، پیاده‌سازی، بهینه‌سازی و نکات دسترسی (accessibility) نوار وضعیت با استفاده از CSS، HTML و JavaScript می‌پردازیم.

اصول طراحی و تجربه کاربری

  • وضوح: پیام باید سریع و کوتاه باشد؛ مثلاً “متصل”، “قطع اتصال” یا “در تلاش برای اتصال”.
  • رنگ‌بندی معنادار: از رنگ‌های استاندارد مثل سبز برای آنلاین و قرمز برای آفلاین استفاده کنید.
  • عدم مزاحمت: نوار باید اطلاعات مهم را نشان دهد بدون اینکه تجربه کاربر را مختل کند.
  • قابلیت واکنش‌پذیری: در صفحه‌های کوچک منتقل یا جمع‌شونده باشد.
  • دسترس‌پذیری: از aria-live و role مناسب برای اعلان تغییر وضعیت به کاربران با ابزارهای کمکی استفاده کنید.

نمونه پیاده‌سازی پایه (HTML + CSS + JS)

<!-- HTML -->
<div id="conn-status" role="status" aria-live="polite">
  <span class="dot"></span>
  <span class="text">Checking…</span>
</div>

<!-- CSS -->
#conn-status{
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  display: flex;
  gap: .5rem;
  align-items: center;
  padding: .45rem .75rem;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
  color: #fff;
  background: rgba(0,0,0,0.6);
  z-index: 9999;
  transform: translateY(-100%);
  transition: transform .25s ease, background .25s ease;
  pointer-events: none;
}

#conn-status.show{
  transform: translateY(0);
  pointer-events: auto;
}

#conn-status .dot{
  width: .9rem;
  height: .9rem;
  border-radius: 50%;
  background: #f3c623; /* default: checking */  box-shadow: 0 0 8px rgba(243,198,35,.6);
  flex: 0 0 auto;
}

/* states */#conn-status.online{
  background: linear-gradient(90deg, rgba(16,185,129,0.95), rgba(34,197,94,0.95));
}
#conn-status.online .dot{
  background: #10b981;
  box-shadow: 0 0 12px rgba(16,185,129,.55);
}

#conn-status.offline{
  background: linear-gradient(90deg, rgba(239,68,68,0.95), rgba(220,38,38,0.95));
}
#conn-status.offline .dot{
  background: #ef4444;
}

/* prefers-reduced-motion */@media (prefers-reduced-motion: reduce){
  #conn-status{ transition: none; }
}

توضیح: این کد یک نوار وضعیت ساده در سقف صفحه ایجاد می‌کند. عنصر #conn-status به صورت پنهان بالای صفحه قرار دارد و با افزودن کلاس .show ظاهر می‌شود. کلاس‌های .online و .offline رنگ و ظاهر را تغییر می‌دهند. از aria-live=”polite” برای اطلاع‌رسانی تغییرات به ابزارهای کمک‌کننده استفاده شده است.

منطق JavaScript برای تشخیص اتصال

// JavaScript: connection status handling
const status = document.getElementById('conn-status');
const text = status.querySelector('.text');

function updateStatus(){
  if (navigator.onLine) {
    status.classList.remove('offline');
    status.classList.add('online', 'show');
    text.textContent = 'Online';
    setTimeout(()=> status.classList.remove('show'), 3500); // auto-hide
  } else {
    status.classList.remove('online');
    status.classList.add('offline', 'show');
    text.textContent = 'Offline — Reconnecting...';
  }
}

window.addEventListener('online', updateStatus);
window.addEventListener('offline', updateStatus);

// initial check
updateStatus();

توضیح: این اسکریپت از API ساده navigator.onLine و رویدادهای window ‘online’ و ‘offline’ برای بروزرسانی نوار وضعیت استفاده می‌کند. در حالت آنلاین نوار به صورت موقت نمایش داده شده و سپس خودبه‌خود مخفی می‌شود، اما در حالت آفلاین نوار تا زمانی که اتصال برقرار نشود نمایش داده می‌ماند.

بهبودها و نکات حرفه‌ای

  • استفاده از CSS Variables برای آسان‌تر کردن تغییر رنگ و تم در آینده.
  • حالت “در حال تلاش برای اتصال”: زمانی که شبکه ناپایدار است، از انیمیشن‌های ملایم برای نشان دادن تلاش استفاده کنید.
  • عدم نمایش در مواقع لود اولیه: در بعضی اپ‌ها بهتر است نوار فقط بعد از اولین تلاش اتصال ناموفق نمایش یابد تا اعلان‌های غیرضروری کمتر شوند.
  • تست در شرایط ضعیف شبکه: شبیه‌سازی تاخیر و قطع-وصل برای آزمایش رفتار اپلیکیشن الزامی است.

نمونه پیشرفته با وضعیت “reconnecting” و accessible aria

<!-- HTML -->
<div id="conn-status" role="status" aria-live="assertive" aria-atomic="true">
  <span class="dot"></span>
  <span class="text">Connecting…</span>
</div>

/* CSS: uses --status-color variable and reduced motion already considered */

توضیح: با تنظیم aria-live روی “assertive” و aria-atomic روی true، تغییر وضعیت بلافاصله توسط صفحه‌خوان‌ها اعلام می‌شود. در طراحی باید دقت کنید که اعلان‌های مکرر باعث آزار کاربران کم‌توان نشود؛ از debounce یا محدود کردن تعداد اعلان‌ها استفاده کنید.

نمونه جدول مقایسه وضعیت‌ها

وضعیترنگ پیشنهادیپیام نمونه
Onlineسبز (#10b981)اتصال برقرار است
Offlineقرمز (#ef4444)قطع اتصال — بررسی شبکه
Reconnectingزرد/نارنجی (#f3c623)در حال تلاش برای اتصال مجدد

نکات بهینه‌سازی و دسترسی

  • از prefers-reduced-motion برای خاموش کردن انیمیشن‌ها برای کاربرانی که حرکت را کاهش داده‌اند.
  • استفاده از aria-live و role=”status” برای مطلع کردن کاربران ابزارهای کمکی.
  • محدود کردن نمایش‌های متوالی: برای جلوگیری از اسپم شدن با اعلان‌های کوتاه از debounce یا throttle استفاده کنید.
  • رسپانسیو: در موبایل نوار را به صورت کوچک یا آیکون نشان دهید تا فضای محتوا اشغال نشود.
  • لوکال‌سازی پیام‌ها: پیام‌ها را بر اساس زبان و منطقه کاربر ترجمه کنید.

موارد پیشرفته و ادغام با سرویس‌ها

در اپلیکیشن‌های پیچیده‌تر، نوار وضعیت می‌تواند وضعیت WebSocket، API health، یا وضعیت سرویس‌های ثالث (مثل CDN) را نمایش دهد. برای این منظور پیشنهاد می‌شود:

  • یک لایه وضعیت سرور در بک‌اند ایجاد کنید که سلامت سرویس‌ها را مانیتور کند.
  • از Socket یا SSE برای اطلاع‌رسانی لحظه‌ای به کلاینت استفاده کنید.
  • در صورت عدم اتصال، راهکار fallback (مثلاً کش محلی) را به کاربر اطلاع دهید و گزینه‌هایی برای retry ارائه کنید.

خلاصه و جمع‌بندی

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

در صورت نیاز می‌توان نمونه کامل‌تر با مدیریت debounce، نمایش تاریخچه قطع‌ها، و ادغام با پنل مدیریتی نیز ارائه داد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: