tabindex وaccesskey
تحكّم في ترتيب التنقل بلوحة المفاتيح والاختصارات
tabindex وaccesskey درس مجاني في HTML Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في HTML Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة HTML Academy 4 دروس في المجموع.
التنقل باستخدام لوحة المفاتيح
يعتمد المستخدمون الذين لا يستخدمون الفأرة على Tab للتنقل بين العناصر التفاعلية:
- العناصر القابلة للتركيز طبيعيًا:
<a href>و<button>و<input>و<select>و<textarea> - العناصر غير التفاعلية مثل
<div>و<span>لا تكون ضمن ترتيب Tab - تتحكم
tabindexفي ظهور العنصر ضمن ترتيب Tab وموضعه فيه
tabindex="0"
تضيف tabindex="0" عنصرًا غير تفاعلي إلى ترتيب Tab الطبيعي:
<div tabindex="0" role="button" onclick="handleClick()">
Custom Button
</div>
<!-- Now Tab navigates to this div -->
<!-- It receives focus at the natural position in the DOM -->
<!-- Better: use a real button instead! -->
<button onclick="handleClick()">Real Button</button>tabindex="-1"
تجعل tabindex="-1" العنصر قابلًا للتركيز برمجيًا، لكنها تزيله من ترتيب Tab:
<div id="modal" tabindex="-1" role="dialog">
<!-- modal content -->
</div>
<script>
// Open modal and send focus to it:
document.getElementById('modal').focus();
// Modal is now focused but not in the normal tab sequence
</script>قيم tabindex الموجبة — تجنّبها
تضبط قيم tabindex الموجبة، مثل tabindex="3"، ترتيبًا مخصصًا لـ Tab — فتجنّب استخدامها:
<!-- BAD: positive tabindex creates unpredictable order -->
<input tabindex="3">
<input tabindex="1">
<input tabindex="2">
<!-- The tab order becomes: 1, 2, 3, then all tabindex=0 elements -->
<!-- This almost always confuses users and fails WCAG 2.4.3 -->
<!-- Fix the DOM order instead of using positive tabindex -->إدارة التركيز في تطبيقات SPA
يجب أن تدير تطبيقات الصفحة الواحدة التركيز يدويًا:
// When navigating to a new route:
document.querySelector('#main-content').focus();
// When opening a modal:
const modal = document.getElementById('modal');
modal.removeAttribute('hidden');
modal.querySelector('[autofocus], button, [tabindex]').focus();
// When closing a modal: return focus to the trigger
document.getElementById('open-btn').focus();حصر التركيز في النوافذ المنبثقة
احصر التركيز داخل النافذة المنبثقة المفتوحة حتى يبقى Tab ضمنها:
function trapFocus(element) {
const focusable = element.querySelectorAll(
'a, button, input, textarea, select, [tabindex]:not([tabindex="-1"])'
);
const first = focusable[0];
const last = focusable[focusable.length - 1];
element.addEventListener('keydown', e => {
if (e.key === 'Tab') {
if (e.shiftKey && document.activeElement === first) {
e.preventDefault(); last.focus();
} else if (!e.shiftKey && document.activeElement === last) {
e.preventDefault(); first.focus();
}
}
});
}السمة accesskey
تعيّن السمة accesskey اختصارًا من لوحة المفاتيح لعنصر:
<button accesskey="s">Submit</button>
<!-- On Windows: Alt+S focuses/activates the button -->
<!-- On Mac: Control+Option+S -->
<!-- On Firefox: Shift+Alt+S -->
<a href="/" accesskey="h">Home</a>قيود accesskey
تتضمن accesskey مشكلات مهمة:
- تختلف مفاتيح التفعيل باختلاف المتصفحات وأنظمة التشغيل
- تتعارض مع اختصارات المتصفح، مثل Alt+F لفتح قائمة File
- لا تعلن عنها قارئات الشاشة تلقائيًا
- نادرًا ما تُستخدم عمليًا — لذا وثّقها إذا استخدمتها
مؤشرات التركيز المرئية
لا تُخفِ مخططات التركيز مطلقًا — فهي ضرورية لمستخدمي لوحة المفاتيح:
/* BAD: removes focus outline for everyone */
* { outline: none; }
/* Better: style focus outlines, don't remove them */
:focus-visible {
outline: 2px solid #0070f3;
outline-offset: 2px;
border-radius: 3px;
}
/* :focus-visible only shows outline for keyboard navigation -->
/* Mouse clicks do not trigger :focus-visible in modern browsers */نمط رابط التخطي
يتيح رابط التخطي لمستخدمي لوحة المفاتيح تجاوز عناصر التنقل المتكررة:
<a href="#main-content" class="skip-link">Skip to main content</a>
<nav>... long navigation ...</nav>
<main id="main-content" tabindex="-1">... content ...</main>
<!-- CSS: -->
<!--
.skip-link {
position: absolute;
top: -100%;
}
.skip-link:focus {
top: 0;
}
-->السمة autofocus
تنقل السمة autofocus التركيز إلى عنصر عند تحميل الصفحة:
<input type="search" autofocus placeholder="Search...">
<!-- Useful on search pages or forms with a single primary field -->
<!-- Use sparingly: it can disrupt users who rely on the page top for orientation -->
<!-- Only one element per page should have autofocus -->تحقق سريع
ما قيمة tabindex التي تجعل العنصر قابلًا للتركيز باستخدام JavaScript، مع تخطيه في تنقل Tab العادي؟
مراجعة: tabindex وaccesskey
أساسيات إمكانية الوصول باستخدام لوحة المفاتيح:
tabindex="0"— إضافة العنصر إلى ترتيب Tab الطبيعيtabindex="-1"— قابل للتركيز برمجيًا، لكنه ليس ضمن ترتيب Tab- تجنّب قيم tabindex الموجبة
- لا تزل مخططات
:focus-visibleمطلقًا - نفّذ روابط تخطٍّ لمستخدمي لوحة المفاتيح
- تتوفر
accesskey، لكنها نادرًا ما تكون عملية بسبب التعارضات
الأسئلة الشائعة
هل درس «tabindex وaccesskey» مجاني؟
نعم — نص درس «tabindex وaccesskey» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة HTML Academy، انتقل إلى CoddyKit PRO. تتضمن دورة HTML Academy 4 دروس في المجموع.
ماذا ستتعلم في «tabindex وaccesskey»؟
تحكّم في ترتيب التنقل بلوحة المفاتيح والاختصارات تتمرن على HTML Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ HTML Academy؟
لا تُشترط خبرة سابقة. HTML Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «tabindex وaccesskey»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس HTML Academy هذا؟
نعم. كل درس في HTML Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- id وclass وstyle وtitle
- السمة hidden
- tabindex وaccesskey
- سمات البيانات المخصّصة data-*