{"id":"l-a11y-2-4","courseId":"web-accessibility","lang":"ar","kind":"lesson","summary":"حدّد النص البديل الذي تحتاجه كل صورة بحسب غرضها في سياقها، واكتب جداول البيانات بحيث تُعلن قارئات الشاشة العناوين الصحيحة لكل خلية.","html":"<p>كل صورة في Ticketly تقطع وعدًا: «هذه تخبرك بشيء» أو «هذه زخرفة». والنص البديل (alt text) هو طريقتك للوفاء بهذا الوعد لمن لا يستطيعون رؤية الصورة. الجزء الصعب ليس الصياغة، فكتابة <code dir=\"ltr\">alt=&quot;…&quot;</code> سهلة. بل هو قرار ما ستقوله، إن كان هناك ما يُقال أصلًا.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">النص البديل يصف الغرض لا البكسلات</h2>\n<p>ابدأ من سؤال واحد: <strong>ماذا ستخسر لو حُذفت هذه الصورة؟</strong> هذا ما يجب أن يعيده النص البديل.</p>\n<div class=\"table-wrap\" role=\"region\" aria-label=\"جدول قابل للتمرير\" tabindex=\"0\"><table><thead>\n<tr>\n<th>الصورة في Ticketly</th>\n<th>الغرض</th>\n<th>الـ alt</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>صورة فرقة Nour Quartet على بطاقة الفنان</td>\n<td>معلوماتية</td>\n<td><code dir=\"ltr\">alt=&quot;Nour Quartet performing on a lit harbour stage&quot;</code></td>\n</tr>\n<tr>\n<td>الشعار داخل رابط إلى الصفحة الرئيسية</td>\n<td>وظيفية</td>\n<td><code dir=\"ltr\">alt=&quot;Ticketly home&quot;</code></td>\n</tr>\n<tr>\n<td>أيقونة العدسة المكبّرة كمحتوى وحيد لزر البحث</td>\n<td>وظيفية</td>\n<td><code dir=\"ltr\">alt=&quot;Search&quot;</code></td>\n</tr>\n<tr>\n<td>خطّ متموّج يفصل بين الأقسام</td>\n<td>زخرفية</td>\n<td><code dir=\"ltr\">alt=&quot;&quot;</code></td>\n</tr>\n<tr>\n<td>صورة الجمهور خلف عنوان يقول كل شيء أصلًا</td>\n<td>زخرفية في سياقها</td>\n<td><code dir=\"ltr\">alt=&quot;&quot;</code></td>\n</tr>\n<tr>\n<td>شارة “Sold out” مرسومة كصورة</td>\n<td>نص داخل صورة</td>\n<td><code dir=\"ltr\">alt=&quot;Sold out&quot;</code></td>\n</tr>\n<tr>\n<td>خريطة المقاعد</td>\n<td>معقّدة</td>\n<td>نص alt قصير مع بديل كامل قريب منها</td>\n</tr>\n</tbody>\n</table></div><p>السياق يغيّر الإجابة. صورة الجمهور نفسها زخرفية خلف عنوان، لكنها معلوماتية في صفحة اسمها «كيف يبدو المكان»، وهناك تحتاج إلى وصف.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">ticketly/lineup.html</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">article</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> class</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"artist\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">img</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> src</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"nour-quartet.jpg\"</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> alt</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Nour Quartet performing on a lit harbour stage\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">h3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Nour Quartet&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">h3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Jazz and Arabic maqam from Alexandria.&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">p</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">article</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n<p>بضع عادات تجعل النص البديل أفضل:</p>\n<ul>\n<li><strong>لا تبدأ بـ “image of” أو “photo of”.</strong> قارئات الشاشة تُعلن “image” (أو “graphic”) أصلًا. لا تذكر “photo” إلا حين تكون الوسيلة مهمة، مثل “Hand-drawn poster of…”.</li>\n<li><strong>لا تكرّر النص المجاور.</strong> إن كان التعليق يقول “Nour Quartet”، فلا ينبغي أن يكرّره الـ alt حرفيًا؛ صِف ما تضيفه الصورة.</li>\n<li><strong>اجعله قصيرًا.</strong> جملة واحدة تكفي معظم الصور. والأوصاف الطويلة مكانها نص الصفحة.</li>\n</ul>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>alt فارغ على المحتوى الوحيد لرابط أو زر</span></p>\n<p>العنصر <code dir=\"ltr\">&lt;button&gt;&lt;img src=&quot;search.svg&quot; alt=&quot;&quot;&gt;&lt;/button&gt;</code> ليس له اسم متاح، فيُعلَن على أنه “button” ولا شيء غير ذلك. هذا هو إخفاق «الزر الفارغ» الذي يظهر في نحو ثلث الصفحات الرئيسية. حين تكون الصورة هي كل محتوى عنصر التحكّم، فإن الـ alt فيها يسمّي الفعل.</p>\n</aside>\n<h2 id=\"sec-2\" tabindex=\"-1\">الصور الزخرفية والأيقونات</h2>\n<p>للصور الزخرفية، استخدم alt <strong>فارغًا</strong>: <code dir=\"ltr\">alt=&quot;&quot;</code>، بلا أي شيء بين علامتي الاقتباس. أما غياب الخاصية فشيء مختلف: كثير من قارئات الشاشة تُعلن حينها اسم الملف، مثل “hero underscore final underscore v3 dot jpg”. والصور المضافة عبر <code dir=\"ltr\">background-image</code> في CSS غير مرئية للتقنيات المساعدة، وهذا مقبول للزخرفة لكنه خاطئ لأي صورة تحمل معنى.</p>\n<p>أيقونات SVG المضمّنة تتبع المنطق نفسه بخصائص مختلفة. الأيقونات الزخرفية تأخذ <code dir=\"ltr\">aria-hidden=&quot;true&quot;</code>، كما فعلت في درس <a href=\"/ar/lesson/web-accessibility/l-a11y-1-2\">كيف تقرأ التقنيات المساعدة صفحتك</a>. أما الـ SVG الذي يحمل معنى بمفرده فيأخذ <code dir=\"ltr\">role=&quot;img&quot;</code> واسمًا:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">HTML</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">svg</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> role</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"img\"</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> aria-label</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Wheelchair accessible venue\"</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> viewBox</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"0 0 24 24\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>…&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">svg</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n<h2 id=\"sec-3\" tabindex=\"-1\">الصور المعقّدة</h2>\n<p>الرسوم البيانية والخرائط والمخطّطات تحمل معلومات أكثر مما تحتمله جملة. أعطِها alt قصيرًا يذكر الخلاصة، وضع المعلومات كاملة في الصفحة: جدول بيانات تحت الرسم البياني، أو قائمة بالأقسام والمقاعد المتاحة بجوار خريطة المقاعد، أو عنصر <code dir=\"ltr\">&lt;details&gt;</code> يحمل وصفًا أطول. خريطة المقاعد في Ticketly تحصل على قائمة بالكتل (“Block A, front left, 12 seats left”) مفيدة لكل من يقارن بين الخيارات، لا لمستخدمي قارئ الشاشة وحدهم.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>استخدم شجرة القرار</span></p>\n<p>حين لا تكون متأكدًا، تأخذك شجرة قرار الـ alt من W3C عبر خمسة أسئلة في أقل من دقيقة. وتجد معظم الفرق أنها بعد أسبوع من استخدامها لم تعد تحتاج إليها.</p>\n</aside>\n<h2 id=\"sec-4\" tabindex=\"-1\">جداول البيانات</h2>\n<p>بُنيت شبكة الأسعار في Ticketly من عناصر div منسّقة بـ CSS grid. يقرؤها المستخدم المبصر بنظرة واحدة؛ أما قارئ الشاشة فيقرأ “Pass, Early bird, Standard, Weekend, SAR 280, SAR 320” كقائمة مسطّحة بلا أي طريقة لمعرفة أيّ سعر يخصّ أيّ تذكرة. والجدول الحقيقي يُصلح ذلك:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">ticketly/pricing.html</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">table</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">caption</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Harbour Lights ticket prices&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">caption</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">thead</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">      &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"col\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Pass&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">      &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"col\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Early bird&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">      &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"col\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Standard&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">thead</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tbody</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"row\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Friday&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>SAR 150&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>SAR 180&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"row\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Weekend&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>SAR 280&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>SAR 320&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tbody</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">table</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 640 210\" role=\"img\" aria-labelledby=\"l-a11y-2-4-t1\"><defs><marker id=\"arrow-l-a11y-2-4-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-a11y-2-4-t1\">جدول أسعار من ثلاثة صفوف وثلاثة أعمدة. الخلية المميّزة SAR 320 مرتبطة بعنوان صفّها Weekend وعنوان عمودها Standard؛ فيُعلن قارئ الشاشة: Weekend, Standard, SAR 320.</title>\n  <rect class=\"d-box-accent\" x=\"20\" y=\"20\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label-strong\" x=\"85\" y=\"45\" text-anchor=\"middle\">Pass</text>\n  <rect class=\"d-box-accent\" x=\"150\" y=\"20\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label-strong\" x=\"215\" y=\"45\" text-anchor=\"middle\">Early bird</text>\n  <rect class=\"d-box-accent\" x=\"280\" y=\"20\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label-strong\" x=\"345\" y=\"45\" text-anchor=\"middle\">Standard</text>\n  <rect class=\"d-box-accent\" x=\"20\" y=\"60\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label-strong\" x=\"85\" y=\"85\" text-anchor=\"middle\">Friday</text>\n  <rect class=\"d-box\" x=\"150\" y=\"60\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label\" x=\"215\" y=\"85\" text-anchor=\"middle\">SAR 150</text>\n  <rect class=\"d-box\" x=\"280\" y=\"60\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label\" x=\"345\" y=\"85\" text-anchor=\"middle\">SAR 180</text>\n  <rect class=\"d-box-accent\" x=\"20\" y=\"100\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label-strong\" x=\"85\" y=\"125\" text-anchor=\"middle\">Weekend</text>\n  <rect class=\"d-box\" x=\"150\" y=\"100\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label\" x=\"215\" y=\"125\" text-anchor=\"middle\">SAR 280</text>\n  <rect class=\"d-box-primary\" x=\"280\" y=\"100\" width=\"130\" height=\"40\"/>\n  <text class=\"d-label-strong\" x=\"345\" y=\"125\" text-anchor=\"middle\">SAR 320</text>\n  <path class=\"d-arrow\" d=\"M410 120 L460 120\" marker-end=\"url(#arrow-l-a11y-2-4-1)\"/>\n  <text class=\"d-label\" x=\"470\" y=\"115\">\"Weekend,</text>\n  <text class=\"d-label\" x=\"470\" y=\"137\">Standard, SAR 320\"</text>\n  <path class=\"d-dashed\" d=\"M345 60 L345 100\"/>\n  <path class=\"d-dashed\" d=\"M150 120 L280 120\"/>\n  <text class=\"d-label-muted\" x=\"215\" y=\"185\" text-anchor=\"middle\">th scope=\"row\" وth scope=\"col\" توفّران السياق</text>\n</svg><figcaption>كيف يُعلن قارئ الشاشة خلية في جدول</figcaption></figure>\n<p>الـ <code dir=\"ltr\">&lt;caption&gt;</code> يسمّي الجدول حين يدخله المستخدم. و<code dir=\"ltr\">scope=&quot;col&quot;</code> و<code dir=\"ltr\">scope=&quot;row&quot;</code> تخبران المتصفّح بالخلايا التي يغطّيها كل عنوان. عندها تتيح قارئات الشاشة التنقّل داخل الجدول (Ctrl+Alt+arrow keys في NVDA، وVO+arrow keys في VoiceOver) وتُعلن العناوين المناسبة كلما تحرّك المستخدم. أبقِ الجداول بسيطة: إن احتجت إلى عناوين مدمجة بعدة مستويات، فتقسيم الجدول إلى جدولين أوضح للجميع في الغالب.</p>\n<p>استخدم الجداول للبيانات، لا للتخطيط أبدًا. واحذر من حيل التصميم المتجاوب: ضبط <code dir=\"ltr\">display: block</code> أو <code dir=\"ltr\">display: grid</code> على عناصر الجدول قد يجرّدها من دلالاتها كجدول في بعض المتصفّحات، فاختبر بقارئ شاشة إن أعدت تنسيقها.</p>\n<p>بهذا يكتمل الأساس الدلالي لـ Ticketly. ينتقل القسم 3 من «ما هي الصفحة» إلى «كيف يتحرّك الناس فيها»، بدءًا بلوحة المفاتيح.</p>\n","toc":[{"id":"sec-1","text":"النص البديل يصف الغرض لا البكسلات","level":2},{"id":"sec-2","text":"الصور الزخرفية والأيقونات","level":2},{"id":"sec-3","text":"الصور المعقّدة","level":2},{"id":"sec-4","text":"جداول البيانات","level":2}],"takeaways":["النص البديل يصف غرض الصورة في سياقها، لذا قد تحتاج الصورة نفسها إلى نص بديل مختلف في صفحات مختلفة.","الصور الزخرفية تأخذ alt=“” فتتخطّاها قارئات الشاشة؛ أما غياب خاصية alt فكثيرًا ما يجعلها تقرأ اسم الملف.","الصورة التي هي المحتوى الوحيد لرابط أو زر تحتاج إلى نص بديل يسمّي الوجهة أو الفعل.","جداول البيانات تحتاج إلى caption وخلايا th مع scope، فتُعلَن كل خلية مع عنواني صفّها وعمودها."],"further":[{"title":"W3C WAI: An alt Decision Tree","url":"https://www.w3.org/WAI/tutorials/images/decision-tree/"},{"title":"W3C WAI: Tables Tutorial","url":"https://www.w3.org/WAI/tutorials/tables/"},{"title":"WebAIM: Alternative Text","url":"https://webaim.org/techniques/alttext/"}],"quiz":[{"q":"<p>شعار Ticketly في الترويسة صورة داخل <code dir=\"ltr\">&lt;a href=&quot;/&quot;&gt;</code>. ما النص البديل الذي يجب أن يحمله؟</p>","options":[{"text":"<code dir=\"ltr\">alt=&quot;&quot;</code>، لأن الشعارات زخرفية","why":"داخل الرابط تكون الصورة هي المحتوى الوحيد للرابط. والـ alt الفارغ يترك الرابط بلا اسم، فتُعلن قارئات الشاشة “link” فقط."},{"text":"<code dir=\"ltr\">alt=&quot;Ticketly home&quot;</code>","why":"صحيح. الصورة الوظيفية تصف ما يفعله تفعيلها. و&quot;Ticketly&quot; وحدها مقبولة أيضًا؛ لكن إضافة “home” تجعل الوجهة صريحة."},{"text":"<code dir=\"ltr\">alt=&quot;Ticketly logo, purple ticket icon&quot;</code>","why":"الوصف البصري لا يساعد أحدًا على أن يقرّر اتّباع الرابط. صِف الوظيفة، لا الرسم."}],"answer":1},{"q":"<p>ماذا يحدث حين لا يكون لعنصر <code dir=\"ltr\">img</code> خاصية alt إطلاقًا؟</p>","options":[{"text":"تتخطّاه قارئات الشاشة، تمامًا مثل alt=“”","why":"وحدها الـ alt الفارغة صراحةً تعلّم الصورة بأنها زخرفية. ومن دون الخاصية، تحاول قارئات الشاشة أن تقول شيئًا عنها."},{"text":"يولّد المتصفّح نصًا بديلًا تلقائيًا من الصورة","why":"بعض قارئات الشاشة والمتصفّحات تستطيع توليد أوصاف بالذكاء الاصطناعي إن فعّلها المستخدم، لكن لا شيء يملأ الـ alt افتراضيًا، ولا يمكنك الافتراض أن كل المستخدمين لديهم هذه الميزة، ولا أنها ستصف الغرض بشكل صحيح."},{"text":"كثير من قارئات الشاشة تُعلن اسم الملف أو عنوانه، مثل “IMG underscore 4521 dot jpg”","why":"صحيح. هذا ضجيج في أحسن الأحوال ومربك في أسوئها، ولهذا يأتي غياب الـ alt ثانيًا بين أكثر الإخفاقات شيوعًا على الويب."}],"answer":2},{"q":"<p>في جدول الأسعار هذا، ماذا يُعلن قارئ الشاشة حين ينتقل المستخدم إلى خلية “SAR 320”؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"html\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">HTML</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">table</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">caption</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Harbour Lights ticket prices&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">caption</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"col\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Pass&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"col\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Early bird&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"col\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Standard&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  &#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> scope</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"row\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>Weekend&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">th</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>SAR 280&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>SAR 320&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">td</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">>&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">tr</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">&#x3C;/</span><span style=\"color:#116329;--shiki-dark:#7EE787\">table</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">></span></span></code></pre></div>\n","options":[{"text":"“Weekend, Standard, SAR 320”","why":"صحيح. مع th وscope، يُعلن قارئ الشاشة عنوان الصف وعنوان العمود اللذين لم يسمعهما المستخدم بعد، ثم القيمة."},{"text":"“SAR 320” فقط","why":"هذا ما يحدث حين تكون العناوين خلايا td عادية. أما هنا فعناصر th تمنح كل خلية سياقها."},{"text":"“Harbour Lights ticket prices, SAR 320”","why":"الـ caption يسمّي الجدول كله حين يدخله المستخدم؛ ولا يتكرّر مع كل خلية."}],"answer":0},{"q":"<p>رسم بياني خطّي في Ticketly يعرض مبيعات التذاكر في كل يوم. ما البديل النصي الأكثر فائدة؟</p>","options":[{"text":"<code dir=\"ltr\">alt=&quot;Chart&quot;</code>","why":"هذا يقول ما هي الصورة لكن لا يقول ما تعنيه. ويبقى مستخدم قارئ الشاشة لا يعرف شيئًا عن المبيعات."},{"text":"<code dir=\"ltr\">alt=&quot;&quot;</code>، لأن الرسوم البيانية أعقد من أن توصف","why":"الرسم البياني يحمل معلومات، وإخفاؤه يحذف تلك المعلومات عن مستخدمي قارئ الشاشة بالكامل."},{"text":"نص alt قصير بالخلاصة الأساسية، إضافةً إلى البيانات كاملة في جدول أو نص قريب","why":"صحيح. مثلًا “Daily ticket sales, peaking at 1,200 on launch day”، مع الأرقام في جدول لمن يريد التفاصيل."}],"answer":2}],"exercise":{"kind":"choice","multiple":true,"options":["logo-link","seat-map","artist-file","hero-ambient","search-empty","sold-badge"],"correct":["logo-link","hero-ambient","sold-badge"],"title":"راجع النصوص البديلة في Ticketly","prompt":"<p>أضاف زميل نصًا بديلًا لكل صورة في Ticketly وطلب منك مراجعته. اختر <strong>كل قرار صحيح</strong> كما هو مكتوب. فكّر في غرض كل صورة في سياقها، لا في ما تعرضه فقط.</p>\n","hints":["اسأل عن كل صورة: معلوماتية، أم وظيفية، أم زخرفية، أم نص، أم معقّدة؟","الصورة التي هي المحتوى الوحيد لرابط أو زر يجب أن تسمّي الوجهة أو الفعل.","ثلاثة من القرارات الستة صحيحة."],"explanation":"<p>رابط الشعار يسمّي وجهته، وصورة الجمهور الخلفية زخرفية لأن العنوان والفقرة يقولان كل شيء أصلًا، وصورة الشارة التي تحمل كلمتي “Sold out” تكرّر تلك الكلمتين. أما الثلاثة الأخرى فتفشل: “Seat map” تقول ما هي الصورة لكنها لا تذكر شيئًا من المقاعد المتاحة التي تعرضها، فتحتاج إلى ملخّص قصير وقائمة بالكتل قريبة منها؛ و&quot;Image of nour_quartet_final.jpg&quot; اسم ملف ببادئة زائدة؛ وأيقونة البحث ذات alt=“” تترك زرّها بلا أي اسم متاح.</p>\n","checkLabels":{},"optionText":{"logo-link":{"text":"صورة الشعار داخل <code dir=\"ltr\">&lt;a href=&quot;/&quot;&gt;</code>: <code dir=\"ltr\">alt=&quot;Ticketly home&quot;</code>","why":"صحيح. الصورة هي المحتوى الوحيد للرابط، فالـ alt فيها يسمّي وجهة الرابط."},"seat-map":{"text":"خريطة المقاعد التي تُظهر الكتل التي لا تزال فيها مقاعد: <code dir=\"ltr\">alt=&quot;Seat map&quot;</code>","why":"غير كافٍ. يسمّي نوع الصورة دون أي من معلوماتها. قدّم ملخّصًا قصيرًا وقائمة نصية بالكتل والمقاعد المتاحة."},"artist-file":{"text":"صورة الفنان على بطاقة Nour Quartet: <code dir=\"ltr\">alt=&quot;Image of nour_quartet_final.jpg&quot;</code>","why":"خطأ. قارئات الشاشة تقول “image” أصلًا، واسم الملف لا يخبر المستخدمين بشيء. صِف ما تُظهره الصورة مما يهمّ، مثل الفرقة على المسرح."},"hero-ambient":{"text":"صورة جمهور ضبابية خلف العنوان “Harbour Lights 2026”، والفقرة تحته تصف الفعالية أصلًا: <code dir=\"ltr\">alt=&quot;&quot;</code>","why":"صحيح. في هذا السياق الصورة أجواء فقط؛ والنص يحمل المعنى، فالـ alt الفارغ يتيح لقارئات الشاشة تخطّيها."},"search-empty":{"text":"صورة عدسة مكبّرة كمحتوى وحيد لزر البحث: <code dir=\"ltr\">alt=&quot;&quot;</code>","why":"خطأ. صار الزر بلا اسم ويُعلَن على أنه “button” فقط. استخدم alt=“Search”."},"sold-badge":{"text":"صورة لكلمتي “Sold out” على بطاقة الجمعة: <code dir=\"ltr\">alt=&quot;Sold out&quot;</code>","why":"صحيح. في صور النصوص، يكرّر الـ alt النص. والأفضل من ذلك نص حقيقي منسّق بـ CSS."}}},"words":656,"readMinutes":4}