किसी वेबसाइट के लिए मुख्य नेविगेशन बनाना

इस ट्यूटोरियल में, किसी वेबसाइट का मुख्य नेविगेशन बनाने का तरीका बताया गया है. इस लेख में, सेमैंटिक एचटीएमएल, सुलभता, और ARIA एट्रिब्यूट के इस्तेमाल से होने वाले फ़ायदों और नुकसानों के बारे में बताया गया है.

Manuel Matuzović
Manuel Matuzović

शैली, काम करने के तरीके, और बुनियादी मार्कअप और सिमैंटिक जानकारी के हिसाब से किसी वेबसाइट का मुख्य नेविगेशन बनाने के कई तरीके हैं. अगर लागू करने का तरीका बहुत आसान है, तो ज़्यादातर लोगों के लिए यह काम करेगा. हालांकि, हो सकता है कि उपयोगकर्ता अनुभव (यूएक्स) अच्छा न हो. अगर इसे ज़रूरत से ज़्यादा जटिल बनाया गया है, तो हो सकता है कि उपयोगकर्ता भ्रमित हो जाएं या वे इसे ऐक्सेस न कर पाएं.

ज़्यादातर वेबसाइटों के लिए, आप कुछ ऐसा बनाना चाहते हैं जो न तो बहुत आसान है और न ही बहुत जटिल.

परत दर परत बनाना

इस ट्यूटोरियल में, सबसे पहले बुनियादी सेटअप से शुरुआत की जाती है. इसके बाद, धीरे-धीरे सुविधाएं जोड़ी जाती हैं. ऐसा तब तक किया जाता है, जब तक कि ज़्यादा से ज़्यादा उपयोगकर्ताओं को पसंद आने वाली जानकारी, स्टाइल, और फ़ंक्शन न मिल जाएं. प्रोग्रेसिव एन्हैंसमेंट के सिद्धांत का इस्तेमाल करें. इसके तहत, सबसे बुनियादी और मज़बूत समाधान के साथ शुरुआत की जाती है और सुविधाओं की लेयर जोड़ी जाती हैं. अगर कोई एक लेयर किसी वजह से काम नहीं करती, तो भी नेविगेशन अब भी काम करेगा. ऐसा इसलिए, क्योंकि यह बुनियादी लेयर पर वापस आ जाता है.

बुनियादी स्ट्रक्चर

बुनियादी नेविगेशन के लिए, आपको दो चीज़ों की ज़रूरत होती है: <a> एलिमेंट और सीएसएस की कुछ लाइनें, ताकि आपके लिंक की डिफ़ॉल्ट स्टाइल और लेआउट को बेहतर बनाया जा सके.

<a href="/home">Home</a>
<a href="/about-us">About us</a>
<a href="/pricing">Pricing</a>
<a href="/contact">Contact</a>
/* Define variables for your colors */
:root {
  --color-shades-dark: rgb(25, 25, 25);
}

/* Use the alternative box model
Details: <https://web.dev/learn/css/box-model/> */
*{
  box-sizing: border-box;
}

/* Basic font styling */
body {
  font-family: Segoe UI, system-ui, -apple-system, sans-serif;
  font-size: 1.6rem;
}

/* Link styling */
a {
  --text-color: var(--color-shades-dark);
  border-block-end: 3px solid var(--border-color, transparent);
  color: var(--text-color);
  display: inline-block;
  margin-block-end: 0.5rem; /* See note at the bottom of this chapter */
  margin-inline-end: 0.5rem;
  padding: 0.1rem;
  text-decoration: none;
}

/* Change the border-color on :hover and :focus */
a:where(:hover, :focus) {
  --border-color: var(--text-color);
}
CodePen पर पहला चरण: बेसिक एचटीएमएल और सीएसएस" देखें.

यह ज़्यादातर उपयोगकर्ताओं के लिए अच्छा काम करता है. भले ही, वे साइट को किसी भी तरह से ऐक्सेस कर रहे हों. नेविगेशन को माउस, कीबोर्ड, टच डिवाइस या स्क्रीन रीडर की मदद से ऐक्सेस किया जा सकता है. हालांकि, इसमें सुधार की ज़रूरत है. इस बुनियादी पैटर्न को ज़्यादा सुविधाओं और जानकारी के साथ बढ़ाकर, अनुभव को बेहतर बनाया जा सकता है.

यहां बताया गया है कि आपको क्या करना है:

  • ऐक्टिव पेज को हाइलाइट करें.
  • स्क्रीन रीडर का इस्तेमाल करने वाले लोगों को आइटम की संख्या बताएं.
  • लैंडमार्क जोड़ें और स्क्रीन रीडर इस्तेमाल करने वाले लोगों को शॉर्टकट का इस्तेमाल करके, नेविगेशन को सीधे ऐक्सेस करने की अनुमति दें.
  • छोटे व्यूपोर्ट पर नेविगेशन छिपाएं.
  • फ़ोकस की स्टाइल को बेहतर बनाएं.

चालू पेज को हाइलाइट करना

ऐक्टिव पेज को हाइलाइट करने के लिए, उससे जुड़े लिंक में क्लास जोड़ी जा सकती है.

<a href="/about-us" class="active-page">About us</a>

इस अप्रोच में समस्या यह है कि यह सिर्फ़ ऐसी जानकारी देता है जो विज़ुअल तौर पर ऐक्टिव है. स्क्रीन रीडर का इस्तेमाल करने वाला कोई अंधा व्यक्ति, चालू पेज और दूसरे पेजों के बीच का फ़र्क़ नहीं बता सका. सौभाग्य से, ऐक्सेस किए जा सकने वाले रिच इंटरनेट ऐप्लिकेशन (एआरआईए) स्टैंडर्ड, इस जानकारी को सेमेटिक तरीके से भी बताने का एक तरीका उपलब्ध कराता है. क्लास के बजाय, aria-current="page" एट्रिब्यूट और वैल्यू का इस्तेमाल करें.

aria-current (स्टेटस), उस एलिमेंट को दिखाता है जो किसी कंटेनर या मिलते-जुलते एलिमेंट के सेट में मौजूद मौजूदा आइटम को दिखाता है. पेज का एक टोकन, जिसका इस्तेमाल पेजेशन लिंक के सेट में किसी लिंक को दिखाने के लिए किया जाता है. इसमें लिंक को विज़ुअल स्टाइल दिया जाता है, ताकि मौजूदा पेज को दिखाया जा सके. [Accessible Rich Internet Applications (WAI-ARIA) 1.1](https://www.w3.org/TR/wai-aria/#aria-current)

इस अतिरिक्त एट्रिब्यूट की मदद से स्क्रीन रीडर, सिर्फ़ "लिंक, हमारे बारे में जानकारी" के बजाय "मौजूदा पेज, लिंक, हमारे बारे में जानकारी" जैसी जानकारी देता है.

<a href="/about-us" aria-current="page" class="active-page">About us</a>

इसका एक फ़ायदा यह है कि इस एट्रिब्यूट का इस्तेमाल करके, सीएसएस में चालू लिंक को चुना जा सकता है. इससे active-page क्लास का इस्तेमाल बंद हो जाता है.

<a href="/home">Home</a>
<a href="/about-us" aria-current="page">About us</a>
<a href="/pricing">Pricing</a>
<a href="/contact">Contact</a>
/* Change border-color and color for the active page */
[aria-current="page"] {
  --border-color: var(--color-highlight);
  --text-color: var(--color-highlight);
}
दूसरा चरण: CodePen पर चालू पेज को हाइलाइट करना देखें.

आइटम की संख्या बताना

नेविगेशन को देखकर, सामान्य उपयोगकर्ता यह बता सकते हैं कि इसमें सिर्फ़ चार लिंक हैं. स्क्रीन रीडर का इस्तेमाल करने वाला कोई अंधा व्यक्ति, यह जानकारी तुरंत नहीं पा सकता. उन्हें लिंक की पूरी सूची में से अपना काम करना पड़ सकता है. अगर सूची छोटी है, तो हो सकता है कि यह समस्या न हो. हालांकि, अगर इसमें 40 लिंक हैं, तो यह काम मुश्किल हो सकता है. अगर स्क्रीन रीडर का इस्तेमाल करने वाले व्यक्ति को पहले से पता है कि नेविगेशन में कई लिंक हैं, तो वह साइट खोज जैसे किसी दूसरे और ज़्यादा असरदार तरीके का इस्तेमाल कर सकता है.
आइटम की संख्या को पहले से बताने का एक अच्छा तरीका है, हर लिंक को सूची के आइटम (<li>) में लपेटना और उसे बिना क्रम वाली सूची (<ul>) में नेस्ट करना.

<ul>
  <li>
     <a href="/home">Home</a>
  </li>
  <li>
    <a href="/about-us" aria-current="page">About us</a>
  </li>
  <li>
    <a href="/pricing">Pricing</a>
  </li>
  <li>
    <a href="/contact">Contact</a>
  </li>
</ul>

जब स्क्रीन रीडर का इस्तेमाल करने वाले व्यक्ति को सूची मिलती है, तो उसका सॉफ़्टवेयर "सूची, चार आइटम" जैसा कुछ बोलेगा.

यहां Windows पर स्क्रीन रीडर NVDA के साथ इस्तेमाल किए जाने वाले नेविगेशन का डेमो दिया गया है.

अब आपको स्टाइल में बदलाव करके, उसे पहले जैसा बनाना होगा.

/* Remove the default list styling and create a flexible layout for the list */
ul {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

/* Basic link styling */
a {
  --text-color: var(--color-shades-dark);

  border-block-end: 3px solid var(--border-color, transparent);
  color: var(--text-color);
  padding: 0.1rem;
  text-decoration: none;
}

स्क्रीन रीडर का इस्तेमाल करने वाले लोगों के लिए, सूचियों का इस्तेमाल करने के कई फ़ायदे हो सकते हैं:

  • आइटम से इंटरैक्ट करने से पहले, उन्हें आइटम की कुल संख्या का पता चल सकता है.
  • वे सूची के एक आइटम से दूसरे आइटम पर जाने के लिए, शॉर्टकट का इस्तेमाल कर सकते हैं.
  • वे एक सूची से दूसरी सूची पर जाने के लिए, शॉर्टकट का इस्तेमाल कर सकते हैं.
  • स्क्रीन रीडर, मौजूदा आइटम का इंडेक्स बोल सकता है. उदाहरण के लिए, "सूची का आइटम, चार में से दो".

इसके अलावा, अगर पेज को सीएसएस के बिना दिखाया जाता है, तो सूची में ये लिंक सिर्फ़ लिंक के ढेर के बजाय, आइटम के एक साथ दिखने वाले ग्रुप के तौर पर दिखते हैं.

Safari में VoiceOver के बारे में एक अहम जानकारी यह है कि list-style: none सेट करने पर, आपको ये सभी फ़ायदे नहीं मिलेंगे. ऐसा डिज़ाइन के हिसाब से होता है. WebKit टीम ने सूची के सिमैंटिक को हटाने का फ़ैसला किया, जब कोई सूची सूची की तरह नहीं दिखती. आपके नेविगेशन की जटिलता के आधार पर, यह समस्या हो सकती है या नहीं. हालांकि, नेविगेशन की सुविधा अब भी इस्तेमाल की जा सकती है. साथ ही, इसका असर सिर्फ़ Safari में VoiceOver पर पड़ता है. Chrome या Firefox के साथ VoiceOver, आइटम की संख्या के साथ-साथ NVDA जैसे अन्य स्क्रीन रीडर की जानकारी भी देता है. दूसरी ओर, कुछ स्थितियों में सेमैनटिक जानकारी काफ़ी काम की हो सकती है. यह फ़ैसला लेने के लिए, आपको स्क्रीन रीडर का इस्तेमाल करने वाले लोगों के साथ नेविगेशन की जांच करनी चाहिए और उनसे सुझाव या राय लेनी चाहिए. अगर आपको Safari में VoiceOver को अन्य सभी स्क्रीन रीडर की तरह काम करना है, तो <ul> पर ARIA की सूची की भूमिका को साफ़ तौर पर सेट करके, इस समस्या को हल किया जा सकता है. इससे, सूची की स्टाइल हटाने से पहले की स्थिति में वापस आ जाता है. हालांकि, सूची अब भी वैसी ही दिखती है.

<ul role="list">
  <li>
     <a href="/home">Home</a>
  </li>
  ...
</ul>
तीसरा चरण: CodePen पर आइटम की संख्या दिखाना देखें.

लैंडमार्क जोड़ें

आपने कम ही कोशिशों में, स्क्रीन रीडर इस्तेमाल करने वाले लोगों के लिए काफ़ी सुधार किए हैं. हालांकि, एक और चीज़ की जा सकती है. नेविगेशन अब भी सेमेंटिक तौर पर सिर्फ़ लिंक की सूची है और यह बताना मुश्किल है कि यह खास सूची आपकी वेबसाइट का मुख्य नेविगेशन है. <ul> को <nav> एलिमेंट में रैप करके, इस सामान्य सूची को नेविगेशनल सूची में बदला जा सकता है.

<nav> एलिमेंट का इस्तेमाल करने के कई फ़ायदे हैं. खास तौर पर, जब कोई उपयोगकर्ता स्क्रीन रीडर के साथ इंटरैक्ट करता है, तो वह "नेविगेशन" जैसा कुछ बोलता है. साथ ही, वह पेज पर एक लैंडमार्क जोड़ता है. लैंडमार्क, पेज पर मौजूद खास हिस्से होते हैं. जैसे, <header>, <footer> या <main>. स्क्रीन रीडर इन पर जा सकता है. किसी पेज पर लैंडमार्क होना फ़ायदेमंद हो सकता है. इससे स्क्रीन रीडर इस्तेमाल करने वाले लोग, पेज के बाकी हिस्सों से इंटरैक्ट किए बिना, सीधे तौर पर पेज के अहम हिस्सों को ऐक्सेस कर सकते हैं. उदाहरण के लिए, NVDA में D बटन दबाकर, एक लैंडमार्क से दूसरे लैंडमार्क पर जाया जा सकता है. वॉइस ओवर में, VO + U दबाकर पेज पर मौजूद सभी लैंडमार्क की सूची बनाने के लिए, रोटर का इस्तेमाल किया जा सकता है.

चार लैंडमार्क की सूची: बैनर, नेविगेशन, मुख्य, कॉन्टेंट की जानकारी.
VoiceOver में रोटर, जो किसी पेज पर मौजूद सभी लैंडमार्क की सूची दिखाता है.

इस सूची में आपको चार लैंडमार्क दिखते हैं: बैनर, जो <header> एलिमेंट है, नेविगेशन, जो <nav> एलिमेंट है, मुख्य, जो <main> एलिमेंट है, और कॉन्टेंट की जानकारी, जो <footer> एलिमेंट है. यह सूची बहुत लंबी नहीं होनी चाहिए. आपको सिर्फ़ अपने यूज़र इंटरफ़ेस (यूआई) के अहम हिस्सों को लैंडमार्क के तौर पर मार्क करना है. जैसे, साइट खोज, स्थानीय नेविगेशन या पेजेशन.

अगर आपकी साइट पर एक ही पेज पर अलग-अलग जगहों पर नेविगेट करने की सुविधा है, उस पर एक लोकल नेविगेशन दिया गया है, और एक ही पेज पर कोई पेज नंबर डाला गया है, तो आपके पास तीन <nav> एलिमेंट भी हो सकते हैं. यह ठीक है, लेकिन अब नेविगेशन के तीन लैंडमार्क हैं और सेमेंटिक तौर पर, ये सभी एक जैसे दिखते हैं. जब तक पेज के स्ट्रक्चर के बारे में अच्छी तरह से जानकारी न हो, तब तक इन दोनों को अलग-अलग बताना मुश्किल है.

इमेज में तीन लैंडमार्क दिखाए गए हैं, जिन पर &#39;नेविगेशन&#39; लिखा है.
VoiceOver में रोटर, लेबल नहीं किए गए तीन नेविगेशन लैंडमार्क की सूची दिखा रहा है.

उन्हें अलग-अलग दिखाने के लिए, आपको aria-labelledby या aria-label का इस्तेमाल करके उन्हें लेबल करना चाहिए.

<nav aria-label="Main">
    <ul>
      <li>
         <a href="/home">Home</a>
      </li>
      ...
  </ul>
</nav>
...
<nav aria-label="Select page">
    <ul>
      <li>
         <a href="/page-1">1</a>
      </li>
      ...
    </ul>
</nav>

अगर आपने जो लेबल चुना है वह पेज पर पहले से मौजूद है, तो इसके बजाय aria-labelledby का इस्तेमाल करें. साथ ही, id एट्रिब्यूट का इस्तेमाल करके, मौजूदा लेबल का रेफ़रंस दें.

<nav aria-labelledby="pagination_heading">
  <h2 id="pagination_heading">Select a page</h2>
  <ul>
    <li>
       <a href="/page-1">1</a>
    </li>
    ...
  </ul>
</nav>

कम शब्दों में लेबल लिखें. बहुत ज़्यादा शब्दों का इस्तेमाल न करें. "नेविगेशन" या "मेन्यू" जैसे एक्सप्रेशन का इस्तेमाल न करें, क्योंकि स्क्रीन रीडर पहले से ही उपयोगकर्ताओं को यह जानकारी देता है.

लैंडमार्क
VoiceOver में "बैनर", "मुख्य नेविगेशन", "मुख्य", "पेज नेविगेशन", "पेज नेविगेशन चुनें", और "कॉन्टेंट की जानकारी" जैसे लैंडमार्क शामिल किए गए हैं.
चौथा चरण: CodePen पर लैंडमार्क जोड़ना देखें.

छोटे व्यूपोर्ट पर नेविगेशन छिपाना

मुझे छोटे व्यूपोर्ट पर मुख्य नेविगेशन को छिपाने का सुझाव पसंद नहीं है. हालांकि, अगर लिंक की सूची बहुत लंबी हो जाती है, तो कोई और विकल्प नहीं होता. अगर ऐसा है, तो उपयोगकर्ताओं को सूची के बजाय, "मेन्यू" लेबल वाला बटन या बर्गर आइकॉन या दोनों दिखेगा. बटन पर क्लिक करने से सूची दिखती और छिप जाती है. अगर आपके पास JavaScript और CSS की बुनियादी जानकारी है, तो यह काम किया जा सकता है. हालांकि, आपको UX और सुलभता के मामले में कई बातों का ध्यान रखना होगा.

  • आपको सूची को ऐक्सेस करने के तरीके से छिपाना होगा.
  • नेविगेशन ऐसा होना चाहिए जिसे कीबोर्ड ऐक्सेस कर सके.
  • नेविगेशन से यह पता चलना चाहिए कि वह दिख रहा है या नहीं.

बर्गर बटन जोड़ना

प्रोग्रेसिव एन्हांसमेंट के सिद्धांत का पालन करने के लिए, यह पक्का करना ज़रूरी है कि जावास्क्रिप्ट बंद होने पर भी आपका नेविगेशन काम करता रहे और सही तरीके से काम करता रहे.
आपके नेविगेशन में सबसे पहले बर्गर बटन होना चाहिए. इसे टेंप्लेट एलिमेंट में एचटीएमएल में बनाया जाता है, JavaScript में क्लोन किया जाता है, और नेविगेशन में जोड़ा जाता है.

बर्गर बटन दिखाने वाला पेज.
नतीजा: नेविगेशन, लिंक के बजाय छोटे व्यूपोर्ट पर बर्गर बटन दिखाता है.
<nav id="mainnav">
  ...
</nav>

<template id="burger-template">
  <button type="button" aria-expanded="false" aria-label="Menu" aria-controls="mainnav">
    <svg width="24" height="24" aria-hidden="true">
      <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z">
    </svg>
  </button>
</template>
  1. aria-expanded एट्रिब्यूट, स्क्रीन रीडर सॉफ़्टवेयर को बताता है कि बटन जिस एलिमेंट को कंट्रोल करता है वह बड़ा हो गया है या नहीं.
  2. aria-label, बटन को सुलभता नाम देता है. यह बर्गर आइकॉन के लिए टेक्स्ट का विकल्प होता है.
  3. आपने aria-hidden का इस्तेमाल करके, <svg> को सहायक तकनीक से छिपाया है, क्योंकि इसमें पहले से ही aria-label से मिला टेक्स्ट लेबल है.
  4. aria-controls, सहायक टेक्नोलॉजी के बारे में बताता है. यह एट्रिब्यूट, बटन के कंट्रोल के लिए इस्तेमाल होने वाले एट्रिब्यूट (उदाहरण के लिए, JAWS) के साथ काम करता है.
const nav = document.querySelector('#mainnav')
const list = nav.querySelector('ul');
const burgerClone = document.querySelector('#burger-template').content.cloneNode(true);
const button = burgerClone.querySelector('button');

// Toggle aria-expanded attribute
button.addEventListener('click', e => {
  // aria-expanded="true" signals that the menu is currently open
  const isOpen = button.getAttribute('aria-expanded') === "true"
  button.setAttribute('aria-expanded', !isOpen);
});

// Hide list on keydown Escape
nav.addEventListener('keyup', e => {
  if (e.code === 'Escape') {
    button.setAttribute('aria-expanded', false);
  }
});

// Add the button to the page
nav.insertBefore(burgerClone, list);
  1. उपयोगकर्ता जब चाहें, नेविगेशन को बंद कर सकते हैं. जैसे, Escape बटन दबाकर.
  2. appendChild के बजाय insertBefore का इस्तेमाल करना ज़रूरी है, क्योंकि बटन आपके नेविगेशन में पहला एलिमेंट होना चाहिए. अगर कीबोर्ड या स्क्रीन रीडर का इस्तेमाल करने वाला व्यक्ति, बटन पर क्लिक करने के बाद Tab दबाता है, तो उसे सूची में पहले आइटम पर फ़ोकस करना चाहिए. अगर बटन सूची के बाद आता है, तो ऐसा नहीं होगा.

इसके बाद, बटन की डिफ़ॉल्ट स्टाइल को रीसेट करें और पक्का करें कि यह सिर्फ़ छोटे व्यूपोर्ट पर दिखे.

@media (min-width: 48em) {
  nav {
    --nav-button-display: none;
  }
}

/* Reset button styling */
button {
  all: unset;
  display: var(--nav-button-display, flex);
}
पांचवां चरण: CodePen पर बर्गर बटन जोड़ना देखें.

सूची छिपाई जा रही है

सूची को छिपाने से पहले, नेविगेशन और सूची को पोज़िशन और स्टाइल करें, ताकि लेआउट छोटे व्यूपोर्ट के लिए ऑप्टिमाइज़ हो जाए. हालांकि, यह बड़ी स्क्रीन पर भी अच्छा दिखे.
सबसे पहले, <nav> को पेज के नैचुरल फ़्लो से हटाएं और उसे व्यूपोर्ट के सबसे ऊपर कोने में रखें.

@media (min-width: 48em) {
  nav {
    --nav-button-display: none;
    --nav-position: static;
  }
}

nav {
  position: var(--nav-position, fixed);
  inset-block-start: 1rem;
  inset-inline-end: 1rem;
}

इसके बाद, नई कस्टम प्रॉपर्टी (—-nav-list-layout) जोड़कर, छोटे व्यूपोर्ट पर लेआउट बदलें. लेआउट डिफ़ॉल्ट रूप से कॉलम में होता है और बड़ी स्क्रीन पर लाइन में स्विच हो जाता है.

@media (min-width: 48em) {
  nav {
    --nav-button-display: none;
    --nav-position: static;
  }

  ul {
    --nav-list-layout: row;
  }
}

ul {
  display: flex;
  flex-direction: var(--nav-list-layout, column);
  flex-wrap: wrap;
  gap: 1rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

नेविगेशन, छोटे व्यूपोर्ट पर कुछ ऐसा दिखना चाहिए.

नेविगेशन सूची और बर्गर बटन दिखाने वाला पेज.
बर्गर बटन और सूची, दोनों को व्यूपोर्ट के सबसे ऊपरी कोने में रखा गया है.

इस सूची में सीएसएस की ज़रूरत है. हम इसे सबसे ऊपर वाले कोने में ले जाएंगे, ताकि यह पूरी स्क्रीन पर वर्टिकल तौर पर दिखे. इसके बाद, हम background-color और box-shadow लागू करेंगे.

@media (min-width: 48em) {
  nav {
    --nav-button-display: none;
    --nav-position: static;
  }
  
  ul {
    --nav-list-layout: row;
    --nav-list-position: static;
    --nav-list-padding: 0;
    --nav-list-height: auto;
    --nav-list-width: 100%;
    --nav-list-shadow: none;
  }
}

ul {
  background: rgb(255, 255, 255);
  box-shadow: var(--nav-list-shadow, -5px 0 11px 0 rgb(0 0 0 / 0.2));
  display: flex;
  flex-direction: var(--nav-list-layout, column);
  flex-wrap: wrap;
  gap: 1rem;
  height: var(--nav-list-height, 100vh);
  list-style: none;
  margin: 0;
  padding: var(--nav-list-padding, 2rem);
  position: var(--nav-list-position, fixed);
  inset-block-start: 0; /* Logical property. Equivalent to top: 0; */
  inset-inline-end: 0; /* Logical property. Equivalent to right: 0; */
  width: var(--nav-list-width, min(22rem, 100vw));
}

button {
  all: unset;
  display: var(--nav-button-display, flex);
  position: relative;
  z-index: 1;
}

सूची, छोटे व्यूपोर्ट पर कुछ ऐसी दिखनी चाहिए. यह एक साधारण सूची के बजाय, साइडबार की तरह दिखनी चाहिए.

नेविगेशन सूची खुल गई.

आखिर में, सूची को छिपाएं. इसे सिर्फ़ तब दिखाएं, जब उपयोगकर्ता बटन पर एक बार क्लिक करे. जब वह फिर से क्लिक करे, तब उसे छिपाएं. सिर्फ़ सूची को छिपाएं, पूरे नेविगेशन को नहीं. नेविगेशन को छिपाने का मतलब होगा कि आपने किसी अहम लैंडमार्क को भी छिपा दिया है.

आपने पहले, aria-expanded एट्रिब्यूट की वैल्यू को टॉगल करने के लिए, बटन में क्लिक इवेंट जोड़ा था. इस जानकारी का इस्तेमाल, सीएसएस में सूची दिखाने और छिपाने के लिए एक शर्त के तौर पर किया जा सकता है.

@media (min-width: 48em) {
  ul {
    --nav-list-visibility: visible;
  }
}

ul {
  visibility: var(--nav-list-visibility, visible);
}

/* Hide the list on narrow viewports, if it comes after an element with
   aria-expanded set to "false". */
[aria-expanded="false"] + ul {
  visibility: var(--nav-list-visibility, hidden);
}

सूची छिपाने के लिए, opacity: 0 या translateX(100%) के बजाय visibility: hidden या display: none जैसी प्रॉपर्टी के एलान का इस्तेमाल करना ज़रूरी है. इन प्रॉपर्टी से यह पक्का होता है कि नेविगेशन छिपे होने पर, लिंक पर फ़ोकस न किया जा सके. opacity या translate का इस्तेमाल करने पर, कॉन्टेंट दिखना बंद हो जाएगा. इससे लिंक दिखने बंद हो जाएंगे, लेकिन उन्हें कीबोर्ड का इस्तेमाल करके ऐक्सेस किया जा सकेगा. हालांकि, ऐसा करना मुश्किल और परेशानी भरा होगा. visibility या display का इस्तेमाल करने पर, यह विज़ुअल रूप से छिप जाता है और इसे ऐक्सेस नहीं किया जा सकता. इसलिए, यह सभी उपयोगकर्ताओं के लिए छिप जाता है.

छठा चरण: सूची छिपाना देखें.

सूची ऐनिमेट की जा रही है

अगर आपको यह जानना है कि display: none; के बजाय visibility: hidden; का इस्तेमाल क्यों करना चाहिए, तो इसकी वजह यह है कि इसमें विज़िबिलिटी को ऐनिमेट किया जा सकता है. इसकी सिर्फ़ दो स्थितियां होती हैं, hidden और visible. हालांकि, स्लाइड- या फ़ेड-इन इफ़ेक्ट बनाने के लिए, इसे transform या opacity जैसी किसी दूसरी प्रॉपर्टी के साथ जोड़ा जा सकता है. यह display: none के साथ काम नहीं करेगा, क्योंकि डिसप्ले प्रॉपर्टी में ऐनिमेशन नहीं किया जा सकता.

नीचे दिया गया सीएसएस, opacity को फ़ेड-इन और फ़ेड-आउट इफ़ेक्ट बनाने के लिए ट्रांज़िशन करता है.

ul {
  transition: opacity 0.6s linear, visibility 0.3s linear;
  visibility: var(--nav-list-visibility, visible);
}

[aria-expanded="false"] + ul {
  opacity: 0;
  visibility: var(--nav-list-visibility, hidden);
}

अगर आपको ऐनिमेशन के साथ मोशन दिखाना है, तो आपको transition प्रॉपर्टी को prefers-reduced-motion मीडिया क्वेरी में रैप करना चाहिए. ऐसा इसलिए, क्योंकि ऐनिमेशन से कुछ उपयोगकर्ताओं को उल्टी, चक्कर, और सिरदर्द हो सकता है.

ul {
  visibility: var(--nav-list-visibility, visible);
}

@media (prefers-reduced-motion: no-preference) {
  ul {
    transition: transform 0.6s cubic-bezier(.68,-0.55,.27,1.55), visibility 0.3s linear;
  }
}

[aria-expanded="false"] + ul {
  transform: var(--nav-list-transform, translateX(100%));
  visibility: var(--nav-list-visibility, hidden);
}

इससे यह पक्का हो जाता है कि ऐनिमेशन सिर्फ़ उन लोगों को दिखेगा जिन्होंने कम मोशन में विकल्प नहीं चुना है.

सातवां चरण: CodePen पर सूची को ऐनिमेट करना देखें.

फ़ोकस की स्टाइल को बेहतर बनाएं

कीबोर्ड का इस्तेमाल करने वाले लोग, पेज पर ओरिएंटेशन और नेविगेशन के लिए, एलिमेंट के फ़ोकस स्टाइल पर भरोसा करते हैं. डिफ़ॉल्ट फ़ोकस स्टाइल, बिना फ़ोकस वाली स्टाइल (outline: none सेट करने पर ऐसा होता है) से बेहतर होती हैं. हालांकि, उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, ज़्यादा साफ़ तौर पर दिखने वाली कस्टम फ़ोकस स्टाइल का इस्तेमाल करें.

Chrome 103 में, लिंक पर फ़ोकस करने पर डिफ़ॉल्ट तौर पर लागू होने वाली स्टाइल यहां दिखाई गई हैं.

Chrome 103 में फ़ोकस किए गए लिंक के चारों ओर नीले रंग की दो पिक्सल की आउटलाइन.

इसे बेहतर बनाने के लिए, अपनी स्टाइल को अपने हिसाब से रंगें. :focus के बजाय :focus-visible का इस्तेमाल करके, ब्राउज़र को यह तय करने का विकल्प दिया जा सकता है कि फ़ोकस स्टाइल कब दिखाने हैं. :focus स्टाइल सभी को दिखेंगे. इनका इस्तेमाल, माउस, कीबोर्ड, और टच डिवाइस के उपयोगकर्ता कर सकते हैं. भले ही, उन्हें इनकी ज़रूरत न हो. :focus-visible के साथ ब्राउज़र यह तय करने के लिए अंदरूनी अनुभव का इस्तेमाल करता है कि उन्हें सिर्फ़ कीबोर्ड इस्तेमाल करने वालों को दिखाना है या सभी लोगों को.

/* Remove the default :focus outline */
*:focus {
  outline: none;
}

/* Show a custom outline on :focus-visible */
*:focus-visible {
  outline: 2px solid var(--color-shades-dark);
  outline-offset: 4px;
}

:focus-visible के लिए ब्राउज़र की सहायता

ब्राउज़र के इस्तेमाल से जुड़ी सहायता

  • Chrome: 86.
  • Edge: 86.
  • Firefox: 85.
  • Safari: 15.4.

सोर्स

2px की गहरे रंग वाली आउटलाइन के साथ साफ़ तौर पर दिखने वाला विज्ञापन.

आइटम पर फ़ोकस होने पर, उन्हें हाइलाइट करने के अलग-अलग तरीके हैं. outline प्रॉपर्टी का इस्तेमाल करने का सुझाव दिया जाता है, क्योंकि इससे लेआउट नहीं टूटता. ऐसा border के साथ हो सकता है. साथ ही, यह Windows पर हाई कंट्रास्ट मोड के साथ अच्छी तरह से काम करती है. background-color या box-shadow वाली प्रॉपर्टी ठीक से काम नहीं करतीं, क्योंकि हो सकता है कि वे कस्टम कंट्रास्ट सेटिंग के साथ बिलकुल न दिखें.

गहरे रंग के बैकग्राउंड वाली एक साइट, जिसका फ़ोकस बैंगनी रंग में हाइलाइट किया गया है.
देखें कि आठवां चरण: CodePen पर फ़ोकस स्टाइल को बेहतर बनाना.

बधाई हो! आपने बेहतर, सेमैनटिक तौर पर बेहतर, ऐक्सेस करने लायक, और मोबाइल-फ़्रेंडली मेन नेविगेशन बनाया है.

हमेशा कुछ ऐसा होता है जिसे बेहतर बनाया जा सकता है. उदाहरण के लिए:

  • नेविगेशन में फ़ोकस ट्रैप किया जा सकता है या छोटे व्यूपोर्ट पर पेज के बाकी हिस्से को इनऐक्टिव किया जा सकता है.
  • कीबोर्ड इस्तेमाल करने वाले लोग, पेज पर आसानी से नेविगेट कर सकें, इसके लिए पेज में सबसे ऊपर एक स्किप लिंक जोड़ा जा सकता है.

अगर आपको याद है कि इस लेख की शुरुआत कैसे हुई थी, और आपका लक्ष्य "न तो बहुत आसान होना चाहिए, न ही बहुत जटिल होना चाहिए", तो हम यहीं हैं. हालांकि, नेविगेशन की ज़रूरत से ज़्यादा बदलाव करना मुमकिन है.

नेविगेशन और मेन्यू में साफ़ तौर पर अंतर होता है. नेविगेशन, मिलते-जुलते दस्तावेज़ों पर जाने के लिए लिंक का कलेक्शन होता है. मेन्यू, किसी दस्तावेज़ में की जाने वाली कार्रवाइयों का कलेक्शन होता है. कभी-कभी ये टास्क ओवरलैप होते हैं. आपके पास ऐसा नेविगेशन हो सकता है जिसमें कार्रवाई करने वाला बटन भी शामिल हो, जैसे कि मॉडल विंडो खोलना. इसके अलावा, आपके पास ऐसा मेन्यू भी हो सकता है जिसमें कोई कार्रवाई किसी दूसरे पेज पर नेविगेट करती हो, जैसे कि सहायता पेज. जब ऐसा होता है, तो यह ज़रूरी है कि ARIA रोल को मैच न करें, लेकिन अपने कॉम्पोनेंट के मुख्य मकसद की पहचान करें और उसके हिसाब से मार्कअप और रोल चुनें.

<nav> एलिमेंट में नेविगेशन की ARIA भूमिका होती है. इससे यह पता चलता है कि एलिमेंट नेविगेशन है. हालांकि, अक्सर आपको साइटों पर मेन्यू, मेन्यूबार, और मेन्यू आइटम का भी इस्तेमाल दिखता है. हम कभी-कभी इन शब्दों का इस्तेमाल एक-दूसरे के लिए करते हैं. ऐसा इसलिए, क्योंकि हमें लगता है कि स्क्रीन रीडर इस्तेमाल करने वालों के अनुभव को बेहतर बनाने के लिए, इन शब्दों को एक साथ इस्तेमाल करना सही रहेगा. आम तौर पर ऐसा क्यों नहीं होता, यह जानने से पहले इन भूमिकाओं की आधिकारिक परिभाषा पर एक नज़र डालें.

नेविगेशन की भूमिका

दस्तावेज़ या उससे जुड़े दस्तावेज़ों पर नेविगेट करने के लिए, नेविगेशनल एलिमेंट (आम तौर पर लिंक) का कलेक्शन.

नेविगेशन (भूमिका) WAI-ARIA 1.1

मेन्यू की भूमिका

मेन्यू, आम तौर पर उन सामान्य कार्रवाइयों या फ़ंक्शन की सूची होती है जिन्हें उपयोगकर्ता इस्तेमाल कर सकता है. मेन्यू भूमिका तब सही होती है, जब मेन्यू आइटम की सूची, डेस्कटॉप ऐप्लिकेशन के मेन्यू की तरह ही दिखाई जाती है.

मेन्यू (भूमिका) WAI-ARIA 1.1

मेन्यूबार की भूमिका

मेन्यू का ऐसा प्रज़ेंटेशन जो आम तौर पर दिखता रहता है और आम तौर पर हॉरिज़ॉन्टल तौर पर दिखाया जाता है. मेन्यूबार की भूमिका का इस्तेमाल, Windows, Mac, और Gnome डेस्कटॉप ऐप्लिकेशन में मौजूद मेन्यू बार जैसा मेन्यू बार बनाने के लिए किया जाता है. मेन्यू बार का इस्तेमाल, अक्सर इस्तेमाल होने वाले कमांड का एक सेट बनाने के लिए किया जाता है. लेखकों को यह पक्का करना चाहिए कि मेन्यूबार का इंटरैक्शन, डेस्कटॉप ग्राफ़िकल यूज़र इंटरफ़ेस में मेन्यू बार के सामान्य इंटरैक्शन जैसा हो.

menubar (role) WAI-ARIA 1.1

menuitem की भूमिका

मेन्यू या मेन्यूबार में मौजूद विकल्पों के सेट में से कोई विकल्प.

menuitem (role) WAI-ARIA 1.1

यहां दी गई जानकारी पूरी तरह से साफ़ है. दस्तावेज़ या उससे जुड़े दस्तावेज़ों को नेविगेट करने के लिए, नेविगेशन का इस्तेमाल करें. ऐसा सिर्फ़ डेस्कटॉप ऐप्लिकेशन के मेन्यू से मिलती-जुलती कार्रवाइयों या फ़ंक्शन की सूची के लिए करें. अगर आपको Google Docs का नया वर्शन नहीं बनाना है, तो हो सकता है कि आपको मुख्य नेविगेशन के लिए, मेन्यू की किसी भी भूमिका की ज़रूरत न पड़े.

मेन्यू कब सही होता है?

मेन्यू आइटम का मुख्य इस्तेमाल, नेविगेट करने के लिए नहीं, बल्कि कार्रवाइयां करने के लिए किया जाता है. मान लें कि आपके पास डेटा की एक सूची या टेबल है और उपयोगकर्ता, सूची के हर आइटम पर कुछ खास कार्रवाइयां कर सकते हैं. हर लाइन में एक बटन जोड़ा जा सकता है. साथ ही, जब उपयोगकर्ता बटन पर क्लिक करते हैं, तब कार्रवाइयां दिखाई जा सकती हैं.

<ul>
  <li>
    Product 1

    <button aria-expanded="false" aria-controls="options1">Edit</button>

    <div role="menu" id="options1">
      <button role="menuitem">
        Duplicate
      </button>
      <button role="menuitem">
        Delete
      </button>
      <button role="menuitem">
        Disable
      </button>
    </div>
  </li>
  <li>
    Product 2
    ...
  </li>
</ul>

मेन्यू रोल इस्तेमाल करने के असर

इन मेन्यू भूमिकाओं का इस्तेमाल समझदारी से करना बहुत ज़रूरी है, क्योंकि इनसे कई गड़बड़ियां हो सकती हैं.

मेन्यू के लिए, DOM का एक खास स्ट्रक्चर होना ज़रूरी है. menuitem, menu का डायरेक्ट चाइल्ड आइटम होना चाहिए. नीचे दिया गया कोड, सेमेटिक व्यवहार को खराब कर सकता है:

 <!-- Wrong, don't do this -->
<ul role="menu">
  <li>
    <a href="#" role="menuitem">Item 1</a>
  </li>
</ul>

जानकार उपयोगकर्ता उम्मीद करते हैं कि कुछ कीबोर्ड शॉर्टकट मेन्यू और मेन्यू के साथ काम करेंगे. एआरआई एथॉरिंग प्रैक्टिस गाइड (एपीजी) के मुताबिक, इनमें ये शामिल हैं:

  • मेन्यू आइटम चुनने के लिए, Enter और Space का इस्तेमाल करें.
  • आइटम के बीच नेविगेट करने के लिए, ऐरो बटन का इस्तेमाल करें.
  • Home और End बटन का इस्तेमाल करके, फ़ोकस को पहले या आखिरी आइटम पर ले जाएं.
  • a-z, टाइप किए गए वर्ण से शुरू होने वाले लेबल वाले अगले मेन्यू आइटम पर फ़ोकस ले जाने के लिए.
  • मेन्यू बंद करने के लिए, Esc दबाएं.

अगर स्क्रीन रीडर को कोई मेन्यू मिलता है, तो हो सकता है कि सॉफ़्टवेयर ब्राउज़िंग मोड को अपने-आप बदल दे. इससे, ऊपर बताए गए शॉर्टकट का इस्तेमाल किया जा सकेगा. ऐसा हो सकता है कि स्क्रीन रीडर का इस्तेमाल न करने वाले लोग, मेन्यू का इस्तेमाल न कर पाएं, क्योंकि उन्हें इन शॉर्टकट या इन्हें इस्तेमाल करने का तरीका नहीं पता होता.

यह तरीका कीबोर्ड का इस्तेमाल करने वाले उन लोगों के लिए भी लागू होता है जो Shift और Shift + Tab का इस्तेमाल करने की उम्मीद कर सकते हैं.

मेन्यू और मेन्यू बार बनाते समय, आपको कई बातों का ध्यान रखना चाहिए. जैसे, उन्हें सबसे पहले इस्तेमाल करना सही है या नहीं. जब आप कोई सामान्य वेबसाइट बना रहे हों, तो आपको बस सूची और लिंक वाले नेविगेशन एलिमेंट की ज़रूरत होती है. इसमें सिंगल पेज ऐप्लिकेशन (एसपीए) या वेब ऐप्लिकेशन भी शामिल हैं. स्टैक का क्रम मायने नहीं रखता. अगर आपने कोई ऐसा ऐप्लिकेशन नहीं बनाया है जो डेस्कटॉप ऐप्लिकेशन से काफ़ी मिलता-जुलता हो, तो मेन्यू में भूमिकाएं जोड़ने से बचें.

अतिरिक्त संसाधन

मिक हॉप्ट की हीरो इमेज