সরাসরি পর্বে যান
পর্ব ১০ · ৫৯-এর মধ্যে · মডিউল ২

Semantic layout — header, nav, main, article, section, footer

Semantic Page Layout — Landmarks, article vs section vs div, aside, search, figure, address & Skip Links

Taught in Bangla, this lesson replaces div soup with semantic layout. It covers header, nav, main and footer, a three-question test for article versus section versus div, headers and footers inside articles, aside, figure, address and the search element. It shows how screen reader users move by landmarks, adds a skip link, and builds full skeletons for an online shop and a news site.

এই পর্বে যা শিখবেন

  • “div-soup” কী, আর id="header" থেকে <header> element-এ আসার ইতিহাস
  • header, nav, main, article, section, aside, footer, search — প্রতিটির কাজ, নিয়ম আর কোন landmark role তৈরি করে
  • article, section আর div-এর মধ্যে সিদ্ধান্ত নেওয়ার সহজ প্রশ্ন; article-এর ভেতরে header ও footer
  • figure, address, skip link — আর screen reader ব্যবহারকারী কীভাবে landmark ধরে পাতায় চলাচল করেন
  • একটি বাংলাদেশি অনলাইন দোকান ও খবরের সাইটের পূর্ণ কঙ্কাল, আর DevTools দিয়ে তা যাচাই

১ · div-এর স্যুপ — সব কিছু div হলে সমস্যা কোথায়

একটি বড় শপিং মলের কথা ভাবুন। ঢোকার মুখে বোর্ডে লেখা থাকে — নিচতলায় মুদি, দোতলায় পোশাক, তিনতলায় খাবারের দোকান। লিফটের পাশে লেখা “জরুরি বহির্গমন”। এখন কল্পনা করুন, মলের সব বোর্ড খুলে ফেলা হলো। দোকানগুলো একই জায়গায় আছে, আলোও জ্বলছে — কিন্তু নতুন কেউ ঢুকে বুঝতেই পারবেন না কোথায় কী। প্রতিটি তলা ঘুরে ঘুরে দেখতে হবে।

ওয়েবপেজেও ঠিক এমন হয়। পাতার ওপরে লোগো, তার নিচে মেনু, মাঝে মূল লেখা, পাশে “আরও পড়ুন”, নিচে কপিরাইট। চোখে দেখা মানুষ এক নজরে ভাগগুলো চেনেন। কিন্তু কোডে যদি সবই <div> হয়, তাহলে ব্রাউজারের কাছে পাতাটি শুধু অনেকগুলো নামহীন বাক্স। একে মজা করে বলা হয় div-soup — অর্থহীন div-এর স্যুপ।

<div> নিজে খারাপ নয়। এর অর্থ শুধু “একটি দল” — এর বেশি কিছু না। সমস্যা হয় তখন, যখন পাতার প্রধান অংশগুলোও div দিয়ে বানানো হয় আর তাদের পরিচয় থাকে শুধু class-এর নামে। class="header" লেখাটা মানুষ পড়তে পারে, কিন্তু ব্রাউজারের কাছে “header” শব্দটা “xyz”-এর মতোই একটি নাম। পর্ব ০৪-এ দেখেছেন, semantic HTML মানে অর্থ দেখে element বাছা। পাতার বড় কাঠামোর জন্য HTML-এর আলাদা element আছে — এই পর্ব তাদের নিয়েই।

২০০০-এর দশকের শুরুতে টেবিল-লেআউট ছেড়ে ডিজাইনাররা যখন CSS-এ পাতা সাজাতে শুরু করলেন (পর্ব ০৭-এ সেই গল্প), তখন প্রায় প্রতিটি সাইটের কোড দেখতে ছিল এমন: <div id="header">, <div id="nav">, <div id="content">, <div id="footer">. ২০০৫ সালের দিকে Google, আর পরে Opera, কোটি কোটি ওয়েবপেজ বিশ্লেষণ করে দেখে কোন class আর id নাম সবচেয়ে বেশি ব্যবহার হয় — footer, header, menu, nav, content-এর মতো নাম ছিল তালিকার ওপরের দিকে। WHATWG-এর HTML5 কাজের একটি নীতি ছিল (ইংরেজিতে “pave the cowpaths”): মানুষ যে পথে ইতিমধ্যে হাঁটছে, সেই পথটাই পাকা করা হোক। তাই নতুন element-গুলোর নাম হলো header, nav, article, section, aside, footer. main যোগ হয় কিছুটা পরে, আর খোঁজার জায়গার জন্য search আসে ২০২৩ সালে।

নিচের স্টেপারে একটি div-soup পাতাকে ধাপে ধাপে semantic বানানো হচ্ছে। প্রতিটি ধাপে দেখুন, screen reader-এর “landmark তালিকা”-য় কী যোগ হলো। Landmark মানে পাতার এমন বড় অংশ, যাকে screen reader আলাদা করে চেনে আর যেখানে শর্টকাটে লাফ দেওয়া যায়।

ধাপ ১সবই div
<div class="header">দৈনিক নমুনা বার্তা</div>
<div class="menu">…লিংক…</div>
<div class="content">…খবর…</div>
<div class="footer">© ২০২৬</div>
ধাপ ২ওপরের অংশ header হলো
<header>দৈনিক নমুনা বার্তা</header>
<div class="menu">…লিংক…</div>
<div class="content">…খবর…</div>
<div class="footer">© ২০২৬</div>
ধাপ ৩মেনু nav হলো
<header>দৈনিক নমুনা বার্তা</header>
<nav aria-label="প্রধান মেনু">…লিংক…</nav>
<div class="content">…খবর…</div>
<div class="footer">© ২০২৬</div>
ধাপ ৪মূল অংশ main হলো
<header>দৈনিক নমুনা বার্তা</header>
<nav aria-label="প্রধান মেনু">…লিংক…</nav>
<main>…খবর…</main>
<div class="footer">© ২০২৬</div>
ধাপ ৫নিচের অংশ footer হলো
<header>দৈনিক নমুনা বার্তা</header>
<nav aria-label="প্রধান মেনু">…লিংক…</nav>
<main>…খবর…</main>
<footer>© ২০২৬</footer>
  1. সবই div. পর্দায় পাতা ঠিকঠাক দেখায়, কারণ CSS সব সাজিয়ে দিয়েছে। কিন্তু screen reader-এর landmark তালিকা ফাঁকা। চোখে দেখতে পান না এমন একজন পাঠককে ওপর থেকে লাইন ধরে ধরে শুনতে হবে — মেনুর কুড়িটি লিংক পেরিয়ে তবে খবর।
  2. header. পাতার মাথার অংশ এখন <header>. পাতার সরাসরি অংশ হলে এটি banner landmark হয় — “এটি সাইটের পরিচয়ের জায়গা: লোগো, নাম, হয়তো খোঁজার ঘর”।
  3. nav. মেনু এখন <nav> — navigation landmark. aria-label দিয়ে নাম দেওয়া হয়েছে “প্রধান মেনু”, কারণ অনেক পাতায় দুটি nav থাকে (ওপরে আর পাদদেশে), নাম দেখে শ্রোতা আলাদা করেন।
  4. main. খবরের অংশ এখন <main>. এটিই সবচেয়ে কাজের landmark — শ্রোতা এক চাপে সরাসরি পাতার আসল বিষয়ে চলে আসেন।
  5. footer. নিচের অংশ <footer> — পাতার সরাসরি অংশ হলে contentinfo landmark (screen reader বলে “content info”). CSS একটুও বদলায়নি, পর্দার চেহারাও না — বদলেছে শুধু অর্থ। চার লাইনের এই বদল একজন শ্রোতার কাছে মল-এ বোর্ড ফিরিয়ে আনার মতো।

এবার নিজে দেখুন। নিচের এডিটরে একই পাতা দুইভাবে লেখা — বাঁয়ে div দিয়ে, ডানে semantic element দিয়ে। পাশাপাশি সাজানোর জন্য একটু CSS আছে (Grid শিখবেন পর্ব ২৭-এ)। নিচের ছোট স্ক্রিপ্টটি প্রতিটি পাশে landmark তৈরি করে এমন element খুঁজে কনসোলে লেখে।

<style>
  .pair { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .pair > div { border: 2px dashed #999; padding: 6px; }
  .top, header { background: #dbeafe; padding: 4px; }
  .foot, footer { background: #eee; font-size: 14px; padding: 4px; }
</style>
<div class="pair">
  <div id="soup">
    <div class="top"><b>দৈনিক নমুনা বার্তা</b></div>
    <div class="menu"><a href="#a">জাতীয়</a> · <a href="#b">খেলা</a></div>
    <div class="content"><h2>বৃষ্টিতে জলাবদ্ধতা</h2><p>সকাল থেকে টানা বৃষ্টি…</p></div>
    <div class="foot">© ২০২৬ নমুনা বার্তা</div>
  </div>
  <div id="sem">
    <header><b>দৈনিক নমুনা বার্তা</b></header>
    <nav><a href="#a">জাতীয়</a> · <a href="#b">খেলা</a></nav>
    <main><h2>বৃষ্টিতে জলাবদ্ধতা</h2><p>সকাল থেকে টানা বৃষ্টি…</p></main>
    <footer>© ২০২৬ নমুনা বার্তা</footer>
  </div>
</div>
<script>
  const marks = 'header, nav, main, aside, footer, search';
  for (const side of ['soup', 'sem']) {
    const found = [...document.querySelectorAll('#' + side + ' :is(' + marks + ')')];
    console.log(side + ': ' + (found.map(e => e.localName).join(', ') || 'কোনো landmark নেই'));
  }
</script>

প্রিভিউতে দুই পাশ প্রায় হুবহু একরকম। কিন্তু কনসোলে দেখবেন — soup: কোনো landmark নেই, আর sem: header, nav, main, footer. চোখের কাছে পার্থক্য শূন্য, যন্ত্রের কাছে আকাশ-পাতাল। চেষ্টা করুন: বাঁ দিকের <div class="menu">-কে <nav class="menu"> করে দিন (শেষের </div>-ও </nav>) — কনসোলে soup-এর পাশে nav চলে আসবে, চেহারা বদলাবে না। তারপর ডান দিকে <footer>-এর পরে একটি <aside>পাশের খবর</aside> যোগ করে দেখুন।

২ · পাতার চার খুঁটি — header, nav, main, footer

বাড়ির কাঠামোয় যেমন সামনের বারান্দা, সিঁড়ি, মূল ঘর আর পেছনের উঠান থাকে, বেশিরভাগ ওয়েবপেজেও চারটি বড় অংশ থাকে। প্রতিটির জন্য একটি element:

<header>

পরিচয়ের অংশ — লোগো, সাইটের নাম, হয়তো খোঁজার ঘর আর মেনু। একটি article বা section-এরও নিজের header থাকতে পারে (অংশ ৪)।

দোকানের সাইনবোর্ড

<nav>

প্রধান চলাচলের লিংকের দল — সাইটের মেনু, পাতার সূচিপত্র, “আগের/পরের পাতা”। প্রতিটি লিংকের দলের জন্য নয়, শুধু বড়, গুরুত্বপূর্ণ দলের জন্য।

মলের তলা-নির্দেশিকা

<main>

এই পাতার আসল বিষয় — যা প্রতিটি পাতায় আলাদা। খবরের পাতায় খবরটি, দোকানের পাতায় পণ্যের তালিকা।

দোকানের ভেতরের তাক

<footer>

পাদদেশ — কপিরাইট, যোগাযোগ, নীতিমালার লিংক। article-এর footer-এ থাকে লেখকের তথ্য বা ট্যাগ।

রসিদের নিচের লেখা

main-এর তিনটি কড়া নিয়ম

  • দৃশ্যমান main একটিই। WHATWG নিয়মে একটি ডকুমেন্টে hidden attribute ছাড়া একাধিক <main> থাকতে পারে না। (কিছু single-page অ্যাপ কয়েকটি “পাতা” একসাথে রাখে আর বাকিগুলো hidden করে রাখে — সেটি বৈধ।)
  • main কোথায় বসবে। <main> কোনো article, aside, header, footer বা nav-এর ভেতরে রাখা যায় না। এর ওপরে থাকতে পারে শুধু body, সাজানোর জন্য div, বা নামহীন form.
  • বারবার আসা জিনিস main-এর বাইরে। লোগো, সাইটের মেনু, পাদদেশ প্রতিটি পাতায় একই — এগুলো main নয়। main-এ থাকে শুধু যা এই পাতার নিজস্ব।

<header> আর <footer>-এরও একটি নিয়ম আছে: এদের ভেতরে আরেকটি header বা footer রাখা যায় না (main-ও না) — এমনকি ভেতরে কোনো article থাকলেও না। পাতার header হলো সাইটের মাথা; সেখানে খবরের কার্ডের মতো article বসানোর দরকার হলে সেগুলো main-এ রাখাই ঠিক। আর নাম দেখে ভুল করবেন না: footer সব সময় পাতার একদম নিচে থাকতে হবে এমন নয়; এটি অর্থের নাম, অবস্থানের নয়।

কোন element কোন landmark — এক টেবিলে

ব্রাউজার প্রতিটি element-কে একটি role (ভূমিকা) দেয়, যা যায় accessibility tree-তে। নিজে থেকে পাওয়া এই role-কে বলে implicit role — আপনাকে কিছু লিখতে হয় না।

ElementLandmark roleকখন landmark হয়
<header>bannerশুধু যখন পাতার সরাসরি অংশ — article, aside, main, nav বা section-এর ভেতরে থাকলে নয়
<nav>navigationসব সময়
<main>mainসব সময়
<aside>complementaryপাতার বা main-এর সরাসরি অংশ হলে, অথবা aria-label দিয়ে নাম দিলে
<footer>contentinfoheader-এর মতোই — শুধু পাতার সরাসরি অংশ হলে
<section>regionশুধু যখন aria-label বা aria-labelledby দিয়ে নাম আছে
<form>formশুধু নাম থাকলে
<search>searchসব সময় (নতুন element, অংশ ৬)
<article>, <div>— (landmark নয়)article-এর role “article”, কিন্তু সেটি landmark নয়; div-এর কোনো অর্থই নেই
মূল ধারণা

Landmark-এর নাম দেওয়া হয় aria-label (সরাসরি লেখা) বা aria-labelledby (পাতার কোনো শিরোনামের id) দিয়ে — এটিই তার accessible name. একই ধরনের landmark একাধিক হলে (দুটি nav, তিনটি aside) প্রত্যেককে আলাদা নাম দিন: “প্রধান মেনু”, “পাদদেশের লিংক”। নামে role-এর শব্দটি (“navigation”) আবার লিখবেন না — screen reader নিজেই role বলে দেয়। aria-label="প্রধান মেনু" দিলে শোনা যায় “প্রধান মেনু, navigation”; কিন্তু aria-label="main navigation" দিলে শোনা যায় “main navigation, navigation” — একই শব্দ দুবার।

৩ · article, section না div — সিদ্ধান্তের তিন প্রশ্ন

নতুনদের সবচেয়ে বড় দ্বিধা এখানেই। তিনটিই “একটি দল”, তিনটিই ব্লক — তাহলে কোনটা কখন? WHATWG-এর সংজ্ঞাগুলো সহজ ভাষায়:

  • <article> — একটি নিজে-সম্পূর্ণ অংশ, যা পাতা থেকে তুলে আলাদা করেও অর্থপূর্ণ থাকে: খবর, ব্লগ পোস্ট, ফোরামের পোস্ট, পাঠকের মন্তব্য, পণ্যের কার্ড, একটি উইজেট। পরীক্ষাটি হলো — এটিকে কি RSS ফিডে, Facebook শেয়ারে বা অন্য সাইটে একা পাঠানো যায়?
  • <section> — একটি বড় জিনিসের বিষয়ভিত্তিক ভাগ, যার সাধারণত একটি শিরোনাম থাকে: বইয়ের অধ্যায়, খবরের “পটভূমি” অংশ, হোমপেজের “আজকের অফার” অংশ। শিরোনাম দেওয়ার মতো কিছু না থাকলে সম্ভবত এটি section নয়।
  • <div> — কোনো অর্থ নেই; শুধু CSS দিয়ে সাজানো বা JavaScript-এ ধরার জন্য কয়েকটি element-কে এক জায়গায় রাখা। কোনো অর্থবহ element না মিললে div-ই ঠিক উত্তর।
  1. একা দাঁড়াতে পারে?হ্যাঁ → <article>খবর, মন্তব্য, পণ্য
  2. নিজস্ব বিষয় ও শিরোনাম?হ্যাঁ → <section>অধ্যায়, অংশ
  3. শুধু সাজানোর জন্য?→ <div>কোনো অর্থ নেই
  4. আগে বিশেষগুলোnav · aside · figureআরও নির্দিষ্ট অর্থ
  1. প্রশ্ন ১ — একা দাঁড়াতে পারে? একটি খবরের পাতার খবরটি কেটে অন্য সাইটে বসালে তার শিরোনাম, লেখক, তারিখ, লেখা — সব অর্থপূর্ণ থাকে। পাঠকের একটি মন্তব্যও তাই। এরা <article>. খেয়াল করুন, article-এর ভেতরে article থাকতে পারে — খবরের নিচে প্রতিটি মন্তব্য একটি করে article.
  2. প্রশ্ন ২ — একটি নিজস্ব বিষয় আর শিরোনাম আছে? খবরের ভেতরে “বাজারের দাম” আর “চাষিদের কথা” — দুটি ভাগ, প্রত্যেকটির শিরোনাম আছে, কিন্তু একা কেটে নিলে অর্থ অসম্পূর্ণ। এরা <section>. Section-এর ভেতরে শিরোনাম (h2–h6) না থাকলে W3C validator সতর্ক করে: “Section lacks heading”.
  3. প্রশ্ন ৩ — শুধু সাজানোর জন্য? তিনটি কার্ডকে পাশাপাশি বসাতে একটি মোড়ক লাগবে, বা পাতাকে মাঝখানে রাখতে একটি .container — এগুলো অর্থ নয়, নকশা। এখানে <div>. “section দেখতে বেশি পেশাদার” ভেবে প্রতিটি মোড়ককে section বানানো একটি প্রচলিত ভুল — একে বলা যায় নতুন ধরনের div-soup.
  4. আগে বিশেষ element খুঁজুন। তিন প্রশ্নের আগে দেখুন আরও নির্দিষ্ট কিছু মেলে কি না: চলাচলের লিংক হলে nav, মূল লেখার পাশের বাড়তি তথ্য হলে aside, ছবি-চিত্র-কোড হলে figure, তালিকা হলে ul. সবচেয়ে নির্দিষ্ট element-ই সেরা; div সবার শেষে।

এবার একটি খবর লিখি, যেখানে তিনটিই আছে। খবরটি কাল্পনিক:

<style>
  article, section { border: 1px solid #bbb; padding: 4px 10px; margin: 6px 0; }
  .wrap { max-width: 520px; }
</style>
<div class="wrap">
  <article>
    <h2>রাজশাহীতে আমের মৌসুম শুরু (উদাহরণ খবর)</h2>
    <p>এ সপ্তাহ থেকে বাগানে আম পাড়া শুরু হয়েছে।</p>
    <section>
      <h3>বাজারের দাম</h3>
      <p>প্রথম দিকে দাম কিছুটা বেশি থাকে।</p>
    </section>
    <section>
      <h3>পাঠকের মন্তব্য</h3>
      <article>
        <p>এবার কুরিয়ারে আম পাঠানো সহজ হলে ভালো হয়।</p>
        <p><small>— তানভীর, ঢাকা</small></p>
      </article>
    </section>
  </article>
</div>

ধূসর দাগের বাক্সগুলো article আর section — শুধু দেখানোর জন্য CSS দিয়ে আঁকা। বাইরের বড় বাক্স খবর (article), ভেতরে দুটি section, আর মন্তব্যের section-এর ভেতরে আরেকটি ছোট article — মন্তব্যটি নিজেই একা দাঁড়াতে পারে। .wrap div-টির কোনো দাগ নেই — সে শুধু প্রস্থ বেঁধে রাখছে। চেষ্টা করুন: প্রথম section থেকে <h3>বাজারের দাম</h3> মুছে দিন — পর্দায় একটা নামহীন বাক্স থাকবে; এটাই সেই “শিরোনামহীন section”, যেখানে আসলে div বা শুধু p-ই যথেষ্ট ছিল। তারপর মন্তব্যটির মতো আরেকটি article যোগ করুন।

section দিলে heading-এর স্তর বদলায় না। HTML5-এর প্রথম দিকের খসড়ায় একটি “outline algorithm” ছিল — প্রতিশ্রুতি ছিল, প্রতিটি section-এর ভেতরে h1 লিখলেই ব্রাউজার নিজে স্তর ঠিক করে নেবে। কোনো ব্রাউজার বা screen reader সেটি কখনো চালু করেনি, আর ২০২২ সালে নিয়মটি WHATWG থেকে মুছে ফেলা হয়। তাই আজও heading-এর স্তর আপনাকে নিজে লিখতে হবে: পাতার শিরোনাম h1, ভাগের শিরোনাম h2, তার ভেতরের h3 — পর্ব ০৪-এর রূপরেখার নিয়ম মেনে।

৪ · header আর footer শুধু পাতার নয় — article-এরও; আর aside

“header মানে পাতার মাথা” — এটি অর্ধেক সত্য। <header> মানে কাছের অংশটির পরিচয়-অংশ। পাতার সরাসরি অংশ হলে সেটি পুরো সাইটের মাথা (banner). কিন্তু একটি article-এর ভেতরে থাকলে সেটি শুধু সেই article-এর মাথা — শিরোনাম, লেখকের নাম, প্রকাশের তারিখ। একইভাবে article-এর <footer>-এ থাকে লেখকের পরিচয়, ট্যাগ, “শেয়ার করুন” বা সংশোধনীর তথ্য।

পরীক্ষার খাতার কথা ভাবুন। পুরো খাতার ওপরে থাকে কেন্দ্রের নাম আর রোল নম্বর — এটি খাতার header. কিন্তু প্রতিটি প্রশ্নের উত্তরের ওপরেও লেখা থাকে “প্রশ্ন ৩(ক)” — এটি সেই উত্তরের header. দুটোই header, কিন্তু আলাদা স্তরের। Screen reader-ও তাই করে: article-এর ভেতরের header-কে banner landmark বানায় না, না হলে খবরের পাতায় বিশটি খবরের কার্ডে বিশটি “banner” শোনা যেত।

<article>
  <header>
    <h2>মেট্রোরেলে নতুন সময়সূচি (উদাহরণ)</h2>
    <p>প্রতিবেদক: রিয়া সেন ·
      <time datetime="2026-06-02">২ জুন ২০২৬</time></p>
  </header>
  <p>আগামী সপ্তাহ থেকে সকালের ট্রেন আরও আগে ছাড়বে।</p>
  <aside>
    <h3>জেনে রাখুন</h3>
    <p>র‍্যাপিড পাস থাকলে লাইনে দাঁড়াতে হয় না।</p>
  </aside>
  <footer>
    <p>বিষয়: <a href="#t1">যাতায়াত</a>, <a href="#t2">ঢাকা</a></p>
  </footer>
</article>

কোনো CSS নেই — header, aside, footer ব্রাউজারের ডিফল্টে সাধারণ block-এর মতোই দেখায়; কোনো বিশেষ রং বা বর্ডার নেই। এদের কাজ অর্থে, চেহারায় নয়। এখানে তিনটির কোনোটিই landmark নয়: header আর footer article-এর ভেতরে, আর aside-টিও article-এর ভেতরে, নামহীন। চেষ্টা করুন: <aside>-কে লিখুন <aside aria-label="জেনে রাখুন"> — চেহারা একই থাকবে, কিন্তু এখন নামসহ এটি complementary landmark হওয়ার যোগ্য। তারপর <time>-এর datetime মুছে দেখুন — চোখে কিছু বদলায় না, কিন্তু যন্ত্রের জন্য তারিখটি আর পড়ার যোগ্য থাকে না (পর্ব ০৪)।

aside — মূল লেখার পাশের কথা

<aside> হলো এমন অংশ, যা আশেপাশের লেখার সাথে সম্পর্কিত কিন্তু আলাদা — বাদ দিলেও মূল লেখা পূর্ণ থাকে। পত্রিকার পাশের “আরও পড়ুন” বক্স, খবরের ভেতরে “জেনে রাখুন” ঘর, ব্লগের সাইডবার, বিজ্ঞাপনের জায়গা। “পাশে” শব্দটি অর্থের, অবস্থানের নয় — ফোনের ছোট পর্দায় aside নিচে চলে যেতে পারে, তবু সে aside. উল্টো দিকে, শুধু ডান দিকে বসানো হবে বলে কোনো মূল অংশকে aside বানাবেন না।

৫ · figure আর address — নিজে-সম্পূর্ণ চিত্র আর যোগাযোগের ঠিকানা

পর্ব ০৬-এ ছবির সাথে <figure> আর <figcaption> দেখেছেন। কিন্তু figure শুধু ছবির জন্য নয়। এর আসল সংজ্ঞা: মূল লেখা যাকে উল্লেখ করে, কিন্তু যাকে অন্য জায়গায় (পাতার শেষে, পাশে, পরিশিষ্টে) সরিয়ে দিলেও লেখার প্রবাহ ভাঙে না। পাঠ্যবইয়ের “চিত্র ৩.২” ঠিক এমন। একটি চার্ট, একটি কোডের অংশ, একটি কবিতার উদ্ধৃতি, একটি ছোট টেবিল — সবই figure হতে পারে। <figcaption> থাকবে figure-এর প্রথম বা শেষ সন্তান হিসেবে, আর সেটিই figure-এর নাম হয়ে যায়।

<address> নিয়ে ভুল ধারণাটা নামেই লুকানো। এটি যেকোনো ঠিকানার জন্য নয়। WHATWG নিয়মে address হলো কাছের article-এর বা পুরো পাতার মালিকের সাথে যোগাযোগের তথ্য — প্রতিবেদকের ইমেইল, দোকানের হটলাইন, অফিসের ঠিকানা। খবরের ভেতরে “ঘটনাটি ঘটেছে মিরপুর ১০-এ” — এটি address নয়, সাধারণ লেখা। পাতার footer-এ “আমাদের ঠিকানা: … ফোন: …” — এটি address, কারণ সেটি সাইটের মালিকের সাথে যোগাযোগের উপায়।

<article>
  <h2>সপ্তাহে কত যাত্রী (কাল্পনিক সংখ্যা)</h2>
  <p>শুক্রবারে যাত্রী সবচেয়ে কম — চিত্র ১ দেখুন।</p>
  <figure>
    <svg viewBox="0 0 150 60" width="240" role="img"
         aria-label="রবি ৫০, সোম ৪৫, শুক্র ২০ হাজার যাত্রী">
      <rect x="10" y="10" width="30" height="50" fill="#2563eb"/>
      <rect x="60" y="15" width="30" height="45" fill="#2563eb"/>
      <rect x="110" y="40" width="30" height="20" fill="#d97706"/>
    </svg>
    <figcaption>চিত্র ১ — রবি, সোম আর শুক্রবারের যাত্রী (হাজারে)</figcaption>
  </figure>
  <footer>
    <address>
      প্রতিবেদকের সাথে যোগাযোগ:
      <a href="mailto:desk@example.com">desk@example.com</a>
    </address>
  </footer>
</article>

ব্রাউজার figure-কে দুই পাশে একটু ভেতরে সরিয়ে দেখায় (ডিফল্ট margin), তিনটি দণ্ডের নিচে ক্যাপশন। address-এর লেখা ডিফল্টে বাঁকা (italic). ইমেইল লিংকে চাপলে প্রিভিউর নিচে লেখা আসবে, কারণ প্রিভিউর ভেতরে mailto খোলে না। চেষ্টা করুন: <figcaption>-কে figure-এর প্রথম সন্তান বানান (svg-এর আগে) — ক্যাপশন ওপরে চলে আসবে, দুটোই বৈধ। তারপর তৃতীয় দণ্ডের height 20 থেকে 35 করুন (আর y 25) — আর ভাবুন, aria-label-এর সংখ্যাও বদলাতে হবে, না হলে শ্রোতা ভুল তথ্য পাবেন।

৬ · <search> — খোঁজার জায়গার নিজস্ব element

প্রায় প্রতিটি সাইটে একটি খোঁজার ঘর থাকে — অনলাইন দোকানে “পণ্য খুঁজুন”, খবরের সাইটে “খবর খুঁজুন”। বহু বছর ধরে এর জন্য আলাদা কোনো element ছিল না। ডেভেলপাররা লিখতেন <form role="search"> বা <div role="search"> — অর্থাৎ ARIA দিয়ে হাতে role বসাতেন। ২০২৩ সালে WHATWG HTML-এ যোগ হয় <search> element: খোঁজা বা ছাঁকার (filter) কন্ট্রোলগুলোকে মুড়ে দিলেই সেটি নিজে থেকে search landmark হয়।

<header>
  <b>বইঘর (উদাহরণ সাইট)</b>
  <search>
    <form action="/search">
      <label for="q">বই খুঁজুন</label>
      <input type="search" id="q" name="q" placeholder="যেমন: পদ্মানদীর মাঝি">
      <button>খুঁজুন</button>
    </form>
  </search>
</header>
<main>
  <h1>উপন্যাস</h1>
  <search aria-label="ফলাফল ছাঁকুন">
    <label><input type="checkbox" name="stock"> শুধু স্টকে আছে</label>
  </search>
</main>

চেহারায় <search>-এর কোনো ছাপ নেই — সে একটি সাধারণ block. ঘরে কিছু লিখে “খুঁজুন” চাপুন: প্রিভিউর নিচে দেখবেন ফর্ম জমা হতো → q=…. খেয়াল করুন, <search> ফর্মের জায়গা নেয়নি — ফর্ম যেমন ছিল তেমনই, search শুধু তাকে মুড়ে অর্থ দিয়েছে। দ্বিতীয় search-এ কোনো form নেই; পাতার ভেতরেই ফল ছাঁকার কন্ট্রোল রাখতেও এটি চলে। চেষ্টা করুন: প্রথম <search> আর </search> দুটো মুছে দিন — প্রিভিউ হুবহু একই থাকবে; হারাবে শুধু landmark-টি। (ফর্মের খুঁটিনাটি পর্ব ০৮-এ।)

ব্রাউজার সাপোর্ট: <search> ২০২৩ সালের শেষ দিকে Chrome, Edge, Firefox আর Safari — চারটিতেই আসে, তাই তখন এটি Baseline Newly available হয়। Baseline-এর হিসাবে ৩০ মাস পরে কোনো feature “Widely available” ধরা হয়, ফলে ২০২৬ সালের মধ্যে এটি সেই স্তরে পৌঁছানোর কথা — তবু কাজের আগে MDN বা Can I use-এ বর্তমান অবস্থা দেখে নিন। খুব পুরোনো ব্রাউজার <search> চেনে না: সে এটিকে একটি অচেনা inline element ধরে, কোনো landmark দেয় না, কিন্তু ভেতরের ফর্ম ঠিকই কাজ করে। তাই ঝুঁকি নেই। পুরোনো ব্রাউজারেও landmark চাইলে পুরোনো পথ <form role="search"> এখনো বৈধ — তবে <search role="search"> লিখবেন না; একই role দুবার বলা অপ্রয়োজনীয়, validator সতর্ক করবে।

৭ · Landmark ধরে চলাচল — screen reader ব্যবহারকারী আসলে কী করেন

চোখে দেখা মানুষ পাতায় ঢুকে চোখ বুলিয়ে মূল লেখায় চলে যান। Screen reader ব্যবহারকারী চোখ বুলাতে পারেন না, কিন্তু তাঁদের হাতে আছে কি-বোর্ডের শর্টকাট। পাতার ওপর থেকে সব শোনার বদলে তাঁরা লাফ দেন — heading ধরে, landmark ধরে, লিংকের তালিকা ধরে। WebAIM-এর screen reader ব্যবহারকারী জরিপে বারবার দেখা গেছে, লম্বা পাতায় বেশিরভাগ মানুষ আগে heading ধরে খোঁজেন, আর অনেকে landmark-ও নিয়মিত ব্যবহার করেন। দুটোই পাওয়া যায় শুধু তখন, যখন কোড semantic.

Windows-এর জনপ্রিয় ফ্রি screen reader NVDA-তে D চাপলে পরের landmark-এ যাওয়া যায়, Shift+D-তে আগেরটিতে। নিচের স্টেপারে একটি খবরের সাইটে একজন শ্রোতা বারবার D চাপছেন:

header → bannerলোগো, সাইটের নাম
search → searchখবর খুঁজুন
nav → navigationপ্রধান মেনু, ২০টি লিংক
main → mainআজকের প্রধান খবর
aside → complementaryসবচেয়ে পঠিত
footer → content infoযোগাযোগ, কপিরাইট
  1. পাতা খুলল। NVDA প্রথমে পাতার <title> পড়ে। শ্রোতা জানেন কোন সাইটে এসেছেন, কিন্তু খবরটি পৌঁছাতে মাঝখানে লোগো, খোঁজার ঘর আর মেনুর বিশটি লিংক।
  2. D — banner. প্রথম landmark: পাতার মাথা। এখান থেকে সাইটের নাম বা হোমপেজের লিংক পাওয়া যায়।
  3. আবার D — search. খোঁজার জায়গা। কেউ নির্দিষ্ট খবর খুঁজতে এলে এখানেই থেমে লিখতে শুরু করবেন।
  4. আবার D — navigation. নামসহ ঘোষণা: “প্রধান মেনু”। শ্রোতা চাইলে ভেতরে ঢুকে লিংক শুনবেন, না চাইলে আরেকবার D চেপে বিশটি লিংক এক লাফে পার হবেন।
  5. আবার D — main. পাতার আসল বিষয়। মাত্র চারবার চাপে খবরের শুরুতে — div-soup পাতায় এখানে আসতে কয়েক ডজন লাইন শুনতে হতো। এখানে H চেপে heading ধরে খবরের ভাগে ভাগে যাওয়া যায়।
  6. আবার D — complementary. পাশের “সবচেয়ে পঠিত” বক্স। aria-label দেওয়া নামটি আগে পড়া হয়, তাই শ্রোতা বোঝেন এটি কী।
  7. আবার D — content info. পাদদেশ: যোগাযোগ, নীতিমালা। আর সব landmark একসাথে দেখতে NVDA-তে NVDA+F7 চেপে “Elements list” খুলে landmark বেছে নেওয়া যায়। JAWS-এ R চাপলে পরের landmark-এ যাওয়া যায়, আর Mac বা iPhone-এর VoiceOver-এ “rotor” থেকে landmark তালিকা আসে। ঘোষণার শব্দ screen reader আর ভাষাভেদে একটু আলাদা, কিন্তু তথ্য একই।

আরও গভীরে: Screen reader নিজে HTML পড়ে না। ব্রাউজার DOM থেকে accessibility tree বানায়, আর কোন element কোন role পাবে তা লেখা আছে W3C-র HTML-AAM (HTML Accessibility API Mappings) নথিতে — header কখন banner, aside কখন complementary, section কখন region, সবই সেখানকার নিয়ম। সেই role যায় অপারেটিং সিস্টেমের accessibility API-তে (Windows-এ UI Automation বা IAccessible2, macOS-এ NSAccessibility), আর screen reader সেখান থেকে পড়ে। এজন্যই একই HTML বিভিন্ন ব্রাউজার-screen reader জুটিতে সামান্য আলাদা শোনাতে পারে — নিয়ম এক, বাস্তবায়ন একাধিক।

বেশি landmark মানেই ভালো নয়। প্রতিটি ছোট অংশে aria-label বসিয়ে region বানালে landmark তালিকা লম্বা আর অর্থহীন হয়ে যায় — মলের প্রতিটি দোকানে আলাদা “তলা-নির্দেশিকা” টাঙানোর মতো। সাধারণ পাতায় ৪–৮টি landmark যথেষ্ট: banner, navigation, (search), main, (complementary), contentinfo. শুধু সত্যিই গুরুত্বপূর্ণ ভাগকে নামসহ section করুন।

৮ · Skip link — “মূল অংশে যান”

সবাই মাউস ব্যবহার করেন না। হাতের সমস্যার কারণে, অভ্যাসে বা screen reader-এর সাথে অনেকে শুধু কি-বোর্ড চালান: Tab চাপলে পরের লিংক বা বোতামে focus যায়। কিন্তু প্রতিটি পাতায় মূল লেখার আগে যদি মেনুতে ত্রিশটি লিংক থাকে, তাহলে প্রতিটি পাতায় ত্রিশবার Tab! Landmark শর্টকাট আছে শুধু screen reader-এ; সাধারণ কি-বোর্ড ব্যবহারকারীর জন্য সমাধান হলো skip link.

Skip link হলো পাতার একদম প্রথম লিংক, যা <main>-এর id-তে লাফ দেয় (পর্ব ০৫-এর href="#id"). সাধারণত এটি চোখের আড়ালে থাকে, আর Tab চাপলে ভেসে ওঠে। WCAG-এর নিয়ম ২.৪.১ (Bypass Blocks, স্তর A) চায় বারবার আসা অংশ পেরিয়ে যাওয়ার একটি উপায় — skip link সেই নিয়ম পূরণের সবচেয়ে প্রচলিত পথ। এই পাতার ওপরেও একটি আছে: পাতা খুলে প্রথমবার Tab চাপুন, “সরাসরি পর্বে যান” দেখতে পাবেন।

<style>
  .skip { position: absolute; top: -4em; left: 8px; padding: 8px 12px;
          background: #0d1f3c; color: #fff; }
  .skip:focus { top: 8px; }
  main:focus { outline: 3px solid #d97706; }
</style>
<a class="skip" href="#main">মূল অংশে যান</a>
<header>
  <b>দোকানঘর (উদাহরণ)</b>
  <nav aria-label="প্রধান মেনু">
    <a href="#m1">মোবাইল</a> <a href="#m2">ল্যাপটপ</a> <a href="#m3">ফ্যাশন</a>
    <a href="#m4">মুদি</a> <a href="#m5">বই</a> <a href="#m6">অফার</a>
  </nav>
</header>
<main id="main" tabindex="-1">
  <h1>আজকের অফার</h1>
  <p>প্রথম পণ্য: <a href="#p1">ফোনের কভার</a></p>
</main>

প্রথমে skip link দেখা যায় না — সে পর্দার ওপরে লুকিয়ে আছে। প্রিভিউর ভেতরে একবার ক্লিক করুন, তারপর Tab চাপুন: ওপরে বাঁয়ে গাঢ় নীল “মূল অংশে যান” ভেসে উঠবে। Enter চাপলে main-এর চারপাশে কমলা দাগ আসবে — focus সেখানে চলে গেছে; এবার আরেকবার Tab দিলে সরাসরি “ফোনের কভার” লিংক, মেনুর ছয়টি লিংক বাদ। tabindex="-1" main-কে focus নিতে দেয় (Tab-এর ক্রমে না ঢুকিয়েই), যাতে সব ব্রাউজারে লাফটি নির্ভরযোগ্য হয়। চেষ্টা করুন: .skip-এ display: none যোগ করুন — এবার Tab চাপলে সরাসরি মেনুর প্রথম লিংকে চলে যাবে; display: none দিলে লিংকটি focus-ই পায় না, তাই skip link এভাবে লুকানো ভুল।

দুটি সাধারণ ভুল এড়িয়ে চলুন: skip link-কে চিরতরে অদৃশ্য রাখা (চোখে দেখা কি-বোর্ড ব্যবহারকারী বুঝবেন না তিনি কোথায় — WCAG ২.৪.৭ Focus Visible চায় focus চোখে দেখা যাক), আর লক্ষ্যের id ভুল লেখা — তখন লিংক কোথাও যায় না। Focus-এর চেহারা সুন্দর করার CSS আসবে পর্ব ৪৫-এ।

৯ · পূর্ণ পাতার কঙ্কাল — অনলাইন দোকান আর খবরের সাইট

এবার সব টুকরো জোড়া দিই। নিচে একটি বাংলাদেশি অনলাইন দোকানের পণ্যের পাতার পূর্ণ কঙ্কাল — কোনো সাজসজ্জা নেই, শুধু কাঠামো। বাড়ির ঢালাই শেষে যেমন রং-প্লাস্টারের আগে ইট-কলাম দেখা যায়, এটিও তেমন। সাজানো আসবে মডিউল ৩ আর ৪-এ।

<a href="#main">মূল অংশে যান</a>
<header>
  <a href="#home"><b>দোকানঘর (উদাহরণ)</b></a>
  <search>
    <form><input type="search" name="q" aria-label="পণ্য খুঁজুন"> <button>খুঁজুন</button></form>
  </search>
  <nav aria-label="প্রধান মেনু">
    <a href="#c1">মোবাইল</a> · <a href="#c2">ফ্যাশন</a> · <a href="#c3">মুদি</a>
  </nav>
</header>
<main id="main">
  <h1>মোবাইল ফোন</h1>
  <section aria-labelledby="deal">
    <h2 id="deal">আজকের অফার</h2>
    <article><h3>ফোন মডেল ক</h3><p>৳১২,৪৯৯</p><button>কার্টে যোগ করুন</button></article>
    <article><h3>ফোন মডেল খ</h3><p>৳১৮,৯৯০</p><button>কার্টে যোগ করুন</button></article>
  </section>
  <aside aria-label="ডেলিভারির তথ্য">
    <p>ঢাকার ভেতরে ডেলিভারি সাধারণত ২–৩ দিনে, ক্যাশ অন ডেলিভারি সুবিধাসহ।</p>
  </aside>
</main>
<footer>
  <nav aria-label="সহায়তা"><a href="#faq">সাধারণ প্রশ্ন</a> · <a href="#ret">ফেরত নীতি</a></nav>
  <address>হটলাইন: <a href="tel:+8801000000000">০১০০০-০০০০০০ (উদাহরণ)</a></address>
  <p><small>© ২০২৬ দোকানঘর</small></p>
</footer>

প্রিভিউ দেখতে সাদামাটা — ব্রাউজারের ডিফল্ট স্টাইলে ওপর থেকে নিচে সব সাজানো। কিন্তু কাঠামো পরিপূর্ণ: skip link, banner (লোগো, search, প্রধান মেনু), একটি main যার ভেতরে নামসহ “আজকের অফার” region আর দুটি পণ্যের article, ডেলিভারির aside, আর contentinfo-র ভেতরে দ্বিতীয় nav ও address. পণ্যের কার্ড article কারণ প্রতিটি কার্ড একা দাঁড়ায় — শেয়ার করা যায়, আলাদা পাতায় যায়; অনেকে এর বদলে <ul>-এর প্রতিটি <li>-তে কার্ড রাখেন, সেটিও ভালো পছন্দ। চেষ্টা করুন: “skip link”-এ Tab দিয়ে Enter চাপুন, তারপর হটলাইনের লিংকে চাপুন — প্রিভিউর নিচে tel: লিংকের বার্তা আসবে। এরপর একটি তৃতীয় পণ্যের article যোগ করুন।

প্রিভিউর পাতায় কোন কোন landmark — একটি ছোট মাপার যন্ত্র

নিচের JavaScript-টি একটি খবরের সাইটের কঙ্কাল পড়ে, অংশ ২-এর টেবিলের নিয়ম মেনে প্রতিটি element-এর landmark role আর নাম বের করে — screen reader-এর landmark তালিকার একটি সরল নকল। (আসল হিসাব ব্রাউজার করে HTML-AAM মেনে; এটি শেখার জন্য সংক্ষিপ্ত রূপ।)

// header/footer: article, aside, main, nav বা section-এর ভেতরে থাকলে landmark নয়
const insideSectioning = el => el.parentElement.closest('article, aside, main, nav, section');
function landmarkName(el) {
  if (el.hasAttribute('aria-label')) return el.getAttribute('aria-label');
  const ref = el.getAttribute('aria-labelledby');
  return ref ? document.getElementById(ref).textContent.trim() : '';
}
function roleOf(el) {
  const tag = el.localName, named = landmarkName(el) !== '';
  if (tag === 'header') return insideSectioning(el) ? null : 'banner';
  if (tag === 'footer') return insideSectioning(el) ? null : 'contentinfo';
  if (tag === 'section') return named ? 'region' : null;
  if (tag === 'aside') return (el.parentElement.closest('article, aside, nav, section') && !named) ? null : 'complementary';
  return { nav: 'navigation', main: 'main', search: 'search' }[tag] || null;
}
for (const el of document.querySelectorAll('header, nav, main, aside, footer, section, search')) {
  const role = roleOf(el), label = landmarkName(el);
  if (role) console.log(role + (label ? ' "' + label + '"' : '') + '  <' + el.localName + '>');
  else console.log('   (landmark নয়)  <' + el.localName + '> inside <' + insideSectioning(el).localName + '>');
}

আউটপুটে আসবে: banner <header>, search <search>, navigation "প্রধান মেনু", main, তারপর তিনটি “(landmark নয়)” লাইন — article-এর ভেতরের header, aside আর footer — তারপর region "সবচেয়ে পঠিত", complementary "বিজ্ঞাপন", contentinfo আর পাদদেশের navigation "পাদদেশের লিংক". চেষ্টা করুন: if (tag === 'header') লাইনটিকে if (tag === 'header') return 'banner'; করে দিন — এবার article-এর header-ও banner হয়ে যাবে, তালিকায় দুটি banner. বিশটি খবরের কার্ডের পাতায় এটি হতো বিশটি banner — ঠিক এই বিশৃঙ্খলা এড়াতেই নিয়মটি। DOM পড়ার আরও কৌশল JavaScript কোর্সের DOM পর্বে।

DevTools-এর Accessibility pane-এ landmark দেখুন

নিজের পাতায় landmark ঠিক তৈরি হলো কি না, অনুমান না করে চোখে দেখা যায়। Chrome বা Edge-এর DevTools-এ ধাপগুলো (Firefox-এ একই কাজ করে “Accessibility Inspector”):

ElementsF12 বা Ctrl+Shift+I
<body>
  <a href="#main">মূল অংশে যান</a>
  ▸ <header>…</header>
  ▸ <main id="main">…</main>   ← এটি বাছাই করা
  ▸ <footer>…</footer>
ডান পাশের ট্যাবStyles · Computed · … · Accessibility
Styles   Computed   Layout   Accessibility
(ট্যাবটি না দেখলে » চিহ্নে চাপুন)
Accessibility paneবাছাই করা element-এর তথ্য
▾ Accessibility Tree
    RootWebArea "দোকানঘর"
      main
        heading "মোবাইল ফোন"
▾ Computed Properties
    Name: ""
    Role: main
পুরো পাতার গাছEnable full-page accessibility tree
RootWebArea "দোকানঘর"
  link "মূল অংশে যান"
  banner
    search
    navigation "প্রধান মেনু"
  main
    region "আজকের অফার"
  contentinfo
LighthouseAccessibility রিপোর্ট
Accessibility  স্কোর ও সমস্যার তালিকা
  উদাহরণ: “Document does not have a main landmark”
  উদাহরণ: “Heading elements are not in a sequentially-descending order”
  1. Elements প্যানেল খুলুন। পাতায় ডান-ক্লিক করে “Inspect”, বা F12. DOM গাছ থেকে <main> বাছাই করুন।
  2. Accessibility ট্যাব। Styles-এর পাশের ট্যাবগুলোর মধ্যে “Accessibility” খুঁজুন (জায়গা কম হলে » চিহ্নের ভেতরে লুকানো থাকে)।
  3. বাছাই করা element-এর role. “Computed Properties”-এ Role: main. একটি div বাছাই করলে দেখবেন role generic — অর্থহীন। article-এর ভেতরের header বাছাই করলেও banner আসবে না; অংশ ৪-এর নিয়ম চোখে দেখা গেল। “Name” ঘরে aria-label বা aria-labelledby থেকে আসা নামও দেখা যায়।
  4. পুরো পাতার accessibility tree. Accessibility pane-এর ওপরে “Enable full-page accessibility tree” টিক দিন (একবার পাতা আবার লোড হতে পারে)। তারপর Elements প্যানেলে একটি ছোট মানুষ-চিহ্নের বোতামে DOM-এর বদলে পুরো accessibility tree দেখা যায় — screen reader-এর landmark তালিকার প্রায় হুবহু ছবি।
  5. Lighthouse দিয়ে স্বয়ংক্রিয় পরীক্ষা। DevTools-এর Lighthouse ট্যাবে “Accessibility” বেছে রিপোর্ট চালান। main landmark নেই, heading-এর স্তর লাফ দিয়েছে, লিংকের নাম নেই — এ ধরনের সমস্যা তালিকায় আসে। তবে মনে রাখবেন, স্বয়ংক্রিয় টুল সব ধরতে পারে না; “section-টি আসলে article হওয়া উচিত ছিল কি না” — সেই বিচার আপনার। DevTools-এর বাকি কৌশল পর্ব ৪৭-এ।

১০ · AI-এর যুগে — AI-এর বানানো পাতার কাঠামো যাচাই

“একটা ই-কমার্স হোমপেজ বানিয়ে দাও” — AI কয়েক সেকেন্ডে সুন্দর পাতা দেবে। কিন্তু কোড খুললে প্রায়ই দেখবেন, ভেতরে সেই পুরোনো div-soup: <div class="navbar">, <div class="main-content">, ক্লিক-যোগ্য <div onclick>. কারণ AI শিখেছে কোটি কোটি পুরোনো পাতা আর framework-এর নমুনা থেকে, যেখানে এমন কোডই বেশি। আবার উল্টো ভুলও করে — প্রতিটি মোড়ককে section বানায়, বা <main role="main">-এর মতো অপ্রয়োজনীয় ARIA দেয়।

AI সাধারণত যেসব ভুল করে

AI-এর ভুলকেন সমস্যাঠিক উপায়
সব অংশ div, পরিচয় শুধু class-একোনো landmark নেই, শ্রোতা লাফ দিতে পারেন নাheader, nav, main, aside, footer
দুটি দৃশ্যমান <main>, বা main-কে article-এর ভেতরেনিয়মবিরুদ্ধ; validator error দেয়পাতায় একটি main, body-র কাছাকাছি
প্রতিটি মোড়ক <section>, শিরোনাম নেইঅর্থহীন কাঠামো; “Section lacks heading”সাজানোর মোড়ক div; section-এ শিরোনাম
<header role="banner">, <nav role="navigation">অপ্রয়োজনীয় ARIA; validator সতর্ক করেimplicit role-ই যথেষ্ট
Skip link নেই, বা display: none দিয়ে লুকানোকি-বোর্ড ব্যবহারকারী পৌঁছাতে পারেন নাপ্রথম লিংক, focus পেলে দৃশ্যমান
<search> চেনে না, অথবা বলে “সব ব্রাউজারে নেই”পুরোনো তথ্যMDN আর Can I use-এ বর্তমান Baseline অবস্থা দেখুন
যেকোনো ঠিকানায় <address>অর্থ ভুলশুধু মালিক বা লেখকের যোগাযোগের তথ্যে

AI-কে কাজ দেওয়ার সময় কাঠামোর শর্তগুলো আগেই লিখে দিন, আর শেষে তাকে নিজের landmark তালিকা লিখতে বলুন — তালিকা আর কোড না মিললেই ভুল ধরা পড়ে।

তুমি একজন অ্যাক্সেসিবিলিটি-সচেতন ফ্রন্ট-এন্ড ডেভেলপার। একটি বাংলাদেশি অনলাইন বইয়ের দোকানের হোমপেজের শুধু HTML কঙ্কাল লেখো (CSS পরে আমি নিজে লিখব)। শর্ত: ১. পাতার প্রথম লিংক "মূল অংশে যান", যা main-এর id-তে যাবে। ২. header-এ লোগো, search element-এ মোড়ানো খোঁজার ফর্ম (label সহ), আর aria-label="প্রধান মেনু" দেওয়া nav. ৩. ঠিক একটি main; ভেতরে h1, তারপর "নতুন বই" আর "সেরা বিক্রি" নামে দুটি section, প্রতিটিতে h2 আর বইয়ের কার্ড (article). ৪. footer-এ দ্বিতীয় nav (নামসহ) আর address-এ দোকানের যোগাযোগ (কাল্পনিক নম্বর)। ৫. সাজানোর মোড়ক লাগলে div; header, nav, main-এ বাড়তি role দেবে না; div-এ onclick দেবে না। শেষে একটি তালিকা দাও: পাতায় কোন কোন landmark থাকবে আর প্রত্যেকটির নাম কী।

AI-এর দেওয়া পাতা হাতে পেলে — যাচাইয়ের চেকলিস্ট

পরীক্ষা ও ইন্টারভিউতে — বিশ্ববিদ্যালয়, চাকরি বা ফ্রন্ট-এন্ড ইন্টারভিউর পরীক্ষায় এ ধরনের প্রশ্ন প্রায়ই আসে:

  • Semantic element কী, দুটি উদাহরণ দিন। — যে element নিজের অর্থ বলে: <nav>, <article>; বিপরীতে <div> কিছুই বলে না।
  • article আর section-এর পার্থক্য? — article একা দাঁড়াতে পারে এমন নিজে-সম্পূর্ণ অংশ; section একটি বড় জিনিসের শিরোনামসহ বিষয়ভিত্তিক ভাগ।
  • একটি পাতায় কয়টি main? — দৃশ্যমান একটিই; বাকিগুলো থাকলে hidden হতে হবে।
  • header কি শুধু পাতার ওপরে থাকে? — না; article বা section-এরও নিজস্ব header থাকে, আর তখন সেটি banner landmark নয়।
  • Skip link কী, কেন? — পাতার প্রথম লিংক যা main-এ লাফ দেয়; কি-বোর্ড ব্যবহারকারীকে বারবার মেনু পেরোতে হয় না (WCAG ২.৪.১)।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। এগুলো আপনাকে ট্যাগ-মুখস্থকারী থেকে কাঠামো-চিন্তক বানাবে।

প্র ০১HTML5-এর header, nav, footer element তো বহু বছর আগে এসেছে — তবু আজও এত সাইট div-soup কেন?

এর পেছনে প্রযুক্তি, ইতিহাস আর মানুষের অভ্যাস — তিনটিই আছে।

  • পুরোনো ব্রাউজারের ভয়: নতুন element আসার সময় Internet Explorer 8 পর্যন্ত ব্রাউজার অচেনা element-কে CSS দিয়ে সাজাতেই দিত না। সমাধান হিসেবে ২০০৯ সালের দিকে “html5shiv” নামে একটি ছোট JavaScript কৌশল জনপ্রিয় হয়, যা পুরোনো IE-কে নতুন element চেনাত। কিন্তু JavaScript বন্ধ থাকলে পাতা ভেঙে যেত — তাই অনেক দল ঝুঁকি না নিয়ে div-ই রেখে দেয়। সেই অভ্যাস থেকে গেছে বহু বছর পরেও।
  • Framework আর component: React বা Vue-এর মতো টুলে পাতা ছোট ছোট component-এ ভাগ হয়। প্রতিটি component-এর মোড়ক হিসেবে <div> লেখা সবচেয়ে সহজ, আর পুরো পাতাটা কেমন দাঁড়াল তা একজন ডেভেলপারের চোখে পড়ে না।
  • চোখে ভুল ধরা পড়ে না: div-soup পাতা দেখতে একদম ঠিক থাকে। ডিজাইন রিভিউ, ক্লায়েন্ট, এমনকি পরীক্ষক — কেউই পার্থক্য দেখেন না। যিনি সমস্যায় পড়েন, তিনি screen reader ব্যবহারকারী, যিনি সাধারণত প্রজেক্টের মিটিংয়ে নেই।
  • শেখার উৎস: পুরোনো টিউটোরিয়াল, টেমপ্লেট, আর এখন AI — সবখানে পুরোনো কোডের ছড়াছড়ি।

আজ আর কোনো অজুহাত নেই: সব আধুনিক ব্রাউজার এই element-গুলো পুরোপুরি চেনে, আর বাড়তি কোনো খরচ ছাড়াই এগুলো লেখা যায়। অনেক দেশে সরকারি ও বড় প্রতিষ্ঠানের ওয়েবসাইটের জন্য অ্যাক্সেসিবিলিটি আইনি বাধ্যবাধকতাও হয়ে উঠছে, আর WCAG-এর ১.৩.১ নিয়ম (Info and Relationships) সরাসরি বলে — চোখে দেখা কাঠামো কোডেও প্রকাশ পেতে হবে।

মূল উপলব্ধি: যে ভুল চোখে পড়ে না, তা নিজে থেকে ঠিক হয় না। এজন্যই validator, DevTools আর কি-বোর্ড দিয়ে পরীক্ষা করার অভ্যাস চাই — চোখ যা দেখে না, টুল তা দেখায়।

প্র ০২HTML5-এর “document outline algorithm” কী ছিল, আর সেটি কেন ব্যর্থ হলো?

HTML5-এর প্রথম দিকের খসড়ায় একটি সুন্দর ধারণা ছিল। প্রতিটি section, article, aside আর nav নিজের একটি “স্তর” তৈরি করবে। আপনি যেকোনো জায়গায় শুধু h1 লিখবেন, আর ব্রাউজার বুঝে নেবে কোনটি আসলে দ্বিতীয় বা তৃতীয় স্তরের শিরোনাম। সুবিধা ছিল স্পষ্ট: একটি খবরের component যেকোনো পাতায় বসালে তার heading নিজে থেকে সঠিক স্তরে চলে যেত।

কিন্তু সমস্যা হলো, কোনো ব্রাউজারই এই নিয়ম accessibility tree-তে চালু করেনি, আর screen reader-ও না। ব্রাউজারগুলো শুধু চেহারায় একটু বদল এনেছিল — section-এর ভেতরের h1-কে ছোট অক্ষরে দেখাত। ফলে লাখো ডেভেলপার “HTML5-এ সব জায়গায় h1 চলে” শুনে তা-ই করলেন, আর screen reader ব্যবহারকারীরা পেলেন এমন পাতা যেখানে ত্রিশটি শিরোনাম, সবগুলো “heading level 1” — রূপরেখা বলে কিছুই রইল না। চেহারা আর অর্থের মধ্যে এক অদ্ভুত ফাঁক তৈরি হলো।

বছরের পর বছর অ্যাক্সেসিবিলিটি বিশেষজ্ঞরা সতর্ক করেছেন যে outline algorithm একটি “কাল্পনিক” নিয়ম। শেষ পর্যন্ত ২০২২ সালে WHATWG নিয়মটি spec থেকে মুছে ফেলে, আর heading-এর স্তর নির্ধারণ করা হয় শুধু h1–h6 সংখ্যা দিয়ে। এরপর ব্রাউজারগুলোও section-এর ভেতরের h1 ছোট করে দেখানোর পুরোনো ডিফল্ট স্টাইল সরিয়ে নিতে শুরু করে।

এই গল্পের আরেকটি শিক্ষা আছে: ওয়েবের নিয়ম শুধু কাগজে লিখলেই হয় না — ব্রাউজার আর সহায়ক প্রযুক্তি বাস্তবে যা করে, সেটাই আসল নিয়ম। WHATWG-এর “living standard” দর্শন ঠিক এ কারণেই — spec বাস্তবতার সাথে মিলিয়ে বদলায়।

মূল উপলব্ধি: section কাঠামো দেয়, স্তর দেয় না। heading-এর সংখ্যা নিজে ঠিক করুন — পাতায় একটি h1, তারপর ক্রম মেনে h2, h3. আর কোনো “জাদুর নিয়ম” শুনলে জিজ্ঞেস করুন: ব্রাউজার আর screen reader কি আসলে এটা করে?

প্র ০৩<div role="navigation"> আর <nav> — দুটোই তো navigation landmark দেয়; তাহলে পার্থক্য কোথায়?

Accessibility tree-তে ফল প্রায় একই — দুটোই navigation landmark. কিন্তু পথ আর ঝুঁকি আলাদা।

ইতিহাস দিয়ে শুরু করি। WAI-ARIA-র landmark role (banner, navigation, main, contentinfo…) HTML5-এর element আসার সময়েই তৈরি হচ্ছিল, আর কিছু screen reader সেগুলো আগেই চিনত। তাই একসময় পরামর্শ ছিল দুটোই লেখা: <nav role="navigation">, <main role="main"> — যাতে পুরোনো ব্রাউজার element না চিনলেও role থেকে landmark পায়। সেটি তখনকার সময়ের জন্য যুক্তিসঙ্গত ছিল। আজ সব আধুনিক ব্রাউজার element থেকেই role দেয়, তাই বাড়তি role অপ্রয়োজনীয় — W3C validator এখন এ নিয়ে সতর্ক করে।

ARIA-র প্রথম নিয়ম বলে: যে কাজের জন্য নিজস্ব HTML element আছে, সেটাই ব্যবহার করুন। কারণগুলো বাস্তব:

  • role একটি attribute — কপি-পেস্টে হারায়, বানান ভুল হয় (role="navigaton" লিখলে কিছুই হয় না, কোনো error-ও আসে না)।
  • কোড পড়তে <nav> অনেক পরিষ্কার; CSS-এ nav a লেখাও সহজ।
  • নিজস্ব element-এর সাথে ব্রাউজারের ভবিষ্যৎ সুবিধাও আসে — যেমন Reader mode বা অনুবাদ টুল element দেখে পাতার অংশ চেনে, সবাই ARIA পড়ে না।

তাহলে ARIA role কখন? যখন HTML-এ উপযুক্ত element নেই, বা কোনো কারণে element বদলানো যায় না — যেমন একটি পুরোনো CMS-এর টেমপ্লেট যার HTML আপনি বদলাতে পারেন না। <search> আসার আগে role="search" ছিল এর ভালো উদাহরণ।

মূল উপলব্ধি: ARIA হলো মেরামতের যন্ত্র, প্রথম পছন্দ নয়। ঠিক element লিখলে role, আচরণ আর পাঠযোগ্যতা — তিনটিই বিনামূল্যে পাওয়া যায়। ARIA-র পুরো আলোচনা পর্ব ১২-এ।

প্র ০৪Semantic HTML কি সার্চ ইঞ্জিনে র‍্যাংক বাড়ায়? AI-চালিত সার্চ আর টুলের যুগে এর গুরুত্ব কি বাড়ছে না কমছে?

সৎ উত্তর হলো — শুধু <article> লিখলেই র‍্যাংক বেড়ে যাবে, এমন কোনো সরল নিয়ম কোনো সার্চ ইঞ্জিন কখনো বলেনি। র‍্যাংক নির্ভর করে লেখার মান, প্রাসঙ্গিকতা, গতি, লিংক আর আরও অনেক কিছুর ওপর। “সব div-কে section বানাও, র‍্যাংক বাড়বে” — এ ধরনের পরামর্শ ভুল।

কিন্তু পরোক্ষ লাভ অনেক বড়। একটি যন্ত্র পাতা পড়তে এলে তাকে আগে বুঝতে হয়, এই পাতার আসল লেখা কোনটি আর কোনটি মেনু-বিজ্ঞাপন-পাদদেশ। ব্রাউজারের Reader mode, পরে পড়ার জন্য লেখা সংরক্ষণের অ্যাপ, অনুবাদ টুল, ভয়েস অ্যাসিস্ট্যান্ট — সবাই এই “মূল লেখা খোঁজা”র কাজ করে। <main> আর <article> থাকলে কাজটি সহজ ও নির্ভুল; div-soup-এ যন্ত্রকে অনুমান করতে হয়, আর অনুমান ভুল হলে মেনুর লেখাও “খবর” হিসেবে ধরা পড়ে।

AI-চালিত সার্চ আর ওয়েব-পড়া AI এজেন্টের যুগে এই প্রশ্ন আরও গুরুত্বপূর্ণ। এসব টুল পাতা পড়ে সারাংশ বানায়, উত্তর দেয়, কখনো পাঠকের হয়ে বোতাম চাপে। পরিষ্কার কাঠামো, সঠিক heading, নামসহ landmark আর আসল <button> থাকলে যন্ত্র পাতাটি মানুষের মতোই ঠিকভাবে বুঝতে পারে। মজার ব্যাপার, screen reader-এর জন্য যা ভালো, যন্ত্রের জন্যও প্রায় সবসময় তা-ই ভালো — দুজনেই পাতা “দেখে” না, পড়ে।

আর একটি সরাসরি লাভ: semantic কাঠামো কোডকে পরিষ্কার রাখে। ছয় মাস পরে নিজের কোড খুলে <div class="wrapper-inner-2">-এর বদলে <main> দেখলে আপনিই দ্রুত বুঝবেন। (SEO-এর বাকি দিক পর্ব ১৩-এ।)

মূল উপলব্ধি: Semantic HTML কোনো র‍্যাংকের জাদু নয়; এটি পাতাকে মানুষ ও যন্ত্র — সব পাঠকের কাছে পড়ার যোগ্য করার ভিত্তি। পাঠক যত বেশি যন্ত্র হচ্ছে, ভিত্তির দাম তত বাড়ছে।

প্র ০৫React-এর মতো single-page অ্যাপে একটি পাতার ভেতরেই “পাতা” বদলায় — সেখানে main, landmark আর skip link কীভাবে সামলাবেন?

সাধারণ ওয়েবসাইটে লিংকে চাপলে ব্রাউজার নতুন পাতা লোড করে: focus যায় পাতার শুরুতে, screen reader নতুন title পড়ে, skip link আবার প্রথম Tab-এ পাওয়া যায়। Single-page অ্যাপে (SPA) JavaScript শুধু main-এর ভেতরের অংশ বদলায় — ব্রাউজার নতুন পাতা লোড করে না। ফলে কয়েকটি সমস্যা দেখা দেয়:

  • শ্রোতা জানেনই না পাতা বদলেছে। চোখে দেখা মানুষ নতুন লেখা দেখেন, কিন্তু screen reader নীরব থাকে; focus হয়তো রয়ে গেছে মেনুর সেই লিংকে, যা এখন আর প্রাসঙ্গিক নয়।
  • title বদলায় না: ব্রাউজারের ট্যাবে সব “পাতার” একই নাম — ইতিহাস আর বুকমার্কে বিভ্রান্তি।

প্রচলিত সমাধানগুলো এই পর্বের ধারণার ওপরেই দাঁড়ায়: নতুন অংশ আসার পর JavaScript দিয়ে document.title বদলানো, আর focus সরিয়ে দেওয়া main-এর নতুন h1-এ বা tabindex="-1" দেওয়া main-এ — ঠিক যেমন skip link করে। অনেক router লাইব্রেরি এখন এটি নিজে থেকেই করে বা করার উপায় দেয়। আর কিছু অ্যাপ কয়েকটি view একসাথে DOM-এ রাখে; তখন WHATWG নিয়ম মনে রাখুন — দৃশ্যমান main একটিই, বাকিগুলো hidden.

Landmark-এর কাঠামো (header, nav, main, footer) সাধারণত পুরো অ্যাপের “খোলস”-এ একবার লেখা হয়, আর প্রতিটি view শুধু main-এর ভেতরের অংশ দেয়। এখানেই component-ভিত্তিক কাজের একটি ফাঁদ: প্রতিটি component নিজের <main> বা <header> নিয়ে এলে একসাথে বসানোর পর দুটি main, তিনটি banner হয়ে যায়। তাই খোলস আর component-এর দায়িত্ব আগে থেকে ঠিক করা চাই।

নতুন একটি ব্রাউজার feature, View Transitions (পর্ব ৩৭), পাতা বদলের সময় মসৃণ অ্যানিমেশন দেয় — কিছু ক্ষেত্রে এতে আসল একাধিক-পাতার সাইটেই SPA-র মতো অনুভূতি পাওয়া যায়, আর তখন ব্রাউজারের স্বাভাবিক focus ও title আচরণ বজায় থাকে।

মূল উপলব্ধি: প্রযুক্তি যত জটিলই হোক, প্রশ্ন একই — পাঠক কি জানেন তিনি কোথায় আছেন, আর মূল অংশে এক চাপে পৌঁছাতে পারেন কি না। Semantic কাঠামো সেই প্রশ্নের উত্তরের ভিত্তি; JavaScript শুধু সেটি বজায় রাখে।

অনুশীলন

প্রথম তিনটিতে কোড লিখতে হবে না — ভাবা আর দেখাই আসল কাজ। চতুর্থটিতে একটি ছোট পাতার কাঠামো বদলাবেন।

  1. কোন অংশে কোন element? একটি খবরের সাইটের পাতা: (ক) ওপরে লোগো আর তারিখ (খ) বিভাগের মেনু — জাতীয়, খেলা, বিনোদন (গ) মূল খবর (ঘ) খবরের ভেতরে “ঘটনাপ্রবাহ” নামে শিরোনামসহ একটি ভাগ (ঙ) খবরের নিচে পাঠকের প্রতিটি মন্তব্য (চ) ডান পাশে “সর্বশেষ” খবরের বক্স (ছ) একদম নিচে সম্পাদকের নাম আর অফিসের ফোন নম্বর।

    (ক) পাতার সরাসরি <header> — banner. (খ) <nav aria-label="বিভাগ">, ভেতরে <ul>. (গ) <main>-এর ভেতরে একটি <article>. (ঘ) সেই article-এর ভেতরে <section> আর তার <h2>. (ঙ) প্রতিটি মন্তব্য একটি করে <article>, সবগুলো একটি “মন্তব্য” শিরোনামের section-এ। (চ) <aside aria-label="সর্বশেষ"> — complementary. (ছ) পাতার <footer> — contentinfo, আর ফোন নম্বরসহ যোগাযোগের অংশ <address>, কারণ এটি সাইটের মালিকের সাথে যোগাযোগের তথ্য।

  2. বাস্তব সাইটে landmark গুনুন: আপনার পছন্দের যেকোনো বড় বাংলাদেশি খবরের সাইট বা অনলাইন দোকান খুলুন। DevTools-এর Accessibility pane-এ “Enable full-page accessibility tree” চালু করে দেখুন — banner, navigation, main, contentinfo আছে কি? main কয়টি? একই ধরনের nav-গুলোর আলাদা নাম আছে কি?

    ফল সাইটভেদে আলাদা হবে, আর সেটাই শিক্ষা। কিছু সাইটে পূর্ণ কাঠামো পাবেন। অনেক সাইটে দেখবেন main নেই — পুরো পাতা generic div-এর গাছ; কোথাও তিন-চারটি নামহীন navigation, যেগুলো শ্রোতা আলাদা করতে পারবেন না; আবার কোথাও article-এর ভেতরের header ভুল করে banner হয়েছে কারণ নির্মাতা role="banner" হাতে বসিয়েছেন। এরপর Tab চেপে দেখুন skip link আছে কি না। আপনার পর্যবেক্ষণ লিখে রাখুন — এটিই একটি ছোট অ্যাক্সেসিবিলিটি অডিট, যা ফ্রিল্যান্স কাজে বা ইন্টারভিউতে দেখানোর মতো দক্ষতা।

  3. ভুল খুঁজুন: একটি পাতার কোডে আছে — (ক) পাতার শুরুতে <main> আর খবরের ভেতরে আরেকটি <main> (খ) কার্ডগুলো পাশাপাশি বসানোর মোড়ক <section class="grid">, শিরোনাম নেই (গ) পাদদেশের প্রতিটি দুই লিংকের দলে আলাদা <nav> (ঘ) খবরে লেখা “দুর্ঘটনাটি ঘটে যাত্রাবাড়ীতে” — পুরোটা <address>-এ (ঙ) skip link-এ display: none.

    (ক) দৃশ্যমান main একটিই হতে পারে, আর main article-এর ভেতরে বসতে পারে না — খবরের ভেতরেরটি মুছুন, খবর থাকবে article হিসেবে। (খ) সাজানোর মোড়ক — <div class="grid"> লিখুন (কার্ডগুলো যদি তালিকা হয়, <ul>-ও ভালো)। (গ) nav শুধু বড়, প্রধান লিংকের দলের জন্য; পাদদেশের ছোট লিংকগুলো একটি <nav aria-label="পাদদেশের লিংক">-এ রাখুন, বা nav ছাড়াই <ul>-এ। (ঘ) এটি ঘটনার জায়গা, যোগাযোগের তথ্য নয় — সাধারণ <p>. (ঙ) display: none দিলে লিংক focus পায় না; পর্দার বাইরে সরিয়ে রেখে :focus-এ ফিরিয়ে আনুন।

  4. div-soup থেকে semantic: নিচের ব্লগ-পাতাটি শুধু div দিয়ে লেখা: div.top (সাইটের নাম), div.links (৩টি মেনু লিংক), div.post (শিরোনাম, তারিখ, লেখা, নিচে ট্যাগ), div.side (“জনপ্রিয় লেখা”), div.bottom (কপিরাইট)। এটিকে semantic বানান, শুরুতে skip link দিন।

    একটি সম্ভাব্য উত্তর — এডিটরে চালিয়ে দেখুন, আর নিজের সমাধানের সাথে মেলান:

    <a href="#main">মূল অংশে যান</a>
    <header><b>আমার কোডিং ডায়েরি</b></header>
    <nav aria-label="প্রধান মেনু">
      <ul>
        <li><a href="#home">হোম</a></li>
        <li><a href="#posts">সব লেখা</a></li>
        <li><a href="#about">পরিচিতি</a></li>
      </ul>
    </nav>
    <main id="main" tabindex="-1">
      <article>
        <header>
          <h1>প্রথম ওয়েবসাইট প্রকাশের গল্প</h1>
          <p><time datetime="2026-05-10">১০ মে ২০২৬</time></p>
        </header>
        <p>অনেক দিনের চেষ্টার পর আজ সাইটটি অনলাইনে এল…</p>
        <footer><p>ট্যাগ: <a href="#t1">HTML</a>, <a href="#t2">হোস্টিং</a></p></footer>
      </article>
    </main>
    <aside aria-label="জনপ্রিয় লেখা">
      <h2>জনপ্রিয় লেখা</h2>
      <ul><li><a href="#p1">VS Code সেটআপ</a></li></ul>
    </aside>
    <footer><p><small>© ২০২৬ আমার কোডিং ডায়েরি</small></p></footer>

    চেহারা প্রায় আগের মতোই, কিন্তু এখন landmark: banner, navigation “প্রধান মেনু”, main, complementary “জনপ্রিয় লেখা”, contentinfo. লেখার header আর footer article-এর ভেতরে, তাই সেগুলো landmark নয়। চেষ্টা করুন: aside-কে main-এর ভেতরে, article-এর পরে সরিয়ে দেখুন — দুটোই বৈধ; সিদ্ধান্ত নিন “জনপ্রিয় লেখা” এই পাতার নিজস্ব বিষয়, নাকি পুরো সাইটের।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি সাধারণ ওয়েবপেজের <body>-এর ভেতরের অংশগুলো কোডে যে ক্রমে থাকে, সেভাবে সাজান (▲▼ চেপে সরান)

  1. Skip link — “মূল অংশে যান”
  2. <header> — লোগো আর খোঁজার ঘর
  3. <nav> — প্রধান মেনু
  4. <main> — পাতার আসল বিষয়
  5. <footer> — কপিরাইট আর যোগাযোগ

WHATWG HTML নিয়মে একটি ডকুমেন্টে hidden attribute ছাড়া কয়টি <main> element থাকতে পারে?

  • দুটি — একটি পাতার ওপরে, একটি নিচে
  • সর্বোচ্চ একটি
  • প্রতিটি article-এ একটি করে
  • যত খুশি, কোনো সীমা নেই

একটি ব্লগ পোস্টের নিচে পাঠকদের প্রতিটি মন্তব্য কোন element-এ রাখা সবচেয়ে উপযুক্ত?

  • <aside>
  • <div>
  • <article>
  • <nav>

একটি <article>-এর ভেতরে থাকা <header> accessibility tree-তে কী হয়?

  • এটি banner landmark হয় না — শুধু article-এর মাথার অংশ
  • এটিও পাতার banner landmark হয়
  • এটি নিয়মবিরুদ্ধ, ব্রাউজার মুছে ফেলে
  • এটি main landmark হয়

তিনটি কার্ডকে CSS দিয়ে পাশাপাশি সাজাতে একটি মোড়ক লাগবে; মোড়কটির কোনো শিরোনাম বা নিজস্ব বিষয় নেই। কোন element সঠিক?

  • <section>
  • <article>
  • <main>
  • <div>

HTML-এর <search> element সম্পর্কে কোনটি সঠিক?

  • এটি <form>-এর বদলে ব্যবহার হয়, ফর্ম আর লাগে না
  • খোঁজা বা ছাঁকার কন্ট্রোলকে মুড়ে search landmark তৈরি করে
  • এটি নিজে থেকে একটি খোঁজার ঘর আঁকে
  • এটি কাজ করতে role="search" লিখতেই হয়

“মূল অংশে যান” skip link তৈরির সঠিক উপায় কোনটি?

  • লিংকটিকে display: none দিয়ে সব সময় লুকিয়ে রাখা
  • পাতার একদম শেষে main-এর লিংক রাখা
  • পাতার প্রথম লিংক হিসেবে href="#main", যা focus পেলে দৃশ্যমান হয়
  • একটি div-এ onclick দিয়ে স্ক্রল করানো

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. div-soup চোখে ঠিক, অর্থে শূন্য; পাতার বড় অংশে header, nav, main, aside, footer, search — এরাই landmark তৈরি করে।
  2. দৃশ্যমান <main> একটিই, article/aside/header/footer/nav-এর বাইরে; বারবার আসা অংশ main-এর বাইরে।
  3. একা দাঁড়ায় — article; শিরোনামসহ বিষয়ের ভাগ — section; শুধু সাজানো — div. section দিলে heading-এর স্তর বদলায় না।
  4. article-এর ভেতরের header/footer landmark নয়; figure নিজে-সম্পূর্ণ চিত্র, address শুধু যোগাযোগের তথ্য; একই ধরনের landmark একাধিক হলে নাম দিন।
  5. পাতার প্রথম লিংক skip link; যাচাই করুন DevTools-এর Accessibility pane, validator আর শুধু কি-বোর্ড দিয়ে।

পরের পর্বে: পাতার কাঠামো তৈরি; এবার তাকে ইন্টারঅ্যাকটিভ করে তুলবেন — কোনো JavaScript ছাড়াই। খোলা-বন্ধ হওয়া details, পর্দার ওপরে আসা dialog আর নতুন popover — HTML নিজেই কতটা ইন্টারঅ্যাকটিভ হতে পারে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান