EduFlow

الوحدة 1 · لماذا إمكانية الوصول، ولمن؟

كيف تقرأ التقنيات المساعدة صفحتك

17 دقراءة 4 دبيئة تجريب الكود

الدرس في لمحة

اشرح كيف تشغّل قارئات الشاشة وبرامج التكبير وأجهزة التبديل والتحكّم الصوتي صفحة الويب، واقرأ شجرة إمكانية الوصول التي يبنيها المتصفّح لها.

  1. 1شجرة إمكانية الوصول
  2. 2أربع طرق يشغّل بها الناس Ticketly
  3. 3أن تُظهره للشجرة لا للعين

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

افتح Ticketly وشاشتك مطفأة. قد يبدو هذا استعراضًا، لكنه ما يفعله سمير كل يوم عمل، وهو أسرع طريقة لتفهم ما يرسله كودك فعلًا إلى من يستخدمونه. قبل أن تُصلح أي شيء، تحتاج إلى صورة واضحة عن كيف تستخرج التقنيات المساعدة (assistive technology، وتُختصر AT) المعلومات من صفحة الويب.

شجرة إمكانية الوصول

لا تنظر التقنيات المساعدة إلى البكسلات. يأخذ المتصفّح الـ DOM، ويدمجه مع CSS، ويبني شجرة ثانية أبسط: شجرة إمكانية الوصول (accessibility tree). لكل عقدة فيها بضع خصائص:

  • دور (role): زر، رابط، عنوان (المستوى 2)، حقل نصي، مربع اختيار، قائمة، عام (generic)؛
  • اسم (name): النص الذي يعرّف العنصر، مثل “Book now”؛
  • حالات وقيم: محدَّد، موسَّع، معطَّل، النص الحالي داخل حقل الإدخال.

يسلّم المتصفّح هذه الشجرة إلى واجهة إمكانية الوصول البرمجية في نظام التشغيل، ومن هناك يقرؤها قارئ الشاشة أو برنامج التكبير أو برنامج التحكّم الصوتي.

يغذّي الـ DOM وCSS المتصفّحَ الذي يبني شجرة إمكانية الوصول؛ وتُكشَف الشجرة عبر واجهة إمكانية الوصول في نظام التشغيل لقارئات الشاشة وبرامج التكبير وبرامج التبديل والتحكّم الصوتي. DOM + CSS كودك شجرة إمكانية الوصول دور، اسم، حالة واجهة النظام UIA, AX, AT-SPI قارئ الشاشة برنامج التكبير الصوت، التبديل
من الكود الذي تكتبه إلى أذن المستخدم

هذا جزء من بطاقة الفعالية في Ticketly، وما تحتويه الشجرة له:

ticketly/index.html
<h3>Harbour Lights: Friday</h3>
<div class="btn" onclick="book('fri')">Book now</div>
<button type="button" onclick="book('sat')">Book now</button>
Text
heading "Harbour Lights: Friday" (level 3)
generic
  text "Book now"
button "Book now"

يعرض الـ div النص نفسه، لكن دوره عامّ (generic). يقرأ قارئ الشاشة “Book now” كجملة عادية، بلا أي إشارة إلى أنه يفعل شيئًا، ولا يمكن الوصول إليه بمفتاح Tab. يمكنك فحص هذا بنفسك: في أدوات المطوّر في Chrome أو Edge، حدّد عنصرًا وافتح لوحة Accessibility؛ وفي Firefox تبويب مخصّص اسمه Accessibility Inspector.

أربع طرق يشغّل بها الناس Ticketly

قارئات الشاشة (NVDA وJAWS على Windows، وVoiceOver على أجهزة Apple، وTalkBack على Android) تحوّل الشجرة إلى كلام منطوق أو إلى طريقة برايل. نادرًا ما يستمع المستخدمون إلى الصفحة من أعلاها إلى أسفلها. في استطلاع WebAIM لعام 2026، قال 67.8% من مستخدمي قارئ الشاشة إن أول ما يفعلونه في صفحة طويلة هو القفز بين العناوين. ويستدعون أيضًا قوائم بالروابط والـ landmarks وحقول النماذج. البنية التي تكتبها هي فهرس المحتويات بالنسبة لهم.

برامج تكبير الشاشة (Windows Magnifier وZoom في macOS وZoomText) تكبّر منطقة صغيرة تتبع التركيز أو المؤشّر. مها، مصمّمة في فريقي، تعمل بتكبير 400%: ترى نحو جزء من ستة عشر جزءًا من الشاشة في المرة الواحدة. أي شيء يحدث بعيدًا عن تركيزها، مثل إشعار منبثق في الزاوية المقابلة، لم يحدث أصلًا بالنسبة لها.

أجهزة التبديل (switch access): يضغط مستخدموها مفتاحًا ماديًا واحدًا أو اثنين. ينتقل البرنامج بين العناصر القابلة للتركيز واحدًا تلو الآخر، وضغطة المفتاح تفعّل العنصر الحالي. إن لم يكن العنصر قابلًا للتركيز، فلا سبيل إلى الوصول إليه إطلاقًا. يعتمد مستخدمو أجهزة التبديل على قابلية التشغيل نفسها بلوحة المفاتيح التي ستبنيها في القسم 3.

التحكّم الصوتي (Voice Control في macOS وiOS، وDragon على Windows) يتيح للناس أن يقولوا “click Book now” أو “show numbers”. يطابق البرنامج الكلمات المنطوقة مع الأسماء المتاحة (accessible names). حين يظهر على الزر “Book seats” لكن عليه aria-label="cta-primary"، لا تطابق الكلمات التي تقولها دينا الاسم، فلا يحدث شيء. تسمّي WCAG هذا المعيار Label in Name: يجب أن يحتوي الاسم المتاح النص المرئي.

أن تُظهره للشجرة لا للعين

نمطان يغطّيان معظم الحالات في Ticketly.

حين تحمل إشارة بصرية معنى ليس له نص، أضف نصًا لا تراه إلا الشجرة. يُعلِّم Ticketly الموعد الذي نفدت تذاكره بخطّ يشطب السعر ولون رمادي. فيُعلن قارئ الشاشة “SAR 180” ويحاول سمير بكل سرور أن يشتريه. أضف ملاحظة مخفية بصريًا:

ticketly/styles.css
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
HTML
<p class="price sold">SAR 180 <span class="visually-hidden">(sold out)</span></p>

وحين يكون العنصر زخرفيًا، أخفِه عن الشجرة. يضع Ticketly أيقونة تقويم صغيرة قبل كل تاريخ. قد تُعلَن عناصر SVG المضمّنة على أنها “image” أو “graphic”، وهذا ضجيج. وتزيلها aria-hidden="true":

HTML
<p class="date"><svg class="icon" aria-hidden="true" viewBox="0 0 16 16">…</svg> 12 June, 8 pm</p>

الشجرة هي العقد بين كودك وبين كل تقنية مساعدة. في الدرس التالي سترى المعيار الذي يحدّد ما يجب أن يتضمّنه هذا العقد: WCAG 2.2.

أهم النقاط

  • التقنيات المساعدة لا تقرأ البكسلات؛ بل تقرأ شجرة إمكانية الوصول، حيث لكل عقدة دور (role) واسم وحالات أو قيمة.
  • يتنقّل مستخدمو قارئ الشاشة بين العناوين والـ landmarks والروابط وحقول النماذج، فالبنية هي فهرس المحتويات بالنسبة لهم.
  • يعتمد مستخدمو برامج التكبير وأجهزة التبديل والتحكّم الصوتي على تركيز مرئي، وتشغيل كامل بلوحة المفاتيح، وتسميات مرئية تطابق الأسماء المتاحة.
  • تزيل display none وخاصية hidden وaria-hidden المحتوى من الشجرة؛ أما كلاس visually-hidden فيخفيه عن العين ويُبقيه لقارئات الشاشة.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

يصل مستخدم قارئ شاشة إلى هذا العنصر. ماذا تعطي شجرة إمكانية الوصول لقارئ الشاشة ليُعلنه؟

HTML
<div class="btn" onclick="book()">Book now</div>
السؤال 2 من 4

تستخدم مها تكبير الشاشة بنسبة 400%، فلا ترى إلا نحو جزء من ستة عشر جزءًا من الصفحة في كل مرة. يعرض Ticketly رسالة «أُضيف إلى السلة» في إشعار منبثق (toast) في الزاوية العليا اليمنى بينما تنقر هي زرًا في الأسفل يسارًا. ما العائق الرئيسي؟

السؤال 3 من 4

تتحكّم دينا في حاسوبها بالصوت. يعرض الزر النص “Book seats” لكن عليه aria-label="cta-primary". ماذا يحدث حين تقول “click Book seats”؟

السؤال 4 من 4

أيّ CSS يُخفي ملاحظة «نفدت التذاكر» عن المستخدمين المبصرين لكنه يُبقيها في شجرة إمكانية الوصول؟

تدريب

بيئة تجريب الكود

أخبر الشجرة بما تراه العين

سعر يوم الجمعة في Ticketly (#fri-price) مشطوب وباهت اللون لأن تذاكر ذلك الموعد نفدت، لكن قارئ الشاشة لا يسمع إلا “SAR 180”. وفي الوقت نفسه قد تُعلَن كل أيقونة SVG زخرفية على أنها رسم بلا تسمية.

  1. أضف الكلمتين sold out إلى #fri-price لتصلا إلى شجرة إمكانية الوصول. يمكنك إظهارهما، أو إخفاؤهما بصريًا باستخدام كلاس .visually-hidden (لا display: none).
  2. أخفِ أيقونات <svg> الزخرفية الأربع كلها عن التقنيات المساعدة.
  3. اترك موعد السبت (#sat-price) متاحًا.
<h2>Harbour Lights dates</h2>
<article class="event">
  <h3>Friday</h3>
  <p class="date"><svg class="icon" viewBox="0 0 16 16"><rect x="1" y="3" width="14" height="12" rx="2"/></svg> 12 June, 8 pm</p>
  <p class="price sold" id="fri-price"><svg class="icon" viewBox="0 0 16 16"><circle cx="8" cy="8" r="7"/></svg> SAR 180</p>
</article>
<article class="event">
  <h3>Saturday</h3>
  <p class="date"><svg class="icon" viewBox="0 0 16 16"><rect x="1" y="3" width="14" height="12" rx="2"/></svg> 13 June, 8 pm</p>
  <p class="price" id="sat-price"><svg class="icon" viewBox="0 0 16 16"><circle cx="8" cy="8" r="7"/></svg> SAR 180</p>
</article>جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

المعاينة

الـ console

(لا مخرجات)

الفحوص

  • سعر الجمعة يحتوي الكلمتين “sold out”
  • نص “sold out” ليس مخفيًا عن التقنيات المساعدة
  • الأيقونات الزخرفية الأربع كلها مخفية باستخدام aria-hidden=“true”
  • السبت ما زال يعرض SAR 180 وغير مُعلَّم بأن تذاكره نفدت