دليل شامل لإمكانية الوصول في العرض الشجري، يغطي أدوار ARIA، والتنقل بلوحة المفاتيح، وأفضل الممارسات، والتوافق عبر المتصفحات لتجربة مستخدم أفضل.
العرض الشجري: إمكانية الوصول للتنقل في البيانات الهرمية
تُعد العروض الشجرية من مكونات واجهة المستخدم الأساسية لعرض البيانات الهرمية. فهي تتيح للمستخدمين التنقل في الهياكل المعقدة، مثل أنظمة الملفات، أو الهياكل التنظيمية، أو قوائم مواقع الويب، بطريقة بديهية. ومع ذلك، يمكن أن يؤدي التنفيذ السيئ للعرض الشجري إلى خلق حواجز كبيرة أمام إمكانية الوصول، خاصة للمستخدمين ذوي الإعاقة الذين يعتمدون على التقنيات المساعدة مثل قارئات الشاشة والتنقل بلوحة المفاتيح. يقدم هذا المقال دليلاً شاملاً لتصميم وتنفيذ عروض شجرية ميسّرة، مما يضمن تجربة مستخدم إيجابية للجميع.
فهم بنية العرض الشجري
يعرض العرض الشجري البيانات بتنسيق هرمي قابل للتوسيع والطي. يمكن أن تحتوي كل عقدة في الشجرة على عقد فرعية، مما ينشئ فروعًا وفروعًا فرعية. تُسمى العقدة العلوية بالعقدة الجذر. يعد فهم البنية الأساسية أمرًا بالغ الأهمية قبل الخوض في اعتبارات إمكانية الوصول.
فيما يلي تفصيل لعناصر العرض الشجري الشائعة:
- الشجرة (Tree): العنصر الحاوي الشامل الذي يضم بنية الشجرة بأكملها.
- عنصر الشجرة (Treeitem): يمثل عقدة واحدة في الشجرة. يمكن أن يكون فرعًا (قابل للتوسيع/الطي) أو ورقة (بدون أبناء).
- المجموعة (Group): (اختياري) حاوية تقوم بتجميع عناصر الشجرة الفرعية بصريًا داخل عنصر شجرة أصل.
- أيقونة التبديل/الكشف: مؤشر مرئي (على سبيل المثال، علامة زائد أو ناقص، سهم) يسمح للمستخدمين بتوسيع أو طي فرع.
- التسمية (Label): النص المعروض لكل عنصر شجرة.
أهمية أدوار وسمات ARIA
تطبيقات الإنترنت الغنية الميسّرة (ARIA) هي مجموعة من السمات التي تضيف معنى دلاليًا إلى عناصر HTML، مما يجعلها مفهومة من قبل التقنيات المساعدة. عند بناء عروض شجرية، تعتبر أدوار وسمات ARIA حاسمة لتوصيل بنية وسلوك الشجرة إلى قارئات الشاشة.
أدوار ARIA الأساسية:
role="tree"
: يُطبق على العنصر الحاوي الذي يمثل الشجرة بأكملها. يُعلم هذا التقنيات المساعدة بأن العنصر يحتوي على قائمة هرمية.role="treeitem"
: يُطبق على كل عقدة في الشجرة. يحدد هذا كل عقدة كعنصر داخل الشجرة.role="group"
: يُطبق على العنصر الحاوي الذي يجمع بصريًا عناصر الشجرة الفرعية. على الرغم من أنه ليس ضروريًا دائمًا، إلا أنه يمكن أن يحسن الدلالات.
سمات ARIA الرئيسية:
aria-expanded="true|false"
: تُطبق على عناصر الشجرة التي لها أبناء. تشير إلى ما إذا كان الفرع موسعًا حاليًا (true
) أو مطويًا (false
). قم بتحديث هذه السمة ديناميكيًا باستخدام JavaScript عندما يقوم المستخدم بتوسيع أو طي العقدة.aria-selected="true|false"
: تُطبق على عناصر الشجرة للإشارة إلى ما إذا كانت العقدة محددة حاليًا. يجب تحديد عقدة واحدة فقط في كل مرة (ما لم يتطلب تطبيقك التحديد المتعدد، وفي هذه الحالة استخدمaria-multiselectable="true"
على عنصرrole="tree"
).aria-label="[نص التسمية]"
أوaria-labelledby="[معرف عنصر التسمية]"
: يوفر تسمية وصفية للشجرة أو لعناصر الشجرة الفردية. استخدمaria-label
إذا لم تكن التسمية موجودة بصريًا؛ وإلا، استخدمaria-labelledby
لربط عنصر الشجرة بتسميته المرئية.tabindex="0"
: يُطبق على عنصر الشجرة الذي يتم التركيز عليه في البداية (عادةً الأول). استخدمtabindex="-1"
على جميع عناصر الشجرة الأخرى حتى يتم التركيز عليها (على سبيل المثال، من خلال التنقل بلوحة المفاتيح). هذا يضمن تدفقًا سليمًا للتنقل بلوحة المفاتيح.
مثال على تطبيق ARIA:
إليك مثال أساسي لكيفية هيكلة عرض شجري باستخدام سمات ARIA:
<ul role="tree" aria-label="نظام الملفات">
<li role="treeitem" aria-expanded="true" aria-selected="false" tabindex="0">
<span>المجلد الجذر</span>
<ul role="group">
<li role="treeitem" aria-expanded="false" aria-selected="false" tabindex="-1">
<span>المجلد 1</span>
<ul role="group">
<li role="treeitem" aria-selected="false" tabindex="-1"><span>الملف 1.txt</span></li>
<li role="treeitem" aria-selected="false" tabindex="-1"><span>الملف 2.txt</span></li>
</ul>
</li>
<li role="treeitem" aria-selected="false" tabindex="-1"><span>المجلد 2</span></li>
</ul>
</li>
</ul>
التنقل بلوحة المفاتيح
يعتبر التنقل بلوحة المفاتيح أمرًا بالغ الأهمية للمستخدمين الذين لا يستطيعون استخدام الفأرة. يجب أن يكون العرض الشجري المصمم جيدًا قابلاً للتنقل بالكامل باستخدام لوحة المفاتيح فقط. فيما يلي تفاعلات لوحة المفاتيح القياسية:
- السهم لأعلى: ينقل التركيز إلى العقدة السابقة في الشجرة.
- السهم لأسفل: ينقل التركيز إلى العقدة التالية في الشجرة.
- السهم لليسار:
- إذا كانت العقدة موسعة، يتم طيها.
- إذا كانت العقدة مطوية أو ليس لها أبناء، يتم نقل التركيز إلى أصل العقدة.
- السهم لليمين:
- إذا كانت العقدة مطوية، يتم توسيعها.
- إذا كانت العقدة موسعة، يتم نقل التركيز إلى الابن الأول.
- Home: ينقل التركيز إلى العقدة الأولى في الشجرة.
- End: ينقل التركيز إلى آخر عقدة مرئية في الشجرة.
- شريط المسافة أو Enter: يحدد العقدة المركزة (إذا كان التحديد مدعومًا).
- الكتابة (حرف أو رقم): ينقل التركيز إلى العقدة التالية التي تبدأ بالحرف المكتوب. يستمر البحث مع كل ضغطة مفتاح لاحقة.
- علامة الجمع (+): توسع العقدة المركزة حاليًا (تعادل السهم لليمين عندما تكون مطوية).
- علامة الطرح (-): تطوي العقدة المركزة حاليًا (تعادل السهم لليسار عندما تكون موسعة).
- النجمة (*): توسع جميع العقد على المستوى الحالي (غير مدعومة عالميًا ولكنها غالبًا ما تكون مفيدة).
تطبيق JavaScript للتنقل بلوحة المفاتيح:
ستحتاج إلى JavaScript للتعامل مع أحداث لوحة المفاتيح وتحديث التركيز وفقًا لذلك. إليك مثال مبسط:
const tree = document.querySelector('[role="tree"]');
const treeitems = document.querySelectorAll('[role="treeitem"]');
tree.addEventListener('keydown', (event) => {
const focusedElement = document.activeElement;
let nextElement;
switch (event.key) {
case 'ArrowUp':
event.preventDefault(); // منع تمرير الصفحة
// منطق للعثور على عنصر الشجرة السابق (يتطلب اجتياز DOM)
// ...
nextElement = findPreviousTreeitem(focusedElement);
break;
case 'ArrowDown':
event.preventDefault();
// منطق للعثور على عنصر الشجرة التالي
// ...
nextElement = findNextTreeitem(focusedElement);
break;
case 'ArrowLeft':
event.preventDefault();
if (focusedElement.getAttribute('aria-expanded') === 'true') {
// طي العقدة
focusedElement.setAttribute('aria-expanded', 'false');
} else {
// نقل التركيز إلى الأصل
nextElement = findParentTreeitem(focusedElement);
}
break;
case 'ArrowRight':
event.preventDefault();
if (focusedElement.getAttribute('aria-expanded') === 'false') {
// توسيع العقدة
focusedElement.setAttribute('aria-expanded', 'true');
} else {
// نقل التركيز إلى الابن الأول
nextElement = findFirstChildTreeitem(focusedElement);
}
break;
case 'Home':
event.preventDefault();
nextElement = treeitems[0];
break;
case 'End':
event.preventDefault();
nextElement = treeitems[treeitems.length - 1];
break;
case ' ': // Spacebar
case 'Enter':
event.preventDefault();
// منطق لتحديد العقدة المركزة
selectNode(focusedElement);
break;
default:
// معالجة كتابة الأحرف للتنقل إلى العقد التي تبدأ بذلك الحرف
break;
}
if (nextElement) {
focusedElement.setAttribute('tabindex', '-1');
nextElement.setAttribute('tabindex', '0');
nextElement.focus();
}
});
اعتبارات هامة لتطبيق التنقل بلوحة المفاتيح:
- إدارة التركيز: تأكد دائمًا من أن عنصر شجرة واحد فقط لديه
tabindex="0"
في كل مرة. عند نقل التركيز، قم بتحديث سماتtabindex
وفقًا لذلك. - اجتياز DOM: اجتياز DOM بكفاءة للعثور على عناصر الشجرة التالية والسابقة، والعقد الأصل، والعقد الفرعية. فكر في استخدام وظائف مساعدة لتبسيط هذه العملية.
- منع الأحداث: استخدم
event.preventDefault()
لمنع المتصفح من أداء إجراءاته الافتراضية (مثل التمرير) عند التعامل مع مفاتيح الأسهم. - كتابة الأحرف: قم بتطبيق منطق للتعامل مع كتابة الأحرف، مما يسمح للمستخدمين بالانتقال بسرعة إلى العقد التي تبدأ بحرف معين. قم بتخزين وقت آخر ضغطة مفتاح لتحديد متى يجب مسح سلسلة البحث.
التصميم المرئي وإمكانية الوصول
يلعب التصميم المرئي دورًا حاسمًا في قابلية استخدام العروض الشجرية وإمكانية الوصول إليها. فيما يلي بعض الإرشادات:
- تسلسل هرمي مرئي واضح: استخدم المسافات البادئة والإشارات المرئية (على سبيل المثال، أيقونات مختلفة للمجلدات والملفات) للإشارة بوضوح إلى التسلسل الهرمي للشجرة.
- تباين ألوان كافٍ: تأكد من وجود تباين ألوان كافٍ بين النص والخلفية، وبين العناصر المختلفة للعرض الشجري. استخدم أدوات مثل WebAIM Contrast Checker للتحقق من نسب التباين.
- مؤشر التركيز: وفر مؤشر تركيز واضحًا ومرئيًا لعنصر الشجرة المركز حاليًا. هذا ضروري لمستخدمي لوحة المفاتيح. لا تعتمد فقط على اللون؛ فكر في استخدام حد أو إطار أو تغيير في الخلفية.
- مؤشرات التوسيع/الطي: استخدم أيقونات واضحة ومفهومة لمؤشرات التوسيع/الطي (على سبيل المثال، علامات الجمع/الطرح، الأسهم). تأكد من أن هذه الأيقونات تتمتع بتباين كافٍ وحجم كبير بما يكفي لتكون قابلة للنقر بسهولة.
- تجنب استخدام اللون وحده لنقل المعلومات: لا تعتمد فقط على اللون للإشارة إلى حالة عنصر الشجرة (على سبيل المثال، محدد، موسع، خطأ). وفر إشارات مرئية بديلة، مثل التسميات النصية أو الأيقونات.
اعتبارات قارئ الشاشة
يعتمد مستخدمو قارئات الشاشة على سمات ARIA والتنقل بلوحة المفاتيح لفهم العروض الشجرية والتفاعل معها. فيما يلي بعض الاعتبارات الرئيسية لإمكانية وصول قارئ الشاشة:
- تسميات وصفية: استخدم
aria-label
أوaria-labelledby
لتوفير تسميات وصفية للشجرة وعناصر الشجرة الفردية. يجب أن تكون هذه التسميات موجزة وغنية بالمعلومات. - إعلانات الحالة: تأكد من أن تغييرات الحالة (على سبيل المثال، توسيع/طي عقدة، تحديد عقدة) يتم الإعلان عنها بشكل صحيح من قبل قارئ الشاشة. يتم تحقيق ذلك عن طريق التحديث الصحيح لسمات
aria-expanded
وaria-selected
. - إعلانات التسلسل الهرمي: يجب أن تعلن قارئات الشاشة عن مستوى كل عقدة في التسلسل الهرمي (على سبيل المثال، "المستوى 2، المجلد 1"). يتم التعامل مع هذا تلقائيًا بواسطة معظم قارئات الشاشة عند تنفيذ أدوار ARIA بشكل صحيح.
- اتساق التنقل بلوحة المفاتيح: تأكد من أن التنقل بلوحة المفاتيح متسق ويمكن التنبؤ به عبر المتصفحات وقارئات الشاشة المختلفة. اختبر العرض الشجري الخاص بك مع عدة قارئات شاشة (مثل NVDA، JAWS، VoiceOver) لتحديد وحل أي تناقضات.
- التحسين التدريجي: إذا تم تعطيل JavaScript، يجب أن يظل العرض الشجري ميسّرًا، وإن كان في حالة متدهورة. فكر في استخدام HTML الدلالي (على سبيل المثال، القوائم المتداخلة) لتوفير مستوى أساسي من إمكانية الوصول حتى بدون JavaScript.
التوافق عبر المتصفحات
يجب أن تكون إمكانية الوصول متسقة عبر المتصفحات وأنظمة التشغيل المختلفة. اختبر العرض الشجري الخاص بك جيدًا على ما يلي:
- متصفحات سطح المكتب: Chrome, Firefox, Safari, Edge
- متصفحات الجوال: Chrome (Android و iOS), Safari (iOS)
- أنظمة التشغيل: Windows, macOS, Linux, Android, iOS
- قارئات الشاشة: NVDA (Windows), JAWS (Windows), VoiceOver (macOS و iOS)
استخدم أدوات المطور في المتصفح لفحص سمات ARIA وسلوك لوحة المفاتيح. انتبه إلى أي تناقضات أو مشكلات في العرض.
الاختبار والتحقق
الاختبار المنتظم ضروري لضمان إمكانية الوصول إلى العرض الشجري الخاص بك. فيما يلي بعض طرق الاختبار:
- الاختبار اليدوي: استخدم قارئ شاشة ولوحة مفاتيح للتنقل في العرض الشجري والتحقق من أن جميع الميزات ميسّرة.
- الاختبار الآلي: استخدم أدوات اختبار إمكانية الوصول (مثل axe DevTools، WAVE) لتحديد مشكلات إمكانية الوصول المحتملة.
- اختبار المستخدم: أشرك المستخدمين من ذوي الإعاقة في عملية الاختبار للحصول على ملاحظات واقعية حول إمكانية الوصول إلى العرض الشجري الخاص بك.
- الامتثال لـ WCAG: استهدف تلبية إرشادات الوصول إلى محتوى الويب (WCAG) 2.1 المستوى AA. يوفر WCAG مجموعة من الإرشادات المعترف بها دوليًا لجعل محتوى الويب أكثر يسرًا.
أفضل الممارسات للعروض الشجرية الميسّرة
فيما يلي بعض أفضل الممارسات التي يجب اتباعها عند تصميم وتنفيذ عروض شجرية ميسّرة:
- ابدأ بـ HTML الدلالي: استخدم عناصر HTML الدلالية (مثل
<ul>
،<li>
) لإنشاء البنية الأساسية للعرض الشجري. - طبق أدوار وسمات ARIA: استخدم أدوار وسمات ARIA لإضافة معنى دلالي وتوفير معلومات للتقنيات المساعدة.
- نفذ تنقلاً قويًا بلوحة المفاتيح: تأكد من أن العرض الشجري قابل للتنقل بالكامل باستخدام لوحة المفاتيح فقط.
- وفر إشارات مرئية واضحة: استخدم التصميم المرئي للإشارة بوضوح إلى التسلسل الهرمي والحالة والتركيز في العرض الشجري.
- اختبر باستخدام قارئات الشاشة: اختبر العرض الشجري مع عدة قارئات شاشة للتحقق من أنه ميسّر لمستخدمي قارئات الشاشة.
- تحقق من الامتثال لـ WCAG: تحقق من العرض الشجري مقابل إرشادات WCAG للتأكد من أنه يفي بمعايير إمكانية الوصول.
- وثق الكود الخاص بك: وثق الكود الخاص بك بوضوح، موضحًا الغرض من كل سمة ARIA ومعالج حدث لوحة المفاتيح.
- استخدم مكتبة أو إطار عمل (بحذر): فكر في استخدام مكون عرض شجري جاهز من مكتبة واجهة مستخدم أو إطار عمل مرموق. ومع ذلك، راجع بعناية ميزات إمكانية الوصول للمكون وتأكد من أنه يفي بمتطلباتك. اختبر دائمًا بدقة!
اعتبارات متقدمة
- التحميل الكسول (Lazy Loading): للأشجار الكبيرة جدًا، قم بتنفيذ التحميل الكسول لتحميل العقد فقط عند الحاجة إليها. يمكن أن يؤدي ذلك إلى تحسين الأداء وتقليل وقت التحميل الأولي. تأكد من تنفيذ التحميل الكسول بطريقة ميسّرة، مع توفير ملاحظات مناسبة للمستخدم أثناء تحميل العقد. استخدم مناطق ARIA الحية للإعلان عن حالة التحميل.
- السحب والإفلات (Drag and Drop): إذا كان العرض الشجري يدعم وظيفة السحب والإفلات، فتأكد من أنها ميسّرة أيضًا لمستخدمي لوحة المفاتيح وقارئات الشاشة. وفر أوامر لوحة مفاتيح بديلة لسحب وإفلات العقد.
- قوائم السياق (Context Menus): إذا كان العرض الشجري يتضمن قوائم سياق، فتأكد من أنها ميسّرة لمستخدمي لوحة المفاتيح وقارئات الشاشة. استخدم سمات ARIA لتحديد قائمة السياق وخياراتها.
- العولمة والترجمة (Globalization and Localization): صمم العرض الشجري الخاص بك ليكون قابلاً للترجمة بسهولة لمختلف اللغات والثقافات. ضع في اعتبارك تأثير اتجاهات النص المختلفة (على سبيل المثال، من اليمين إلى اليسار) على التخطيط المرئي والتنقل بلوحة المفاتيح.
الخاتمة
يتطلب إنشاء عروض شجرية ميسّرة تخطيطًا وتنفيذًا دقيقين. باتباع الإرشادات الموضحة في هذا المقال، يمكنك التأكد من أن عروضك الشجرية قابلة للاستخدام وميسّرة لجميع المستخدمين، بمن فيهم ذوو الإعاقة. تذكر أن إمكانية الوصول ليست مجرد متطلب تقني؛ إنها مبدأ أساسي للتصميم الشامل.
من خلال إعطاء الأولوية لإمكانية الوصول، يمكنك إنشاء تجربة مستخدم أفضل للجميع، بغض النظر عن قدراتهم. يعد اختبار الكود الخاص بك والتحقق منه بانتظام أمرًا مهمًا. ابق على اطلاع بأحدث معايير إمكانية الوصول وأفضل الممارسات لإنشاء واجهات مستخدم شاملة حقًا.