EduFlow

الوحدة 2 · HTML الدلالي أولًا

الـ Landmarks والعناوين

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

الدرس في لمحة

حوّل صفحة من عناصر div مجهولة الهوية إلى landmarks ومخطّط عناوين منطقي يستطيع مستخدمو قارئ الشاشة مسحه والقفز خلاله في ثوانٍ.

  1. 1الـ Landmarks: مناطق الصفحة
  2. 2تسمية المناطق، وكم منها تستخدم
  3. 3العناوين: المخطّط الذي يتنقّل فيه الناس

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

وصف لي سمير ذات مرة صفحة سيئة البناء بأنها «دليل هاتف مُزّقت منه الأسماء». كل شيء موجود، لكن لا شيء يخبره أين ينتهي جزء ويبدأ التالي. والصفحة الرئيسية في Ticketly هي ذلك بالضبط: كل كتلة فيها div، وأكبر نص فيها div بخط كبير. يرى المستخدم المبصر ترويسة وقائمة وعنوان المهرجان وقائمة الفنانين وتذييلًا. أما قارئ الشاشة فيرى سيلًا واحدًا طويلًا من النص.

الـ Landmarks: مناطق الصفحة

في HTML عناصر تصف دور منطقة كاملة من الصفحة. يربط المتصفّح كلًّا منها بـ landmark (معلم) في ARIA، وتتيح قارئات الشاشة للمستخدمين عرض قائمة بالـ landmarks أو القفز بينها (مفتاح D في NVDA، والـ rotor في VoiceOver).

العنصر دور الـ landmark ملاحظات
<header> banner فقط حين يكون جزءًا مباشرًا من الصفحة، لا داخل article أو aside أو main أو nav أو section
<nav> navigation سمِّه حين يوجد أكثر من واحد
<main> main واحد مرئي بالضبط في كل صفحة
<aside> complementary محتوى ذو صلة مثل الشريط الجانبي
<footer> contentinfo قاعدة النطاق نفسها التي تنطبق على header
<form>، <section> form، region فقط حين يكون لها اسم متاح
<search> search يلفّ نموذج البحث في الموقع

هذا هيكل Ticketly قبل الإصلاح وبعده:

before.html
<div class="top">
  <div class="logo">Ticketly</div>
  <div class="links"><a href="/events">Events</a> <a href="/faq">FAQ</a></div>
</div>
<div class="content">
  <div class="title">Harbour Lights 2026</div>
  …
</div>
<div class="bottom">© 2026 Ticketly · <a href="/terms">Terms</a></div>
after.html
<header>
  <a href="/" class="logo">Ticketly</a>
  <nav aria-label="Site">
    <a href="/events">Events</a> <a href="/faq">FAQ</a>
  </nav>
</header>
<main>
  <h1>Harbour Lights 2026</h1>
  …
</main>
<footer>© 2026 Ticketly · <a href="/terms">Terms</a></footer>

لا يتغيّر التصميم المرئي إطلاقًا؛ فهذه العناصر ليس لها تنسيق خاص سوى display: block. الذي يتغيّر هو شجرة إمكانية الوصول: يستطيع سمير الآن أن يضغط D ليصل إلى “main landmark” ويبدأ قراءة محتوى المهرجان، متخطّيًا الترويسة بالكامل.

الصفحة مقسّمة إلى banner يحتوي تنقّل الموقع، ومنطقة main تضمّ العنوان h1 ‏Harbour Lights 2026 مع قسمين h2 هما Line-up وTickets، ويحتوي Tickets عنصرين h3، ثم تذييل contentinfo. header (banner) nav "Site" main footer (contentinfo) h1 Harbour Lights 2026 h2 Line-up h2 Tickets h3 Friday pass h3 Weekend pass
الـ landmarks ومخطّط العناوين في Ticketly

تسمية المناطق، وكم منها تستخدم

عنصر <section> وحده مجرد حاوية عامة. أعطِه اسمًا فيصبح landmark من نوع region يظهر في قائمة الـ landmarks. وأنظف طريقة هي أن تشير إلى عنوانه هو، فلا يمكن أن يفترق الاسم عن النص المرئي أبدًا:

HTML
<section aria-labelledby="tickets-heading">
  <h2 id="tickets-heading">Tickets</h2>
  …
</section>

لكن لا تحوّل كل section إلى region. الـ landmarks تعمل مثل قائمة فصول الكتاب: خمسة إلى ثمانية مداخل مفيدة، أما ثلاثون فلا. القاعدة العملية أن يعيش كل جزء من المحتوى داخل landmark ما (تنبّه أدوات الفحص الآلي إلى النص الذي لا يقع داخل أي landmark)، وألا تحصل على landmark خاص بها إلا المناطق الكبيرة المميّزة التي قد يرغب المستخدم في القفز إليها.

العناوين: المخطّط الذي يتنقّل فيه الناس

الـ landmarks هي غرف الصفحة؛ والعناوين هي اللافتات على أبوابها. يجد معظم مستخدمي قارئ الشاشة المحتوى بالقفز من عنوان إلى عنوان (H في NVDA وJAWS، أو من 1 إلى 6 لمستوى محدّد)، أو بفتح قائمة بكل العناوين والكتابة لتصفيتها. وهذه القائمة لا تفيد إلا إذا شكّلت العناوين مخطّطًا حقيقيًا.

ثلاث قواعد تغطّي الغالبية العظمى من الحالات:

  1. عنوان h1 واحد يقول ما هي الصفحة. في Ticketly هو “Harbour Lights 2026”، لا الشعار.
  2. المستويات تصف التداخل. الأقسام الفرعية لقسم ما تكون أعمق منه بمستوى واحد. الصعود مقبول (من h3 إلى h2)؛ أما تخطّي المستويات نزولًا (من h2 إلى h4) فيوحي بمستوى مفقود.
  3. تحت كل عنوان محتوى، وكل جزء من المحتوى يستحق أن يُعثر عليه له عنوان.

تستخدم منطقة التذاكر في Ticketly العنصرين h4 وh5 لأن مصمّمًا أراد نصًا أصغر. أصلح البنية أولًا، ثم نسّق:

HTML
<h2>Tickets</h2>
<h3 class="pass-title">Friday pass</h3>
<h3 class="pass-title">Weekend pass</h3>
CSS
.pass-title {
  font-size: 1rem;
  font-weight: 600;
}

ولا تنسَ عنصر <title> للصفحة أيضًا. إنه أول ما يُعلنه قارئ الشاشة حين تُحمَّل الصفحة، وهو ما يظهر في التبويبات وسجلّ التصفّح (2.4.2 Page Titled). ضع الجزء المحدّد أولًا: <title>Harbour Lights 2026 tickets · Ticketly</title>.

بعد أن صار الهيكل في مكانه، يتناول الدرس التالي الأجزاء التي ينقرها المستخدمون فعلًا: الأزرار والروابط، وعناصر الـ div القابلة للنقر التي تتظاهر بأنها هذا وذاك.

أهم النقاط

  • العناصر header وnav وmain وaside وfooter تُنشئ landmarks يستطيع مستخدمو قارئ الشاشة عرض قائمة بها والقفز بينها.
  • للصفحة landmark واحد من نوع main؛ وحين توجد عدة مناطق nav أو aside، أعطِ كلًّا منها اسمًا متاحًا مميّزًا.
  • العناوين تشكّل مخطّط الصفحة؛ اختر المستوى بحسب البنية، لا بحسب حجم الخط، واضبط الحجم بـ CSS.
  • ابدأ بعنوان h1 واحد يسمّي الصفحة، ولا تتخطَّ أي مستوى وأنت تنزل في التسلسل.

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

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

في Ticketly قائمتا تنقّل: قائمة الموقع في الأعلى وقائمة «أيام المهرجان» في الشريط الجانبي. يعرض قارئ الشاشة الـ landmarks هكذا: “navigation, navigation”. ما أفضل إصلاح؟

السؤال 2 من 4

أرادت مصمّمة أن يبدو عنوان «تذكرة الجمعة» صغيرًا، فاستخدم المطوّر h5 مباشرة بعد h2. ما الخطأ، وما الإصلاح؟

السؤال 3 من 4

أيّ عنصر لا يُنشئ landmark إلا حين يكون له اسم متاح؟

السؤال 4 من 4

في صفحة طويلة من Ticketly، ما أول ما يفعله مستخدم قارئ الشاشة في الغالب ليجد قسم «سياسة الاسترداد»؟

تدريب

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

امنح Ticketly هيكلًا

الصفحة الرئيسية في Ticketly مبنية من عناصر div مجهولة الهوية، وعناوينها اختيرت بحسب حجم خطّها. أعد هيكلة الكود دون تغيير النص:

  • لُفّ الشعار والقائمة بعنصر <header>، واجعل القائمة عنصر <nav> (أعطِها اسمًا مثل aria-label="Site").
  • ضع محتوى المهرجان في عنصر <main> واحد.
  • اجعل سطر حقوق النشر عنصر <footer> خارج main.
  • حوّل “Harbour Lights 2026” إلى عنصر <h1> الوحيد، وأصلح بقية العناوين حتى لا يتخطّى المخطّط أي مستوى: Line-up وTickets قسمان؛ والتذكرتان تنتميان إلى Tickets.
<div class="top">
  <div class="logo">Ticketly</div>
  <div class="links">
    <a href="#events">Events</a>
    <a href="#faq">FAQ</a>
    <a href="#account">Account</a>
  </div>
</div>
<div class="content">
  <div class="title">Harbour Lights 2026</div>
  <p>Two nights of music on the old harbour wall, 12 and 13 June.</p>
  <h4>Line-up</h4>
  <ul>
    <li>Nour Quartet</li>
    <li>The Saltmarsh Band</li>
  </ul>
  <h4>Tickets</h4>
  <h5>Friday pass</h5>
  <p>SAR 180, standing.</p>
  <h5>Weekend pass</h5>
  <p>SAR 320, both nights.</p>
</div>
<div class="bottom">© 2026 Ticketly · <a href="#terms">Terms</a></div>جارٍ تحميل المحرّر…

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

المعاينة

الـ console

(لا مخرجات)

الفحوص

  • يوجد landmark واحد بالضبط من نوع main يضمّ محتوى المهرجان
  • عنصر header في المستوى الأعلى يحتوي nav فيه روابط القائمة
  • عنصر footer في المستوى الأعلى يحتوي رابط Terms
  • “Harbour Lights 2026” هو عنصر h1 الوحيد في الصفحة
  • العناوين تبدأ من h1 ولا تتخطّى أي مستوى؛ والتذكرتان أعمق من Tickets بمستوى واحد