3.2.3 - Következetes navigáció

Röviden a szabványpontról

A WCAG 2.2 Success Criterion 3.2.3 (Consistent Navigation) megköveteli, hogy azok a navigációs mechanizmusok, amelyek több weboldalon ismétlődnek egy weboldalcsoporton belül, minden alkalommal ugyanabban a relatív sorrendben jelenjenek meg. Ez vonatkozik a navigációs menükre, keresőmezőkre, tartalomjegyzékekre és más navigációs elemekre, amelyeket a webhelyen, vagy alkalmazásban használnak.

Cél: Segíteni a felhasználókat, különösen azokat, akik kognitív fogyatékossággal élnek vagy kisegítő technológiákra támaszkodnak, hogy előre jelezzék és hatékonyan használják a navigációs elemeket anélkül, hogy minden oldalon újra meg kellene tanulniuk a felületet. A következetesség csökkenti a zavart és a kognitív terhelést, megkönnyítve a kívánt tartalom elérését.

Mire vonatkozik: Minden olyan navigációs elemre, amely több oldalon ismétlődik, beleértve a főmenüket, másodlagos navigációt, keresőmezőket, tartalomjegyzékeket, és minden más olyan elemet, amely segíti a felhasználót a webhelyen való tájékozódásban.

Kiket érint

Elsődleges felhasználók: Kognitív fogyatékossággal, memóriaproblémákkal és tanulási nehézségekkel élő emberek profitálnak a legtöbbet, mert a következetes navigáció segíti őket a webhely mentális modelljének felépítésében.

Másodlagos előnyök: A motoros fogyatékossággal élő felhasználók vagy képernyőolvasót használók szintén profitálnak a kiszámítható navigációs sorrendből, javítva az általános böngészési hatékonyságukat.

Tesztelés

  1. Manuális áttekintés több oldalon: Ellenőrizd a navigációs menüket és más ismétlődő navigációs elemeket több oldalon, hogy megbizonyosodj arról, hogy ugyanabban a relatív sorrendben vannak
  2. Képernyőolvasó tesztelés: Használj képernyőolvasót az ismétlődő navigációs elemeken való navigáláshoz különböző oldalakon és ellenőrizd, hogy a sorrend következetes
  3. Mobil tesztelés: Mobil eszközökön ellenőrizd, hogy a navigációs komponensek megtartják ugyanazt a relatív sorrendet a különböző képernyőkön
  4. Automatizált eszközök: Használj eszközöket, mint az axe DevTools vagy axe Monitor a navigációs konzisztencia problémák felismerésére, ha támogatottak
  5. Felhasználói tesztelés: Figyelj meg fogyatékossággal élő felhasználókat a webhelyen való navigálás során, hogy azonosítsd a konzisztenciahiány okozta zavarokat

Jó gyakorlatok

1. Következetes főmenü minden oldalon

<!DOCTYPE html>
<html lang="hu">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Főoldal - Példa Weboldal</title>
</head>
<body>
  <header>
    <div class="logo">
      <img src="logo.png" alt="Példa Weboldal logója">
    </div>
    
    <!-- Főnavigáció - MINDEN oldalon ugyanez a sorrend -->
    <nav role="navigation" aria-label="Főnavigáció">
      <ul class="main-menu">
        <li><a href="/fooldal" aria-current="page">Főoldal</a></li>
        <li><a href="/rolunk">Rólunk</a></li>
        <li><a href="/szolgaltatasok">Szolgáltatások</a></li>
        <li><a href="/portfolio">Portfólió</a></li>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/kapcsolat">Kapcsolat</a></li>
      </ul>
    </nav>
    
    <!-- Keresőmező - mindig a navigáció után -->
    <form role="search" aria-label="Webhely keresése" class="search-form">
      <label for="search-input" class="visually-hidden">Keresés a weboldalon</label>
      <input type="search" id="search-input" name="q" placeholder="Keresés...">
      <button type="submit" aria-label="Keresés indítása">Keresés</button>
    </form>
  </header>
  
  <main>
    <h1>Üdvözöljük a főoldalon</h1>
    <p>Itt található a főoldal tartalma...</p>
  </main>
  
  <footer>
    <!-- Lábléc navigáció - szintén konzisztens sorrend -->
    <nav aria-label="Lábléc navigáció">
      <ul class="footer-menu">
        <li><a href="/adatvedelem">Adatvédelmi nyilatkozat</a></li>
        <li><a href="/felhasznalasi-feltetelek">Felhasználási feltételek</a></li>
        <li><a href="/sutikezelesi-tajekoztato">Sütikezelési tájékoztató</a></li>
        <li><a href="/sitemap">Oldaltérkép</a></li>
      </ul>
    </nav>
  </footer>
</body>
</html>

<!-- SZOLGÁLTATÁSOK OLDAL - Ugyanaz a navigációs sorrend -->
<!DOCTYPE html>
<html lang="hu">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Szolgáltatások - Példa Weboldal</title>
</head>
<body>
  <header>
    <div class="logo">
      <img src="logo.png" alt="Példa Weboldal logója">
    </div>
    
    <!-- PONTOSAN UGYANAZ a navigációs sorrend -->
    <nav role="navigation" aria-label="Főnavigáció">
      <ul class="main-menu">
        <li><a href="/fooldal">Főoldal</a></li>
        <li><a href="/rolunk">Rólunk</a></li>
        <li><a href="/szolgaltatasok" aria-current="page">Szolgáltatások</a></li>
        <li><a href="/portfolio">Portfólió</a></li>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/kapcsolat">Kapcsolat</a></li>
      </ul>
    </nav>
    
    <!-- Keresőmező ugyanazon a helyen -->
    <form role="search" aria-label="Webhely keresése" class="search-form">
      <label for="search-input" class="visually-hidden">Keresés a weboldalon</label>
      <input type="search" id="search-input" name="q" placeholder="Keresés...">
      <button type="submit" aria-label="Keresés indítása">Keresés</button>
    </form>
  </header>
  
  <main>
    <h1>Szolgáltatásaink</h1>
    
    <!-- Másodlagos navigáció - szintén konzisztens -->
    <nav aria-label="Szolgáltatások navigáció" class="secondary-nav">
      <ul>
        <li><a href="#webfejlesztes">Webfejlesztés</a></li>
        <li><a href="#webdesign">Webdesign</a></li>
        <li><a href="#seo">SEO optimalizálás</a></li>
        <li><a href="#karbantartas">Weboldal karbantartás</a></li>
      </ul>
    </nav>
    
    <p>Itt található a szolgáltatások oldal tartalma...</p>
  </main>
  
  <footer>
    <!-- Lábléc navigáció - ugyanaz a sorrend -->
    <nav aria-label="Lábléc navigáció">
      <ul class="footer-menu">
        <li><a href="/adatvedelem">Adatvédelmi nyilatkozat</a></li>
        <li><a href="/felhasznalasi-feltetelek">Felhasználási feltételek</a></li>
        <li><a href="/sutikezelesi-tajekoztato">Sütikezelési tájékoztató</a></li>
        <li><a href="/sitemap">Oldaltérkép</a></li>
      </ul>
    </nav>
  </footer>
</body>
</html>

Magyarázat: A navigációs elemek sorrendje minden oldalon pontosan ugyanaz, lehetővé téve a felhasználók számára, hogy megjegyezzék és hatékonyan használják a navigációt.

2. Felhasználói profil navigáció következetes elhelyezéssel

<!-- PROFIL OLDAL -->
<div class="user-dashboard">
  <header class="dashboard-header">
    <h1>Felhasználói irányítópult</h1>
    
    <!-- Felhasználói menü - mindig ugyanez a sorrend -->
    <nav aria-label="Felhasználói menü" class="user-nav">
      <ul>
        <li><a href="/profil" aria-current="page">Profil</a></li>
        <li><a href="/beallitasok">Beállítások</a></li>
        <li><a href="/uzeneteim">Üzeneteim</a></li>
        <li><a href="/rendeleseim">Rendeléseim</a></li>
        <li><a href="/kedvencek">Kedvencek</a></li>
        <li><a href="/kijelentkezes">Kijelentkezés</a></li>
      </ul>
    </nav>
  </header>
  
  <main>
    <h2>Profil adatok</h2>
    <p>Profil oldal tartalma...</p>
  </main>
</div>

<!-- BEÁLLÍTÁSOK OLDAL - Ugyanaz a navigációs sorrend -->
<div class="user-dashboard">
  <header class="dashboard-header">
    <h1>Felhasználói irányítópult</h1>
    
    <!-- PONTOSAN UGYANAZ a navigációs sorrend -->
    <nav aria-label="Felhasználói menü" class="user-nav">
      <ul>
        <li><a href="/profil">Profil</a></li>
        <li><a href="/beallitasok" aria-current="page">Beállítások</a></li>
        <li><a href="/uzeneteim">Üzeneteim</a></li>
        <li><a href="/rendeleseim">Rendeléseim</a></li>
        <li><a href="/kedvencek">Kedvencek</a></li>
        <li><a href="/kijelentkezes">Kijelentkezés</a></li>
      </ul>
    </nav>
  </header>
  
  <main>
    <h2>Fiók beállítások</h2>
    
    <!-- Beállítások al-navigáció - szintén konzisztens -->
    <nav aria-label="Beállítások almenü" class="settings-nav">
      <ul>
        <li><a href="#alapadatok">Alapadatok</a></li>
        <li><a href="#jelszo">Jelszó módosítás</a></li>
        <li><a href="#ertesitesek">Értesítések</a></li>
        <li><a href="#adatvedelem">Adatvédelem</a></li>
        <li><a href="#fiok-torlese">Fiók törlése</a></li>
      </ul>
    </nav>
    
    <p>Beállítások oldal tartalma...</p>
  </main>
</div>

<style>
.user-dashboard {
  max-width: 1200px;
  margin: 0 auto;
  padding: 1rem;
}

.dashboard-header {
  background: #f8f9fa;
  padding: 1rem;
  border-bottom: 2px solid #e9ecef;
  margin-bottom: 2rem;
}

.user-nav ul, .settings-nav ul {
  list-style: none;
  padding: 0;
  margin: 1rem 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}

.user-nav li, .settings-nav li {
  margin: 0;
}

.user-nav a, .settings-nav a {
  display: block;
  padding: 0.75rem 1rem;
  text-decoration: none;
  background: #fff;
  border: 1px solid #dee2e6;
  border-radius: 4px;
  color: #495057;
  transition: all 0.2s ease;
}

.user-nav a:hover, .settings-nav a:hover,
.user-nav a:focus, .settings-nav a:focus {
  background: #e9ecef;
  border-color: #007bff;
  text-decoration: none;
}

.user-nav a[aria-current="page"], 
.settings-nav a[aria-current="page"] {
  background: #007bff;
  color: white;
  border-color: #007bff;
}

/* Mobil nézet */
@media (max-width: 768px) {
  .user-nav ul, .settings-nav ul {
    flex-direction: column;
  }
  
  .user-nav a, .settings-nav a {
    text-align: center;
  }
}

/* Vizuálisan rejtett elemek */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
</style>

Magyarázat: A felhasználói navigáció minden dashboard oldalon ugyanabban a sorrendben jelenjen meg, megkönnyítve a tájékozódást.

3. Mobilbarát következetes navigáció

<!DOCTYPE html>
<html lang="hu">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Mobilbarát Navigáció</title>
</head>
<body>
  <header class="main-header">
    <div class="header-container">
      <!-- Logo mindig ugyanazon a helyen -->
      <div class="logo">
        <a href="/fooldal" aria-label="Vissza a főoldalra">
          <img src="logo.png" alt="Weboldal logója">
        </a>
      </div>
      
      <!-- Hamburger menü gomb - mindig a logo után -->
      <button 
        class="menu-toggle" 
        aria-expanded="false" 
        aria-controls="main-navigation"
        aria-label="Navigációs menü megnyitása"
        onclick="toggleMenu()"
      >
        <span class="hamburger-line"></span>
        <span class="hamburger-line"></span>
        <span class="hamburger-line"></span>
      </button>
      
      <!-- Keresős ikon - mindig a menügomb után -->
      <button 
        class="search-toggle" 
        aria-expanded="false"
        aria-controls="search-form"
        aria-label="Keresés megnyitása"
        onclick="toggleSearch()"
      >
        🔍
      </button>
    </div>
    
    <!-- Főnavigáció - rejtett alapállapotban mobilon -->
    <nav 
      id="main-navigation" 
      class="main-nav" 
      role="navigation" 
      aria-label="Főnavigáció"
    >
      <ul class="nav-list">
        <!-- MINDIG ugyanez a sorrend minden oldalon -->
        <li><a href="/fooldal">Főoldal</a></li>
        <li><a href="/termekek">Termékek</a></li>
        <li><a href="/rolunk">Rólunk</a></li>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/kapcsolat">Kapcsolat</a></li>
        <li><a href="/vasarlas">Vásárlás</a></li>
      </ul>
      
      <!-- Másodlagos navigációs elemek - mindig ugyanitt -->
      <div class="secondary-nav-mobile">
        <ul>
          <li><a href="/bejelentkezes">Bejelentkezés</a></li>
          <li><a href="/regisztracio">Regisztráció</a></li>
          <li><a href="/kosar">Kosár (3)</a></li>
        </ul>
      </div>
    </nav>
    
    <!-- Keresőforma - rejtett alapállapotban -->
    <form 
      id="search-form" 
      class="search-form" 
      role="search" 
      aria-label="Webhely keresése"
    >
      <div class="search-container">
        <label for="mobile-search" class="visually-hidden">Keresőkifejezés</label>
        <input 
          type="search" 
          id="mobile-search" 
          name="q" 
          placeholder="Keresés..." 
          aria-describedby="search-help"
        >
        <button type="submit" aria-label="Keresés indítása">Keresés</button>
        <button 
          type="button" 
          class="search-close" 
          aria-label="Keresés bezárása"
          onclick="toggleSearch()"
        >×</button>
      </div>
      <div id="search-help" class="search-help">
        Írja be a keresett kifejezést és nyomja meg az Enter billentyűt.
      </div>
    </form>
  </header>
  
  <main>
    <h1>Oldal tartalma</h1>
    <p>Ez a tartalom minden oldalon más, de a navigáció mindig ugyanaz.</p>
  </main>
  
  <!-- Alsó navigáció mobilra - opcionális, de ha van, akkor konzisztens -->
  <nav class="bottom-nav" aria-label="Gyors navigáció" role="navigation">
    <ul>
      <li>
        <a href="/fooldal">
          <span class="nav-icon">🏠</span>
          <span>Főoldal</span>
        </a>
      </li>
      <li>
        <a href="/termekek">
          <span class="nav-icon">📦</span>
          <span>Termékek</span>
        </a>
      </li>
      <li>
        <a href="/kosar">
          <span class="nav-icon">🛒</span>
          <span>Kosár</span>
        </a>
      </li>
      <li>
        <a href="/profil">
          <span class="nav-icon">👤</span>
          <span>Profil</span>
        </a>
      </li>
    </ul>
  </nav>

<script>
function toggleMenu() {
  const nav = document.getElementById('main-navigation');
  const button = document.querySelector('.menu-toggle');
  const isExpanded = button.getAttribute('aria-expanded') === 'true';
  
  // Állapot váltása
  button.setAttribute('aria-expanded', !isExpanded);
  nav.classList.toggle('nav-open');
  
  // Hamburger animáció
  button.classList.toggle('menu-open');
  
  // Képernyőolvasó értesítése
  const announcement = document.createElement('div');
  announcement.setAttribute('role', 'status');
  announcement.setAttribute('aria-live', 'polite');
  announcement.className = 'visually-hidden';
  announcement.textContent = !isExpanded ? 
    'Navigációs menü megnyitva' : 
    'Navigációs menü bezárva';
  document.body.appendChild(announcement);
  
  setTimeout(() => {
    if (announcement.parentNode) {
      document.body.removeChild(announcement);
    }
  }, 1000);
  
  // Fókusz kezelése
  if (!isExpanded) {
    // Menü megnyitásakor az első linkre fókusz
    setTimeout(() => {
      const firstLink = nav.querySelector('a');
      if (firstLink) firstLink.focus();
    }, 100);
  }
}

function toggleSearch() {
  const form = document.getElementById('search-form');
  const button = document.querySelector('.search-toggle');
  const isExpanded = button.getAttribute('aria-expanded') === 'true';
  
  // Állapot váltása
  button.setAttribute('aria-expanded', !isExpanded);
  form.classList.toggle('search-open');
  
  // Fókusz kezelése
  if (!isExpanded) {
    setTimeout(() => {
      const searchInput = document.getElementById('mobile-search');
      if (searchInput) searchInput.focus();
    }, 100);
  }
}

// Escape billentyű kezelése
document.addEventListener('keydown', function(e) {
  if (e.key === 'Escape') {
    // Menü bezárása
    const nav = document.getElementById('main-navigation');
    const menuButton = document.querySelector('.menu-toggle');
    if (nav.classList.contains('nav-open')) {
      menuButton.setAttribute('aria-expanded', 'false');
      nav.classList.remove('nav-open');
      menuButton.classList.remove('menu-open');
      menuButton.focus();
    }
    
    // Keresés bezárása
    const form = document.getElementById('search-form');
    const searchButton = document.querySelector('.search-toggle');
    if (form.classList.contains('search-open')) {
      searchButton.setAttribute('aria-expanded', 'false');
      form.classList.remove('search-open');
      searchButton.focus();
    }
  }
});

// Kattintás a menün kívülre
document.addEventListener('click', function(e) {
  const nav = document.getElementById('main-navigation');
  const menuButton = document.querySelector('.menu-toggle');
  
  if (!nav.contains(e.target) && !menuButton.contains(e.target)) {
    if (nav.classList.contains('nav-open')) {
      menuButton.setAttribute('aria-expanded', 'false');
      nav.classList.remove('nav-open');
      menuButton.classList.remove('menu-open');
    }
  }
});
</script>

<style>
/* Alapstílusok */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: Arial, sans-serif;
  line-height: 1.6;
}

.main-header {
  background: white;
  border-bottom: 1px solid #e9ecef;
  position: sticky;
  top: 0;
  z-index: 1000;
}

.header-container {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem;
  max-width: 1200px;
  margin: 0 auto;
}

.logo img {
  height: 40px;
  width: auto;
}

/* Gomb stílusok */
.menu-toggle, .search-toggle {
  background: none;
  border: none;
  cursor: pointer;
  padding: 0.5rem;
  border-radius: 4px;
  transition: background-color 0.2s ease;
}

.menu-toggle:hover, .search-toggle:hover,
.menu-toggle:focus, .search-toggle:focus {
  background: #f8f9fa;
  outline: 2px solid #007bff;
  outline-offset: 2px;
}

/* Hamburger menü */
.menu-toggle {
  display: flex;
  flex-direction: column;
  width: 30px;
  height: 30px;
  justify-content: center;
  gap: 4px;
}

.hamburger-line {
  width: 100%;
  height: 3px;
  background: #333;
  transition: all 0.3s ease;
  border-radius: 2px;
}

.menu-open .hamburger-line:nth-child(1) {
  transform: rotate(45deg) translate(6px, 6px);
}

.menu-open .hamburger-line:nth-child(2) {
  opacity: 0;
}

.menu-open .hamburger-line:nth-child(3) {
  transform: rotate(-45deg) translate(6px, -6px);
}

/* Navigáció */
.main-nav {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background: white;
  border-top: 1px solid #e9ecef;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}

.main-nav.nav-open {
  max-height: 500px;
}

.nav-list {
  list-style: none;
  padding: 1rem;
}

.nav-list li {
  margin-bottom: 0.5rem;
}

.nav-list a {
  display: block;
  padding: 0.75rem;
  text-decoration: none;
  color: #333;
  border-radius: 4px;
  transition: background-color 0.2s ease;
}

.nav-list a:hover, .nav-list a:focus {
  background: #f8f9fa;
  text-decoration: none;
}

/* Másodlagos navigáció */
.secondary-nav-mobile {
  border-top: 1px solid #e9ecef;
  margin-top: 1rem;
  padding-top: 1rem;
}

.secondary-nav-mobile ul {
  list-style: none;
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

.secondary-nav-mobile a {
  padding: 0.5rem 1rem;
  background: #007bff;
  color: white;
  text-decoration: none;
  border-radius: 4px;
  font-size: 0.9em;
}

/* Keresőforma */
.search-form {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background: white;
  border-top: 1px solid #e9ecef;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}

.search-form.search-open {
  max-height: 200px;
}

.search-container {
  padding: 1rem;
  display: flex;
  gap: 0.5rem;
  align-items: center;
}

.search-container input {
  flex: 1;
  padding: 0.75rem;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 1rem;
}

.search-container button {
  padding: 0.75rem 1rem;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

.search-container button[type="submit"] {
  background: #007bff;
  color: white;
}

.search-close {
  background: #dc3545;
  color: white;
  font-size: 1.2em;
}

.search-help {
  padding: 0 1rem 1rem;
  font-size: 0.9em;
  color: #666;
}

/* Alsó navigáció */
.bottom-nav {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: white;
  border-top: 1px solid #e9ecef;
  z-index: 1000;
}

.bottom-nav ul {
  list-style: none;
  display: flex;
  margin: 0;
  padding: 0;
}

.bottom-nav li {
  flex: 1;
}

.bottom-nav a {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 0.5rem;
  text-decoration: none;
  color: #666;
  font-size: 0.8em;
}

.bottom-nav a:hover, .bottom-nav a:focus {
  background: #f8f9fa;
  color: #007bff;
}

.nav-icon {
  font-size: 1.2em;
  margin-bottom: 0.25rem;
}

/* Asztali nézet */
@media (min-width: 768px) {
  .menu-toggle, .search-toggle {
    display: none;
  }
  
  .main-nav {
    position: static;
    max-height: none;
    border: none;
    background: transparent;
  }
  
  .nav-list {
    display: flex;
    gap: 1rem;
    padding: 0;
    margin: 0;
  }
  
  .nav-list li {
    margin: 0;
  }
  
  .secondary-nav-mobile {
    display: none;
  }
  
  .search-form {
    position: static;
    max-height: none;
    background: transparent;
    border: none;
  }
  
  .search-container {
    padding: 0;
  }
  
  .bottom-nav {
    display: none;
  }
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
</style>
</body>
</html>

Magyarázat: A mobil navigáció minden oldalon ugyanabban a sorrendben és pozícióban jelenik meg, függetlenül a képernyő méretétől.

4. Újrafelhasználható komponensek és sablonok

<!-- NAVIGÁCIÓS KOMPONENS SABLON -->
<script type="text/template" id="navigation-template">
<nav role="navigation" aria-label="{{navLabel}}">
  <ul class="{{navClass}}">
    {{#each menuItems}}
    <li>
      <a href="{{url}}" 
         {{#if current}}aria-current="page"{{/if}}
         {{#if ariLabel}}aria-label="{{ariaLabel}}"{{/if}}>
        {{title}}
        {{#if badge}}<span class="nav-badge">{{badge}}</span>{{/if}}
      </a>
    </li>
    {{/each}}
  </ul>
</nav>
</script>

<script>
// Navigációs konfigurációk - KÖZPONTI hely a konzisztencia biztosítására
const NavigationConfig = {
  // Főnavigáció - minden oldalon ugyanez
  mainNavigation: {
    navLabel: 'Főnavigáció',
    navClass: 'main-nav-list',
    menuItems: [
      { url: '/fooldal', title: 'Főoldal', ariaLabel: 'Vissza a főoldalra' },
      { url: '/termekek', title: 'Termékek' },
      { url: '/kategoriak', title: 'Kategóriák' },
      { url: '/akcio', title: 'Akciók' },
      { url: '/blog', title: 'Blog' },
      { url: '/kapcsolat', title: 'Kapcsolat' },
      { url: '/vasarlas', title: 'Vásárlás' }
    ]
  },
  
  // Felhasználói navigáció
  userNavigation: {
    navLabel: 'Felhasználói menü',
    navClass: 'user-nav-list',
    menuItems: [
      { url: '/profil', title: 'Profil' },
      { url: '/rendeleseim', title: 'Rendeléseim' },
      { url: '/kedvencek', title: 'Kedvencek' },
      { url: '/uzeneteim', title: 'Üzenetek', badge: '3' },
      { url: '/beallitasok', title: 'Beállítások' },
      { url: '/kijelentkezes', title: 'Kijelentkezés' }
    ]
  },
  
  // Admin navigáció
  adminNavigation: {
    navLabel: 'Adminisztrációs menü',
    navClass: 'admin-nav-list',
    menuItems: [
      { url: '/admin/iranyitopult', title: 'Irányítópult' },
      { url: '/admin/felhasznalok', title: 'Felhasználók' },
      { url: '/admin/termekek', title: 'Termékek' },
      { url: '/admin/rendelesek', title: 'Rendelések' },
      { url: '/admin/statisztikak', title: 'Statisztikák' },
      { url: '/admin/beallitasok', title: 'Rendszer beállítások' }
    ]
  },
  
  // Lábléc navigáció
  footerNavigation: {
    navLabel: 'Lábléc navigáció',
    navClass: 'footer-nav-list',
    menuItems: [
      { url: '/adatvedelem', title: 'Adatvédelmi nyilatkozat' },
      { url: '/aszf', title: 'ÁSZF' },
      { url: '/sutikezelesi-tajekoztato', title: 'Sütikezelési tájékoztató' },
      { url: '/impresszum', title: 'Impresszum' },
      { url: '/sitemap', title: 'Oldaltérkép' }
    ]
  }
};

// Navigáció renderelése
function renderNavigation(configKey, currentPath = '') {
  const config = NavigationConfig[configKey];
  if (!config) {
    console.error(`Navigációs konfiguráció nem található: ${configKey}`);
    return '';
  }
  
  // Aktuális oldal jelölése
  const menuItems = config.menuItems.map(item => ({
    ...item,
    current: item.url === currentPath
  }));
  
  // Sablon feldolgozása (egyszerű Handlebars-szerű)
  let template = document.getElementById('navigation-template').innerHTML;
  
  // Sablon változók cseréje
  template = template.replace('{{navLabel}}', config.navLabel);
  template = template.replace('{{navClass}}', config.navClass);
  
  // Menüelemek renderelése
  let menuHTML = '';
  menuItems.forEach(item => {
    let itemHTML = `
      <li>
        <a href="${item.url}"`;
    
    if (item.current) {
      itemHTML += ` aria-current="page"`;
    }
    
    if (item.ariaLabel) {
      itemHTML += ` aria-label="${item.ariaLabel}"`;
    }
    
    itemHTML += `>${item.title}`;
    
    if (item.badge) {
      itemHTML += `<span class="nav-badge">${item.badge}</span>`;
    }
    
    itemHTML += `</a></li>`;
    menuHTML += itemHTML;
  });
  
  template = template.replace('{{#each menuItems}}{{/each}}', menuHTML);
  
  return template;
}

// Navigáció beszúrása a DOM-ba
function insertNavigation(containerId, configKey, currentPath = '') {
  const container = document.getElementById(containerId);
  if (container) {
    container.innerHTML = renderNavigation(configKey, currentPath);
  }
}

// Oldal betöltésekor navigációk renderelése
document.addEventListener('DOMContentLoaded', function() {
  // Jelenlegi útvonal meghatározása
  const currentPath = window.location.pathname;
  
  // Navigációk beszúrása
  insertNavigation('main-navigation', 'mainNavigation', currentPath);
  insertNavigation('user-navigation', 'userNavigation', currentPath);
  insertNavigation('footer-navigation', 'footerNavigation', currentPath);
  
  // Admin oldalakon admin navigáció
  if (currentPath.startsWith('/admin/')) {
    insertNavigation('admin-navigation', 'adminNavigation', currentPath);
  }
});

// Navigáció frissítése AJAX hívások után
function updateNavigationForPage(newPath) {
  insertNavigation('main-navigation', 'mainNavigation', newPath);
  insertNavigation('user-navigation', 'userNavigation', newPath);
  
  if (newPath.startsWith('/admin/')) {
    insertNavigation('admin-navigation', 'adminNavigation', newPath);
  }
}

// Dinamikus badge frissítése
function updateNavigationBadge(configKey, itemUrl, newBadge) {
  const config = NavigationConfig[configKey];
  const item = config.menuItems.find(item => item.url === itemUrl);
  
  if (item) {
    if (newBadge) {
      item.badge = newBadge;
    } else {
      delete item.badge;
    }
    
    // Navigáció újra renderelése
    const currentPath = window.location.pathname;
    if (configKey === 'mainNavigation') {
      insertNavigation('main-navigation', configKey, currentPath);
    } else if (configKey === 'userNavigation') {
      insertNavigation('user-navigation', configKey, currentPath);
    }
  }
}

// Példa használat:
// updateNavigationBadge('userNavigation', '/uzeneteim', '5'); // Új üzenetek
// updateNavigationBadge('userNavigation', '/uzeneteim', null); // Badge eltávolítása
</script>

<!-- HTML struktúra -->
<div class="page-layout">
  <header>
    <div class="logo">
      <img src="logo.png" alt="Weboldal logója">
    </div>
    
    <!-- Főnavigáció konténer -->
    <div id="main-navigation"></div>
    
    <!-- Felhasználói navigáció konténer -->
    <div id="user-navigation"></div>
  </header>
  
  <main>
    <!-- Admin oldalon admin navigáció -->
    <div id="admin-navigation"></div>
    
    <h1>Oldal tartalma</h1>
    <p>Az oldal tartalma változik, de a navigáció mindig konzisztens.</p>
  </main>
  
  <footer>
    <!-- Lábléc navigáció konténer -->
    <div id="footer-navigation"></div>
  </footer>
</div>

<style>
/* Navigációs stílusok */
.main-nav-list, .user-nav-list, .admin-nav-list, .footer-nav-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

.main-nav-list a, .user-nav-list a, .admin-nav-list a, .footer-nav-list a {
  text-decoration: none;
  padding: 0.5rem 1rem;
  border-radius: 4px;
  transition: all 0.2s ease;
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.main-nav-list a {
  background: #f8f9fa;
  color: #495057;
  border: 1px solid #dee2e6;
}

.user-nav-list a {
  background: #007bff;
  color: white;
}

.admin-nav-list a {
  background: #28a745;
  color: white;
}

.footer-nav-list a {
  background: transparent;
  color: #6c757d;
}

/* Hover és fókusz állapotok */
.main-nav-list a:hover, .main-nav-list a:focus {
  background: #e9ecef;
  border-color: #007bff;
}

.user-nav-list a:hover, .user-nav-list a:focus {
  background: #0056b3;
}

.admin-nav-list a:hover, .admin-nav-list a:focus {
  background: #1e7e34;
}

.footer-nav-list a:hover, .footer-nav-list a:focus {
  color: #495057;
  text-decoration: underline;
}

/* Aktuális oldal kiemelése */
.main-nav-list a[aria-current="page"] {
  background: #007bff;
  color: white;
  border-color: #007bff;
}

.user-nav-list a[aria-current="page"] {
  background: #0056b3;
  font-weight: bold;
}

.admin-nav-list a[aria-current="page"] {
  background: #1e7e34;
  font-weight: bold;
}

.footer-nav-list a[aria-current="page"] {
  color: #007bff;
  font-weight: bold;
}

/* Badge stílus */
.nav-badge {
  background: #dc3545;
  color: white;
  border-radius: 10px;
  padding: 0.2rem 0.5rem;
  font-size: 0.8em;
  font-weight: bold;
  min-width: 1.2em;
  text-align: center;
}

/* Reszponzív navigáció */
@media (max-width: 768px) {
  .main-nav-list, .user-nav-list, .admin-nav-list {
    flex-direction: column;
  }
  
  .footer-nav-list {
    flex-direction: column;
    text-align: center;
  }
}
</style>

Magyarázat: Központi konfigurációs rendszer biztosítja, hogy minden navigációs elem ugyanabban a sorrendben jelenjen meg minden oldalon, automatikusan kezelve a konzisztenciát.

Rossz gyakorlatok

Változó link sorrend oldalak között

<!-- FŐOLDAL navigációja -->
<nav>
  <ul>
    <li><a href="/fooldal">Főoldal</a></li>
    <li><a href="/szolgaltatasok">Szolgáltatások</a></li>
    <li><a href="/rolunk">Rólunk</a></li>
    <li><a href="/kapcsolat">Kapcsolat</a></li>
  </ul>
</nav>

<!-- KAPCSOLAT OLDAL navigációja - HIBÁS: más sorrend -->
<nav>
  <ul>
    <li><a href="/rolunk">Rólunk</a></li> <!-- Sorrend felcserélve -->
    <li><a href="/fooldal">Főoldal</a></li>
    <li><a href="/szolgaltatasok">Szolgáltatások</a></li>
    <li><a href="/kapcsolat">Kapcsolat</a></li>
  </ul>
</nav>

Probléma: A felhasználóknak minden oldalon újra meg kell tanulniuk a navigációs sorrend, ami zavart okoz és növeli a kognitív terhelést.

Navigációs elemek eltérő elhelyezése

<!-- Főoldal - navigáció felül -->
<header>
  <nav>
    <ul>
      <li><a href="/fooldal">Főoldal</a></li>
      <li><a href="/termekek">Termékek</a></li>
    </ul>
  </nav>
</header>

<!-- Termékek oldal - HIBÁS: navigáció oldalt -->
<div class="layout">
  <aside>
    <nav> <!-- Más helyen! -->
      <ul>
        <li><a href="/fooldal">Főoldal</a></li>
        <li><a href="/termekek">Termékek</a></li>
      </ul>
    </nav>
  </aside>
</div>

Probléma: A navigáció más pozícióban való elhelyezése megzavarja a felhasználókat, akik megszokták az eredeti elhelyezést.

Navigációs elemek elhagyása egyes oldalakon

<!-- Főoldal - teljes navigáció -->
<nav>
  <ul>
    <li><a href="/fooldal">Főoldal</a></li>
    <li><a href="/termekek">Termékek</a></li>
    <li><a href="/rolunk">Rólunk</a></li>
    <li><a href="/kapcsolat">Kapcsolat</a></li>
  </ul>
</nav>

<!-- Kapcsolat oldal - HIBÁS: hiányzó elemek -->
<nav>
  <ul>
    <li><a href="/fooldal">Főoldal</a></li>
    <!-- Termékek és Rólunk linkek hiányoznak -->
    <li><a href="/kapcsolat">Kapcsolat</a></li>
  </ul>
</nav>

Probléma: A navigációs elemek elhagyása összezavarja azokat a felhasználókat, akik a konzisztens navigációs struktúrára támaszkodnak.

Dinamikus navigáció következetesség nélkül

<script>
// HIBÁS: véletlenszerű sorrend generálása
function generateRandomNavigation() {
  const menuItems = [
    { url: '/fooldal', title: 'Főoldal' },
    { url: '/termekek', title: 'Termékek' },
    { url: '/rolunk', title: 'Rólunk' },
    { url: '/kapcsolat', title: 'Kapcsolat' }
  ];
  
  // HIBÁS: véletlenszerű keverés minden oldalon
  const shuffled = menuItems.sort(() => Math.random() - 0.5);
  
  let navHTML = '<ul>';
  shuffled.forEach(item => {
    navHTML += `<li><a href="${item.url}">${item.title}</a></li>`;
  });
  navHTML += '</ul>';
  
  document.getElementById('navigation').innerHTML = navHTML;
}

// HIBÁS: különböző logika alapján rendezés
function sortNavigationByPopularity() {
  // Feltételezett népszerűségi adatok
  const popularityData = getPagePopularity(); // Változó eredmények
  
  const menuItems = [
    { url: '/fooldal', title: 'Főoldal' },
    { url: '/termekek', title: 'Termékek' },
    { url: '/rolunk', title: 'Rólunk' },
    { url: '/kapcsolat', title: 'Kapcsolat' }
  ];
  
  // HIBÁS: népszerűség alapján rendezés változó sorrendet eredményez
  menuItems.sort((a, b) => popularityData[b.url] - popularityData[a.url]);
  
  // Minden oldal más sorrendet kaphat
}
</script>

Probléma: A dinamikus sorrend változása minden oldalbetöltéskor vagy különböző oldalak között megszakítja a felhasználók mentális modelljét.

Mobilon és asztali nézetben eltérő navigációs sorrend

<!-- HIBÁS: eltérő sorrend mobil és asztali nézetben -->
<nav class="desktop-nav">
  <ul>
    <li><a href="/fooldal">Főoldal</a></li>
    <li><a href="/termekek">Termékek</a></li>
    <li><a href="/rolunk">Rólunk</a></li>
    <li><a href="/kapcsolat">Kapcsolat</a></li>
  </ul>
</nav>

<nav class="mobile-nav">
  <ul>
    <!-- HIBÁS: mobil nézetben más sorrend -->
    <li><a href="/kapcsolat">Kapcsolat</a></li>
    <li><a href="/rolunk">Rólunk</a></li>
    <li><a href="/termekek">Termékek</a></li>
    <li><a href="/fooldal">Főoldal</a></li>
  </ul>
</nav>

<style>
@media (max-width: 768px) {
  .desktop-nav { display: none; }
  .mobile-nav { display: block; }
}

@media (min-width: 769px) {
  .desktop-nav { display: block; }
  .mobile-nav { display: none; }
}
</style>

Probléma: A felhasználók, akik váltanak eszközök között, elveszítik a navigációs konzisztenciát és újra kell tanulniuk a sorrend.

Időalapú vagy felhasználói preferencia alapú navigációs változtatások

<script>
// HIBÁS: időalapú navigációs változtatások
function timeBasedNavigation() {
  const currentHour = new Date().getHours();
  let menuItems = [];
  
  if (currentHour < 12) {
    // HIBÁS: reggeli sorrend
    menuItems = [
      { url: '/reggeli-akcio', title: 'Reggeli Akció' },
      { url: '/fooldal', title: 'Főoldal' },
      { url: '/termekek', title: 'Termékek' }
    ];
  } else if (currentHour < 18) {
    // HIBÁS: délutáni sorrend
    menuItems = [
      { url: '/fooldal', title: 'Főoldal' },
      { url: '/delutani-ajanlatok', title: 'Délutáni Ajánlatok' },
      { url: '/termekek', title: 'Termékek' }
    ];
  } else {
    // HIBÁS: esti sorrend
    menuItems = [
      { url: '/esti-kiauritas', title: 'Esti Kiárusítás' },
      { url: '/termekek', title: 'Termékek' },
      { url: '/fooldal', title: 'Főoldal' }
    ];
  }
  
  renderNavigation(menuItems);
}

// HIBÁS: felhasználói típus alapú navigáció
function userTypeBasedNavigation(userType) {
  let menuItems = [];
  
  switch(userType) {
    case 'admin':
      // HIBÁS: adminoknak más sorrend
      menuItems = [
        { url: '/admin', title: 'Admin' },
        { url: '/fooldal', title: 'Főoldal' },
        { url: '/termekek', title: 'Termékek' }
      ];
      break;
      
    case 'premium':
      // HIBÁS: prémium felhasználóknak más sorrend
      menuItems = [
        { url: '/premium-area', title: 'Prémium' },
        { url: '/fooldal', title: 'Főoldal' },
        { url: '/termekek', title: 'Termékek' }
      ];
      break;
      
    default:
      // Alapértelmezett sorrend
      menuItems = [
        { url: '/fooldal', title: 'Főoldal' },
        { url: '/termekek', title: 'Termékek' },
        { url: '/regisztracio', title: 'Regisztráció' }
      ];
  }
  
  renderNavigation(menuItems);
}

// HIBÁS: személyre szabott sorrend
function personalizedNavigation(userPreferences) {
  const allMenuItems = [
    { url: '/fooldal', title: 'Főoldal' },
    { url: '/termekek', title: 'Termékek' },
    { url: '/rolunk', title: 'Rólunk' },
    { url: '/kapcsolat', title: 'Kapcsolat' }
  ];
  
  // HIBÁS: felhasználói preferenciák alapján rendezés
  const personalizedOrder = allMenuItems.sort((a, b) => {
    return userPreferences[b.url] - userPreferences[a.url];
  });
  
  renderNavigation(personalizedOrder);
}
</script>

Probléma: A navigációs sorrend dinamikus változtatása időpont, felhasználói típus vagy preferenciák alapján megtöri a konzisztenciát és megnehezíti a navigációt.

Források

Iratkozz fel hírlevelünkre!

Amennyiben szeretnél első kézből értesülni az új bejegyzésekről, iratkozz fel hírlevelünkre!

Ez a weboldal sütiket használ a böngészési élmény javítása és a webhely megfelelő működésének biztosítása érdekében. A webhely használatának folytatásával elismeri és elfogadja a sütik használatát.

Összes elfogadása Csak a szükségesek elfogadása