العربية

اكتشف واجهات علامات تبويب سهلة الاستخدام ومتاحة للجميع. تعلم أفضل الممارسات للتنقل بلوحة المفاتيح وأدوار ARIA وإدارة التركيز لجمهور عالمي.

إتقان واجهات علامات التبويب: نظرة معمقة على التنقل باستخدام لوحة المفاتيح وإدارة التركيز

تُعد واجهات علامات التبويب حجر الزاوية في تصميم الويب الحديث. من صفحات المنتجات ولوحات تحكم المستخدم إلى تطبيقات الويب المعقدة، فإنها توفر حلاً أنيقًا لتنظيم المحتوى وترتيب واجهة المستخدم. وعلى الرغم من أنها قد تبدو بسيطة ظاهريًا، إلا أن إنشاء مكون علامات تبويب فعال ومتاح للجميع يتطلب فهمًا عميقًا للتنقل باستخدام لوحة المفاتيح وإدارة دقيقة للتركيز. يمكن أن تصبح واجهة علامات التبويب سيئة التنفيذ حاجزًا لا يمكن التغلب عليه للمستخدمين الذين يعتمدون على لوحات المفاتيح أو التقنيات المساعدة، مما يمنعهم فعليًا من الوصول إلى المحتوى الخاص بك.

هذا الدليل الشامل مخصص لمطوري الويب، ومصممي واجهة المستخدم/تجربة المستخدم، والمدافعين عن إمكانية الوصول الذين يرغبون في تجاوز الأساسيات. سنستكشف الأنماط المعترف بها دوليًا للتفاعل باستخدام لوحة المفاتيح، والدور الحاسم لـ ARIA (تطبيقات الإنترنت الغنية الميسرة) في توفير السياق الدلالي، والتقنيات الدقيقة لإدارة التركيز التي تخلق تجربة مستخدم سلسة وبديهية للجميع، بغض النظر عن موقعهم أو كيفية تفاعلهم مع الويب.

تشريح واجهة علامات التبويب: المكونات الأساسية

قبل الغوص في الآليات، من الضروري تحديد مصطلحات مشتركة بناءً على ممارسات التأليف الخاصة بـ WAI-ARIA. يتكون مكون علامات التبويب القياسي من ثلاثة عناصر أساسية:

فهم هذه البنية هو الخطوة الأولى نحو بناء مكون ليس فقط متماسكًا بصريًا، ولكن أيضًا مفهومًا دلاليًا للتقنيات المساعدة مثل قارئات الشاشة.

مبادئ التنقل السلس باستخدام لوحة المفاتيح

بالنسبة لمستخدم الفأرة المبصر، يكون التفاعل مع علامات التبويب مباشرًا: تنقر على علامة التبويب التي تريد رؤيتها. بالنسبة للمستخدمين الذين يعتمدون على لوحة المفاتيح فقط، يجب أن تكون التجربة بديهية بنفس القدر. توفر ممارسات التأليف الخاصة بـ WAI-ARIA نموذجًا قويًا وموحدًا للتفاعل باستخدام لوحة المفاتيح يتوقعه مستخدمو التكنولوجيا المساعدة.

التنقل في قائمة علامات التبويب (`role="tablist"`)

يحدث التفاعل الأساسي داخل قائمة علامات التبويب. الهدف هو السماح للمستخدمين بتصفح واختيار علامات التبويب بكفاءة دون الحاجة إلى التنقل عبر كل عنصر تفاعلي في الصفحة.

نماذج التفعيل: تلقائي أم يدوي

عندما يتنقل المستخدم بين علامات التبويب باستخدام مفاتيح الأسهم، متى يجب عرض اللوحة المقابلة؟ هناك نموذجان قياسيان:

يجب أن يعتمد اختيارك لنموذج التفعيل على محتوى وسياق واجهتك. أيًا كان اختيارك، كن متسقًا في جميع أنحاء تطبيقك.

إتقان إدارة التركيز: البطل المجهول لسهولة الاستخدام

إدارة التركيز الفعالة هي ما يفصل بين الواجهة غير المتقنة والواجهة السلسة. إنها تتعلق بالتحكم البرمجي في مكان تركيز المستخدم، مما يضمن مسارًا منطقيًا ويمكن التنبؤ به عبر المكون.

تقنية `tabindex` المتجولة

تقنية `tabindex` المتجولة هي حجر الزاوية في التنقل باستخدام لوحة المفاتيح داخل المكونات مثل قوائم علامات التبويب. الهدف هو جعل الأداة بأكملها تعمل كنقطة توقف `Tab` واحدة.

إليك كيف تعمل:

  1. يتم إعطاء عنصر علامة التبويب النشطة حاليًا `tabindex="0"`. هذا يجعلها جزءًا من ترتيب التنقل الطبيعي ويسمح لها بتلقي التركيز عندما ينتقل المستخدم إلى المكون.
  2. يتم إعطاء جميع عناصر علامات التبويب غير النشطة الأخرى `tabindex="-1"`. هذا يزيلها من ترتيب التنقل الطبيعي، لذلك لا يضطر المستخدم إلى الضغط على `Tab` عبر كل واحدة منها. لا يزال من الممكن تركيزها برمجيًا، وهو ما نفعله باستخدام التنقل بمفاتيح الأسهم.

عندما يضغط المستخدم على مفتاح سهم للانتقال من علامة التبويب أ إلى علامة التبويب ب:

تضمن هذه التقنية أنه بغض النظر عن عدد علامات التبويب في القائمة، فإن المكون يشغل دائمًا موضعًا واحدًا فقط في تسلسل `Tab` العام للصفحة.

التركيز داخل لوحات علامات التبويب

بمجرد أن تكون علامة التبويب نشطة، إلى أين يذهب التركيز بعد ذلك؟ السلوك المتوقع هو أن الضغط على `Tab` من عنصر علامة تبويب نشط سينقل التركيز إلى أول عنصر قابل للتركيز *داخل* لوحة علامة التبويب المقابلة لها. إذا لم تكن لوحة علامة التبويب تحتوي على عناصر قابلة للتركيز، فيجب أن يؤدي الضغط على `Tab` إلى نقل التركيز إلى العنصر التالي القابل للتركيز في الصفحة *بعد* قائمة علامات التبويب.

وبالمثل، عندما يكون المستخدم مركزًا على آخر عنصر قابل للتركيز داخل لوحة علامة التبويب، يجب أن يؤدي الضغط على `Tab` إلى نقل التركيز خارج اللوحة إلى العنصر التالي القابل للتركيز في الصفحة. يجب أن يؤدي الضغط على `Shift + Tab` من أول عنصر قابل للتركيز داخل اللوحة إلى نقل التركيز مرة أخرى إلى عنصر علامة التبويب النشط.

تجنب حصر التركيز: واجهة علامات التبويب ليست مربع حوار مشروط (modal dialog). يجب أن يكون المستخدمون قادرين دائمًا على التنقل داخل وخارج مكون علامة التبويب ولوحاته باستخدام مفتاح `Tab`. لا تحصر التركيز داخل المكون، لأن هذا يمكن أن يكون مربكًا ومحبطًا.

دور ARIA: توصيل الدلالات إلى التقنيات المساعدة

بدون ARIA، فإن واجهة علامات التبويب المبنية باستخدام عناصر `

` هي مجرد مجموعة من الحاويات العامة لقارئ الشاشة. توفر ARIA المعلومات الدلالية الأساسية التي تسمح للتقنيات المساعدة بفهم غرض المكون وحالته.

أدوار وسمات ARIA الأساسية

  • `role="tablist"`: يوضع على العنصر الذي يحتوي على علامات التبويب. يعلن، "هذه قائمة بعلامات التبويب."
  • `aria-label` أو `aria-labelledby`: تستخدم على عنصر `tablist` لتوفير اسم يمكن الوصول إليه، مثل `aria-label="فئات المحتوى"`.
  • `role="tab"`: يوضع على كل عنصر تحكم فردي لعلامة التبويب (غالبًا ما يكون عنصر `
  • `aria-selected="true"` أو `"false"`: سمة حالة حرجة على كل `role="tab"`. تشير `"true"` إلى علامة التبويب النشطة حاليًا، بينما تشير `"false"` إلى غير النشطة. يجب تحديث هذه الحالة ديناميكيًا باستخدام JavaScript.
  • `aria-controls="panel-id"`: توضع على كل `role="tab"`، يجب أن تكون قيمتها هي `id` الخاص بعنصر `tabpanel` الذي تتحكم فيه. هذا ينشئ رابطًا برمجيًا بين عنصر التحكم ومحتواه.
  • `role="tabpanel"`: يوضع على كل عنصر لوحة محتوى. يعلن، "هذه لوحة محتوى مرتبطة بعلامة تبويب."
  • `aria-labelledby="tab-id"`: توضع على كل `role="tabpanel"`، يجب أن تكون قيمتها هي `id` الخاص بعنصر `role="tab"` الذي يتحكم فيها. هذا ينشئ الارتباط العكسي، مما يساعد التقنيات المساعدة على فهم أي علامة تبويب تصف اللوحة.

إخفاء المحتوى غير النشط

لا يكفي إخفاء لوحات علامات التبويب غير النشطة بصريًا. يجب أيضًا إخفاؤها عن التقنيات المساعدة. الطريقة الأكثر فعالية للقيام بذلك هي استخدام السمة `hidden` أو `display: none;` في CSS. هذا يزيل محتويات اللوحة من شجرة إمكانية الوصول، مما يمنع قارئ الشاشة من الإعلان عن محتوى غير ذي صلة حاليًا.

التنفيذ العملي: مثال عالي المستوى

دعونا نلقي نظرة على بنية HTML مبسطة تتضمن أدوار وسمات ARIA هذه.

بنية HTML


<h2 id="tablist-label">إعدادات الحساب</h2>
<div role="tablist" aria-labelledby="tablist-label">
  <button id="tab-1" type="button" role="tab" aria-selected="true" aria-controls="panel-1" tabindex="0">
    الملف الشخصي
  </button>
  <button id="tab-2" type="button" role="tab" aria-selected="false" aria-controls="panel-2" tabindex="-1">
    كلمة المرور
  </button>
  <button id="tab-3" type="button" role="tab" aria-selected="false" aria-controls="panel-3" tabindex="-1">
    الإشعارات
  </button>
</div>

<div id="panel-1" role="tabpanel" aria-labelledby="tab-1" tabindex="0">
  <p>محتوى لوحة الملف الشخصي...</p>
</div>
<div id="panel-2" role="tabpanel" aria-labelledby="tab-2" tabindex="0" hidden>
  <p>محتوى لوحة كلمة المرور...</p>
</div>
<div id="panel-3" role="tabpanel" aria-labelledby="tab-3" tabindex="0" hidden>
  <p>محتوى لوحة الإشعارات...</p>
</div>

منطق JavaScript (شفرة زائفة)

سيكون JavaScript الخاص بك مسؤولاً عن الاستماع إلى أحداث لوحة المفاتيح على `tablist` وتحديث السمات وفقًا لذلك.


const tablist = document.querySelector('[role="tablist"]');
const tabs = tablist.querySelectorAll('[role="tab"]');

tablist.addEventListener('keydown', (e) => {
  let currentTab = document.activeElement;
  let newTab;

  if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
    // ابحث عن علامة التبويب التالية في التسلسل، مع الالتفاف إذا لزم الأمر
    newTab = getNextTab(currentTab);
  } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
    // ابحث عن علامة التبويب السابقة في التسلسل، مع الالتفاف إذا لزم الأمر
    newTab = getPreviousTab(currentTab);
  } else if (e.key === 'Home') {
    newTab = tabs[0];
  } else if (e.key === 'End') {
    newTab = tabs[tabs.length - 1];
  }

  if (newTab) {
    activateTab(newTab);
    e.preventDefault(); // منع السلوك الافتراضي للمتصفح لمفاتيح الأسهم
  }
});

function activateTab(tab) {
  // إلغاء تنشيط جميع علامات التبويب الأخرى
  tabs.forEach(t => {
    t.setAttribute('aria-selected', 'false');
    t.setAttribute('tabindex', '-1');
    document.getElementById(t.getAttribute('aria-controls')).hidden = true;
  });

  // تنشيط علامة التبويب الجديدة
  tab.setAttribute('aria-selected', 'true');
  tab.setAttribute('tabindex', '0');
  document.getElementById(tab.getAttribute('aria-controls')).hidden = false;
  tab.focus();
}

الاعتبارات العالمية وأفضل الممارسات

يتطلب البناء لجمهور عالمي التفكير فيما هو أبعد من لغة أو ثقافة واحدة. عندما يتعلق الأمر بواجهات علامات التبويب، فإن الاعتبار الأكثر أهمية هو اتجاه النص.

دعم اللغات من اليمين إلى اليسار (RTL)

بالنسبة للغات مثل العربية والعبرية والفارسية التي تقرأ من اليمين إلى اليسار، يجب عكس نموذج التنقل باستخدام لوحة المفاتيح. في سياق RTL:

  • يجب أن ينقل مفتاح `السهم الأيمن` التركيز إلى علامة التبويب السابقة.
  • يجب أن ينقل مفتاح `السهم الأيسر` التركيز إلى علامة التبويب التالية.

يمكن تنفيذ ذلك في JavaScript عن طريق اكتشاف اتجاه المستند (`dir="rtl"`) وعكس منطق مفاتيح الأسهم اليمنى واليسرى وفقًا لذلك. هذا التعديل الذي يبدو صغيرًا هو أمر حاسم لتوفير تجربة بديهية لملايين المستخدمين في جميع أنحاء العالم.

مؤشر التركيز البصري

لا يكفي إدارة التركيز بشكل صحيح خلف الكواليس؛ يجب أن يكون مرئيًا بوضوح. تأكد من أن علامات التبويب المركزة والعناصر التفاعلية داخل لوحات علامات التبويب لها إطار تركيز مرئي للغاية (على سبيل المثال، حلقة أو حد بارز). تجنب إزالة الإطارات باستخدام `outline: none;` دون توفير بديل أكثر قوة وسهولة في الوصول. هذا أمر بالغ الأهمية لجميع مستخدمي لوحة المفاتيح، وخاصة لأولئك الذين يعانون من ضعف البصر.

الخلاصة: البناء من أجل الشمول وسهولة الاستخدام

إن إنشاء واجهة علامات تبويب سهلة الاستخدام ومتاحة للجميع حقًا هو عملية مدروسة. يتطلب الأمر تجاوز التصميم المرئي والتعامل مع البنية الأساسية للمكون ودلالاته وسلوكه. من خلال تبني أنماط التنقل الموحدة باستخدام لوحة المفاتيح، وتنفيذ أدوار وسمات ARIA بشكل صحيح، وإدارة التركيز بدقة، يمكنك بناء واجهات ليست متوافقة فحسب، بل بديهية وتمكينية حقًا لجميع المستخدمين.

تذكر هذه المبادئ الأساسية:

  • استخدم نقطة توقف `Tab` واحدة: استخدم تقنية `tabindex` المتجولة لجعل المكون بأكمله قابلاً للتنقل باستخدام مفاتيح الأسهم.
  • تواصل مع ARIA: استخدم `role="tablist"` و `role="tab"` و `role="tabpanel"` جنبًا إلى جنب مع خصائصها المرتبطة (`aria-selected`, `aria-controls`) لتوفير معنى دلالي.
  • إدارة التركيز منطقيًا: تأكد من أن التركيز ينتقل بشكل متوقع من علامة التبويب إلى اللوحة وخارج المكون.
  • إخفاء المحتوى غير النشط بشكل صحيح: استخدم `hidden` أو `display: none` لإزالة اللوحات غير النشطة من شجرة إمكانية الوصول.
  • اختبر بدقة: اختبر تنفيذك باستخدام لوحة مفاتيح فقط ومع قارئات شاشة مختلفة (NVDA، JAWS، VoiceOver) للتأكد من أنه يعمل كما هو متوقع للجميع.

من خلال الاستثمار في هذه التفاصيل، نساهم في بناء ويب أكثر شمولاً - ويب يمكن للجميع الوصول فيه إلى المعلومات المعقدة، بغض النظر عن كيفية تنقلهم في العالم الرقمي.