اختصارات لوحة المفاتيح

Tab
التنقل بين العناصر التفاعلية
Shift + Tab
التنقل للخلف
Entrée / Espace
تنشيط الأزرار والروابط
Échap
إغلاق النوافذ المنبثقة والقوائم
↑ ↓
التنقل في القوائم والقوائم

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

مثال سيء

قائمة مع التنقل بـ Tab فقط:

<!-- سيء: التنقل بـ Tab فقط -->
<div class="menu">
  <div tabindex="0">🏠 الرئيسية</div>
  <div tabindex="0">📋 المشاريع</div>
  <div tabindex="0">👥 الفريق</div>
  <div tabindex="0">📊 الإحصائيات</div>
  <div tabindex="0">⚙️ الإعدادات</div>
</div>

<!-- يجب على المستخدم الضغط على Tab 5 مرات -->
<!-- لا يوجد تنقل بالأسهم -->
<!-- لا توجد دلالات قائمة -->

مثال جيد

قائمة مع التنقل بالأسهم:

💡 استخدم ↑ ↓ للتنقل، Enter للاختيار

<!-- جيد: التنقل بالأسهم مع roving tabindex -->
<div
  role="menu"
  @keydown="handleKeydown"
>
  <div
    v-for="(item, i) in items"
    role="menuitem"
    :tabindex="selected === i ? 0 : -1"
    @focus="selected = i"
    :class="{ selected: selected === i }"
  >
    {{ item }}
  </div>
</div>
// التنقل بالأسهم مع roving tabindex
function handleKeydown(e) {
  switch(e.key) {
    case 'ArrowDown':
      selected = (selected + 1) % items.length
      break
    case 'ArrowUp':
      selected = selected === 0
        ? items.length - 1
        : selected - 1
      break
    case 'Enter':
      selectItem(selected)
      break
  }
}

الشرح: تسمح القوائم القابلة للتنقل بلوحة المفاتيح باستخدام مفاتيح الأسهم للتنقل بين العناصر، بالإضافة إلى التنقل الكلاسيكي بـ Tab.

أنماط التركيز المرئية

مثال سيء

جرب التنقل بـ Tab في هذه المنطقة:

رابط إلى صفحة
/* ❌ يزيل جميع مؤشرات التركيز */
*:focus {
  outline: none !important;
}

button:focus,
a:focus,
input:focus {
  outline: none !important;
}
<!-- ❌ مشاكل إمكانية الوصول: -->
<button>زر 1</button>        <!-- لا يوجد نوع، تركيز غير مرئي -->
<button>زر 2</button>        <!-- لا يوجد نوع، تركيز غير مرئي -->
<a href="#">رابط</a>           <!-- تركيز غير مرئي -->
<input type="text" />         <!-- تركيز غير مرئي -->

<!-- التنقل بلوحة المفاتيح مستحيل المتابعة بصريًا -->

مثال جيد

جرب التنقل بـ Tab في هذه المنطقة:

رابط إلى صفحة
/* ✅ مؤشرات تركيز مرئية ويمكن الوصول إليها */
button:focus-visible {
  outline: 3px solid #4F46E5;
  outline-offset: 2px;
}

input:focus-visible {
  border-color: #4F46E5;
  outline: 2px solid #4F46E5;
  outline-offset: 1px;
}
<button type="button">زر 1</button>
<button type="button">زر 2</button>
<a href="#">رابط إلى صفحة</a>
<input type="text" placeholder="أدخل نصًا" />

الشرح: يحتاج المستخدمون الذين يتنقلون بلوحة المفاتيح إلى مؤشرات بصرية واضحة لمعرفة مكانهم على الصفحة.

رابط التخطي (الانتقال إلى المحتوى)

مثال سيء

المحتوى الرئيسي

يجب على المستخدم التنقل عبر جميع روابط التنقل...

<!-- سيء: لا يوجد رابط تخطي -->
<header>
  <nav>
    <a href="#">الرئيسية</a>
    <a href="#">المنتجات</a>
    <a href="#">الخدمات</a>
    <!-- 10+ روابط تنقل... -->
  </nav>
</header>
<main>
  <!-- يجب على المستخدم المرور عبر جميع عناصر التنقل -->
  <h1>المحتوى الرئيسي</h1>
</main>

مثال جيد

المحتوى الرئيسي

يمكن للمستخدم الوصول مباشرة إلى هنا بفضل رابط التخطي!

/* رابط التخطي مخفي افتراضيًا، مرئي عند التركيز */
.skip-link {
  position: absolute;
  top: -100px;
  left: 1rem;
  z-index: 1000;
  padding: 0.5rem 1rem;
  background: var(--color-primary);
  color: white;
  text-decoration: none;
  border-radius: 0.625rem;
}

.skip-link:focus {
  top: 1rem;
}
<a href="#main-content" class="skip-link">
  الانتقال إلى المحتوى الرئيسي
</a>
<header>
  <nav aria-label="التنقل الرئيسي">
    <ul>
      <li><a href="/">الرئيسية</a></li>
      <li><a href="/produits">المنتجات</a></li>
      <li><a href="/services">الخدمات</a></li>
    </ul>
  </nav>
</header>
<main id="main-content">
  <h1>المحتوى الرئيسي</h1>
</main>

الشرح: تسمح روابط التخطي لمستخدمي لوحة المفاتيح بالانتقال مباشرة إلى المحتوى الرئيسي دون الحاجة إلى المرور عبر جميع عناصر التنقل.

نافذة منبثقة مع فخ التركيز

مثال سيء

مثال جيد

الشرح: يجب أن تحافظ النوافذ المنبثقة على التركيز بالداخل وتسمح بالإغلاق بمفتاح Escape. يجب أن يعود التركيز إلى العنصر الذي فتح النافذة المنبثقة.