2.5.3 - Címkék szövegezése és magyarázata

Röviden a szabványpontról

A WCAG 2.5.3 (Label in Name) előírja, hogy a felhasználói felület komponensek elérhető neve tartalmaznia kell, a vizuálisan megjelenített címke szövegét. Ez azt jelenti, hogy bármilyen címke szöveget lát a felhasználó egy gombon, űrlap vezérlőn, vagy interaktív elemen, annak programozottan elérhetőnek kell lennie szövegként is.

Mire vonatkozik: Minden olyan felhasználói felület komponensre, amely látható címkével rendelkezik.

Cél: Biztosítani a konzisztenciát:

  • A látó felhasználók által látott szöveg
  • A segítő technológiák (képernyőolvasók) által bejelentett szöveg
  • Megakadályozni a félreértésteket és a hibákat
  • Javítani a használhatóságot

Kiket érint

Elsődleges felhasználók: Képernyőolvasót vagy más segítő technológiákat használók, akik a webes tartalomban navigálnak és interakcióba lépnek vele. Ha az elérhető név nem tartalmazza a látható címkét, ezek a felhasználók hiányos vagy félrevezető információt kaphatnak a vezérlők funkciójáról.

Másodlagos előnyök: Segíti a kognitív fogyatékossággal élőket is az egyértelmű, következetes címkézéssel és javítja az automatizált tesztelést azáltal, hogy a címkéket könnyebb programozottan ellenőrizni.

Tesztelés

  1. Képernyőolvasó tesztelés: Használj képernyőolvasót (NVDA, JAWS, VoiceOver) a vezérlőkhöz való navigáláshoz és ellenőrizd, hogy a bejelentett név tartalmazza a látható címke szövegét
  2. Akadálymentességi fa vizsgálata: Használd a böngésző fejlesztői eszközeit vagy akadálymentességi vizsgáló eszközöket (pl. Chrome DevTools Accessibility panel) annak ellenőrzésére, hogy az elemek elérhető neve tartalmazza a látható címkét
  3. Automatizált tesztelő eszközök: Futtass eszközöket, mint az axe DevTools vagy axe Linter, amelyek felderítik a látható címkék és elérhető nevek közötti eltéréseket
  4. Kód áttekintés: Ellenőrizd, hogy a címke szöveg helyesen van hozzárendelve az űrlap vezérlőkhöz megfelelő HTML használatával (pl. <label for=”id”>) vagy ARIA attribútumokkal (aria-label, aria-labelledby), amelyek tartalmazzák a látható címke szövegét
  5. Billentyűzetes navigáció: Győződj meg róla, hogy fókusz esetén a vezérlő elérhető neve megegyezik a látható címkével, konzisztens visszajelzést biztosítva

Jó gyakorlatok

1. Label elem használata input mezőkhöz

<!-- Jó: Explicit label elem kapcsolva az input-tal -->
<form class="regisztracios-form">
  <div class="form-group">
    <label for="email-cim">E-mail cím</label>
    <input type="email" id="email-cim" name="email" required>
    <!-- Az elérhető név "E-mail cím" - megegyezik a látható címkével -->
  </div>
  
  <div class="form-group">
    <label for="jelszo">Jelszó</label>
    <input type="password" id="jelszo" name="password" required>
    <!-- Az elérhető név "Jelszó" - megegyezik a látható címkével -->
  </div>
  
  <div class="form-group">
    <label for="jelszo-megerosites">Jelszó megerősítése</label>
    <input type="password" id="jelszo-megerosites" name="password_confirm" required>
    <!-- Az elérhető név "Jelszó megerősítése" - megegyezik a látható címkével -->
  </div>
  
  <div class="form-group">
    <label for="telefon">Telefonszám (opcionális)</label>
    <input type="tel" id="telefon" name="phone">
    <!-- Az elérhető név "Telefonszám (opcionális)" - teljes címke -->
  </div>
  
  <div class="form-group checkbox-group">
    <label for="feltetelek">
      <input type="checkbox" id="feltetelek" name="terms" required>
      Elfogadom az <a href="/aszf">Általános Szerződési Feltételeket</a>
    </label>
    <!-- Az elérhető név tartalmazza a teljes szöveget a linkkel együtt -->
  </div>
  
  <button type="submit">Regisztráció</button>
  <!-- Az elérhető név "Regisztráció" - megegyezik a gomb szövegével -->
</form>

<!-- Jó: Keresési form helyes címkézéssel -->
<form class="kereses-form" role="search">
  <div class="search-group">
    <label for="kereses-mezo">Keresés a weboldalon</label>
    <input type="search" 
           id="kereses-mezo" 
           name="q" 
           placeholder="Írja be a keresési kifejezést...">
    <!-- Az elérhető név "Keresés a weboldalon" - a label szövege -->
  </div>
  
  <button type="submit">Keresés indítása</button>
  <!-- Az elérhető név "Keresés indítása" - gomb szöveg -->
</form>

<style>
.regisztracios-form, .kereses-form {
  max-width: 400px;
  margin: 20px auto;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  background: #f9f9f9;
}

.form-group {
  margin-bottom: 15px;
}

.form-group label {
  display: block;
  margin-bottom: 5px;
  font-weight: bold;
  color: #333;
}

.form-group input[type="email"],
.form-group input[type="password"],
.form-group input[type="tel"],
.form-group input[type="search"] {
  width: 100%;
  padding: 8px 12px;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 14px;
  box-sizing: border-box;
}

.form-group input:focus {
  outline: 2px solid #007bff;
  outline-offset: 2px;
  border-color: #007bff;
}

.checkbox-group label {
  display: flex;
  align-items: flex-start;
  font-weight: normal;
  cursor: pointer;
}

.checkbox-group input[type="checkbox"] {
  margin-right: 8px;
  margin-top: 2px;
}

button[type="submit"] {
  background: #007bff;
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
  font-size: 16px;
  cursor: pointer;
  width: 100%;
}

button[type="submit"]:hover {
  background: #0056b3;
}

button[type="submit"]:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.search-group {
  display: flex;
  flex-direction: column;
  gap: 5px;
}
</style>

Az elérhető név „E-mail cím” – tökéletesen megegyezik a látható címkével. A label for attribútuma megfelelően kapcsolja össze a címkét az input mezővel.

2. Aria-labelled by használata látható szövegre hivatkozva

<!-- Jó: aria-labelledby hivatkozás látható szövegre -->
<div class="felhasznalo-profil">
  <h2 id="profil-cim">Felhasználói profil szerkesztése</h2>
  
  <div class="profil-form">
    <span id="nev-cimke">Teljes név</span>
    <input type="text" 
           aria-labelledby="nev-cimke" 
           value="Kiss János"
           class="profil-input">
    <!-- Az elérhető név "Teljes név" - megegyezik a span szövegével -->
    
    <span id="eletkor-cimke">Életkor</span>
    <input type="number" 
           aria-labelledby="eletkor-cimke" 
           value="25"
           min="18" max="100"
           class="profil-input">
    <!-- Az elérhető név "Életkor" - megegyezik a span szövegével -->
  </div>
  
  <div class="action-buttons">
    <span id="mentes-szoveg">Változtatások mentése</span>
    <button aria-labelledby="mentes-szoveg" class="primary-button">
      💾 Változtatások mentése
    </button>
    <!-- Az elérhető név tartalmazza a "Változtatások mentése" szöveget -->
  </div>
</div>

<!-- Jó: Komplex navigáció aria-labelledby-jal -->
<nav class="oldal-navigacio">
  <h2 id="nav-cim">Fő navigáció</h2>
  
  <ul aria-labelledby="nav-cim">
    <li>
      <span id="fooldal-szoveg">Főoldal</span>
      <a href="/" aria-labelledby="fooldal-szoveg">🏠 Főoldal</a>
    </li>
    
    <li>
      <span id="termekek-szoveg">Termékek böngészése</span>
      <a href="/termekek" aria-labelledby="termekek-szoveg">🛍️ Termékek böngészése</a>
    </li>
    
    <li>
      <span id="kapcsolat-szoveg">Kapcsolatfelvétel</span>
      <a href="/kapcsolat" aria-labelledby="kapcsolat-szoveg">📞 Kapcsolatfelvétel</a>
    </li>
  </ul>
</nav>

<!-- Jó: Adattábla aria-labelledby címkékkel -->
<div class="termek-tablazat">
  <h3 id="tablazat-cim">Termékek listája</h3>
  
  <table aria-labelledby="tablazat-cim">
    <thead>
      <tr>
        <th id="termek-nev">Termék neve</th>
        <th id="termek-ar">Ár (Ft)</th>
        <th id="termek-keszlet">Készlet</th>
        <th id="termek-muvelet">Műveletek</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Laptop Acer Aspire</td>
        <td>299.990</td>
        <td>5 db</td>
        <td>
          <span id="szerkeszt-laptop">Laptop Acer Aspire szerkesztése</span>
          <button aria-labelledby="szerkeszt-laptop" class="edit-btn">
            ✏️ Szerkesztés
          </button>
          
          <span id="torles-laptop">Laptop Acer Aspire törlése</span>
          <button aria-labelledby="torles-laptop" class="delete-btn">
            🗑️ Törlés
          </button>
        </td>
      </tr>
    </tbody>
  </table>
</div>

<style>
.felhasznalo-profil {
  max-width: 500px;
  margin: 20px auto;
  padding: 20px;
  border: 1px solid #dee2e6;
  border-radius: 8px;
  background: white;
}

.profil-form {
  display: grid;
  grid-template-columns: 150px 1fr;
  gap: 10px 15px;
  align-items: center;
  margin: 20px 0;
}

.profil-form span {
  font-weight: bold;
  color: #495057;
}

.profil-input {
  padding: 8px 12px;
  border: 1px solid #ced4da;
  border-radius: 4px;
  font-size: 14px;
}

.profil-input:focus {
  outline: 2px solid #007bff;
  outline-offset: 2px;
  border-color: #007bff;
}

.action-buttons {
  margin-top: 20px;
  text-align: center;
}

.action-buttons span {
  display: block;
  margin-bottom: 10px;
  font-weight: bold;
  color: #495057;
}

.primary-button {
  background: #28a745;
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
  font-size: 16px;
  cursor: pointer;
}

.primary-button:hover {
  background: #218838;
}

.primary-button:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.oldal-navigacio {
  background: #f8f9fa;
  padding: 20px;
  border-radius: 8px;
  margin: 20px auto;
  max-width: 600px;
}

.oldal-navigacio ul {
  list-style: none;
  padding: 0;
  margin: 10px 0 0 0;
}

.oldal-navigacio li {
  margin-bottom: 10px;
  display: flex;
  align-items: center;
  gap: 10px;
}

.oldal-navigacio span {
  font-weight: bold;
  color: #495057;
  min-width: 150px;
}

.oldal-navigacio a {
  text-decoration: none;
  padding: 8px 16px;
  background: #007bff;
  color: white;
  border-radius: 4px;
  font-size: 14px;
}

.oldal-navigacio a:hover {
  background: #0056b3;
}

.oldal-navigacio a:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.termek-tablazat {
  margin: 20px auto;
  max-width: 800px;
}

.termek-tablazat table {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid #dee2e6;
}

.termek-tablazat th,
.termek-tablazat td {
  padding: 12px;
  text-align: left;
  border: 1px solid #dee2e6;
}

.termek-tablazat th {
  background: #e9ecef;
  font-weight: bold;
}

.edit-btn, .delete-btn {
  margin: 0 5px;
  padding: 5px 10px;
  border: none;
  border-radius: 3px;
  font-size: 12px;
  cursor: pointer;
}

.edit-btn {
  background: #17a2b8;
  color: white;
}

.delete-btn {
  background: #dc3545;
  color: white;
}

.edit-btn:hover {
  background: #138496;
}

.delete-btn:hover {
  background: #c82333;
}

.edit-btn:focus, .delete-btn:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

/* Elrejtjük a span elemeket vizuálisan, de elérhetők maradnak */
.termek-tablazat span,
.action-buttons span:first-child,
.oldal-navigacio span,
.profil-form span {
  /* Ezek láthatók maradnak ebben a példában a bemutató kedvéért */
}
</style>

Az aria-labelled by hivatkozik a látható szövegre, így az elérhető név tartalmazza a „Változtatások mentése” szöveget, amely megegyezik a gomb tartalmával.

3. Aria-label használata látható címke szöveggel

<!-- Jó: Aria-label tartalmazza a látható szöveget -->
<div class="interface-gombok">
  <h3>Felhasználói felület vezérlők</h3>
  
  <!-- Bezárás gomb - X látható, de teljes leírás az aria-label-ben -->
  <div class="modal-header">
    <h4>Ablak címe</h4>
    <button class="close-button" 
            aria-label="Ablak bezárása - X">
      X
    </button>
    <!-- Az elérhető név "Ablak bezárása - X" tartalmazza a látható "X" szöveget -->
  </div>
  
  <!-- Ikon gombok leíró aria-label-lel -->
  <div class="icon-buttons">
    <button class="icon-btn" aria-label="Mentés - 💾">
      💾
    </button>
    <!-- Az elérhető név "Mentés - 💾" tartalmazza a látható emoji-t -->
    
    <button class="icon-btn" aria-label="Nyomtatás - 🖨️">
      🖨️
    </button>
    <!-- Az elérhető név "Nyomtatás - 🖨️" tartalmazza a látható emoji-t -->
    
    <button class="icon-btn" aria-label="Beállítások - ⚙️">
      ⚙️
    </button>
    <!-- Az elérhető név "Beállítások - ⚙️" tartalmazza a látható emoji-t -->
  </div>
  
  <!-- Szöveges gombok kiegészítő információval -->
  <div class="text-buttons">
    <button aria-label="Mentés (Ctrl+S)">Mentés</button>
    <!-- Az elérhető név "Mentés (Ctrl+S)" tartalmazza a látható "Mentés" szót -->
    
    <button aria-label="Törlés - visszavonhatatlan művelet">Törlés</button>
    <!-- Az elérhető név "Törlés - visszavonhatatlan művelet" tartalmazza a látható "Törlés" szót -->
    
    <button aria-label="Küldés - form adatok elküldése">Küldés</button>
    <!-- Az elérhető név "Küldés - form adatok elküldése" tartalmazza a látható "Küldés" szót -->
  </div>
</div>

<!-- Jó: Linkek aria-label-lel kiegészítve -->
<div class="linkek-kiegeszitett">
  <h3>Kiegészített linkek</h3>
  
  <ul class="dokumentum-lista">
    <li>
      <a href="/eves-jelentes-2023.pdf" 
         aria-label="Éves jelentés 2023 - PDF letöltése">
        Éves jelentés 2023
      </a>
      <!-- Az elérhető név tartalmazza a "Éves jelentés 2023" látható szöveget -->
    </li>
    
    <li>
      <a href="/uzleti-terv.docx" 
         aria-label="Üzleti terv - Word dokumentum letöltése">
        Üzleti terv
      </a>
      <!-- Az elérhető név tartalmazza az "Üzleti terv" látható szöveget -->
    </li>
    
    <li>
      <a href="mailto:info@ceg.hu" 
         aria-label="E-mail küldése - info@ceg.hu">
        info@ceg.hu
      </a>
      <!-- Az elérhető név tartalmazza a látható e-mail címet -->
    </li>
  </ul>
</div>

<!-- Jó: Kereső mezők kiegészítő információval -->
<div class="kereses-mezo-bovitett">
  <h3>Speciális keresőmezők</h3>
  
  <div class="search-container">
    <label for="termek-kereses">Termék keresése</label>
    <input type="search" 
           id="termek-kereses"
           name="product_search"
           aria-label="Termék keresése - írj be termék nevet vagy kódot"
           placeholder="pl: laptop, egér, billentyűzet...">
    <!-- Az elérhető név tartalmazza a "Termék keresése" látható címkét -->
    <button type="submit" aria-label="Keresés indítása - enter vagy klikk">
      Keresés
    </button>
    <!-- Az elérhető név tartalmazza a "Keresés" látható szöveget -->
  </div>
  
  <div class="filter-container">
    <label for="kategoria-filter">Kategória szűrő</label>
    <select id="kategoria-filter" 
            aria-label="Kategória szűrő - válassz kategóriát a szűréshez">
      <option value="">Minden kategória</option>
      <option value="laptop">Laptopok</option>
      <option value="eger">Egerek</option>
      <option value="billentyuzet">Billentyűzetek</option>
    </select>
    <!-- Az elérhető név tartalmazza a "Kategória szűrő" látható címkét -->
  </div>
</div>

<style>
.interface-gombok, .linkek-kiegeszitett, .kereses-mezo-bovitett {
  max-width: 600px;
  margin: 20px auto;
  padding: 20px;
  border: 1px solid #dee2e6;
  border-radius: 8px;
  background: #f8f9fa;
}

.modal-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 15px;
  background: white;
  border: 1px solid #dee2e6;
  border-radius: 4px;
  margin-bottom: 20px;
}

.modal-header h4 {
  margin: 0;
  color: #495057;
}

.close-button {
  background: #dc3545;
  color: white;
  border: none;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  font-size: 16px;
  font-weight: bold;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}

.close-button:hover {
  background: #c82333;
}

.close-button:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.icon-buttons {
  display: flex;
  gap: 10px;
  margin-bottom: 20px;
}

.icon-btn {
  background: #007bff;
  color: white;
  border: none;
  width: 50px;
  height: 50px;
  border-radius: 8px;
  font-size: 24px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}

.icon-btn:hover {
  background: #0056b3;
}

.icon-btn:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.text-buttons {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}

.text-buttons button {
  background: #6c757d;
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
  font-size: 14px;
  cursor: pointer;
}

.text-buttons button:hover {
  background: #5a6268;
}

.text-buttons button:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.dokumentum-lista {
  list-style: none;
  padding: 0;
  margin: 10px 0;
}

.dokumentum-lista li {
  margin-bottom: 10px;
}

.dokumentum-lista a {
  display: inline-block;
  padding: 10px 15px;
  background: #17a2b8;
  color: white;
  text-decoration: none;
  border-radius: 4px;
  transition: background 0.2s ease;
}

.dokumentum-lista a:hover {
  background: #138496;
}

.dokumentum-lista a:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.search-container, .filter-container {
  margin-bottom: 15px;
  display: flex;
  flex-direction: column;
  gap: 5px;
}

.search-container label, .filter-container label {
  font-weight: bold;
  color: #495057;
}

.search-container input, .filter-container select {
  padding: 8px 12px;
  border: 1px solid #ced4da;
  border-radius: 4px;
  font-size: 14px;
}

.search-container input:focus, .filter-container select:focus {
  outline: 2px solid #007bff;
  outline-offset: 2px;
  border-color: #007bff;
}

.search-container button {
  background: #28a745;
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
  font-size: 16px;
  cursor: pointer;
  margin-top: 10px;
}

.search-container button:hover {
  background: #218838;
}

.search-container button:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}
</style>

A gomb vizuálisan „X”-et mutat, de az aria-label „Ablak bezárása – X” tartalmazza a látható szöveget és kiegészíti a funkcióval. Ez biztosítja a konzisztenciát.

4. Eltérések elkerülése a látható és címkék mögé bevitt szövegek között

<!-- Jó: Konzisztens látható és elérhető nevek -->
<div class="konzisztens-cimkek">
  <h3>Konzisztens címkézés példái</h3>
  
  <!-- Egyszerű gombok - teljes egyezés -->
  <div class="egyszerű-gombok">
    <button aria-label="Mentés">Mentés</button>
    <!-- Az elérhető név "Mentés" pontosan megegyezik a gomb szövegével -->
    
    <button aria-label="Mégse">Mégse</button>
    <!-- Az elérhető név "Mégse" pontosan megegyezik a gomb szövegével -->
    
    <button aria-label="Törlés">Törlés</button>
    <!-- Az elérhető név "Törlés" pontosan megegyezik a gomb szövegével -->
  </div>
  
  <!-- Form vezérlők - label egyezések -->
  <form class="form-konzisztens">
    <div class="field-group">
      <label for="felhasznalo-nev">Felhasználónév</label>
      <input type="text" 
             id="felhasznalo-nev" 
             name="username"
             aria-label="Felhasználónév">
      <!-- Elérhető név és label szöveg tökéletesen egyezik -->
    </div>
    
    <div class="field-group">
      <label for="email-address">E-mail cím</label>
      <input type="email" 
             id="email-address" 
             name="email"
             aria-label="E-mail cím">
      <!-- Elérhető név és label szöveg tökéletesen egyezik -->
    </div>
    
    <div class="field-group">
      <label for="birth-date">Születési dátum</label>
      <input type="date" 
             id="birth-date" 
             name="birthdate"
             aria-label="Születési dátum">
      <!-- Elérhető név és label szöveg tökéletesen egyezik -->
    </div>
  </form>
  
  <!-- Linkek - konzisztens szövegek -->
  <nav class="konzisztens-nav">
    <ul>
      <li>
        <a href="/kezdolap" aria-label="Kezdőlap">Kezdőlap</a>
        <!-- Elérhető név és link szöveg egyezik -->
      </li>
      <li>
        <a href="/termekek" aria-label="Termékek">Termékek</a>
        <!-- Elérhető név és link szöveg egyezik -->
      </li>
      <li>
        <a href="/szolgaltatasok" aria-label="Szolgáltatások">Szolgáltatások</a>
        <!-- Elérhető név és link szöveg egyezik -->
      </li>
      <li>
        <a href="/kapcsolat" aria-label="Kapcsolat">Kapcsolat</a>
        <!-- Elérhető név és link szöveg egyezik -->
      </li>
    </ul>
  </nav>
  
  <!-- Választható elemek - radio és checkbox -->
  <fieldset class="valaszthato-elemek">
    <legend>Előnyben részesített kapcsolatfelvételi mód</legend>
    
    <div class="radio-group">
      <label for="email-contact">
        <input type="radio" 
               id="email-contact" 
               name="contact_method" 
               value="email"
               aria-label="E-mail kapcsolat">
        E-mail kapcsolat
      </label>
      <!-- Elérhető név és label szöveg egyezik -->
    </div>
    
    <div class="radio-group">
      <label for="phone-contact">
        <input type="radio" 
               id="phone-contact" 
               name="contact_method" 
               value="phone"
               aria-label="Telefonos kapcsolat">
        Telefonos kapcsolat
      </label>
      <!-- Elérhető név és label szöveg egyezik -->
    </div>
    
    <div class="checkbox-group">
      <label for="newsletter-subscribe">
        <input type="checkbox" 
               id="newsletter-subscribe" 
               name="newsletter"
               aria-label="Hírlevél feliratkozás">
        Hírlevél feliratkozás
      </label>
      <!-- Elérhető név és label szöveg egyezik -->
    </div>
  </fieldset>
</div>

<style>
.konzisztens-cimkek {
  max-width: 600px;
  margin: 20px auto;
  padding: 20px;
  border: 1px solid #28a745;
  border-radius: 8px;
  background: #f8fff9;
}

.egyszerű-gombok {
  display: flex;
  gap: 10px;
  margin-bottom: 30px;
  flex-wrap: wrap;
}

.egyszerű-gombok button {
  background: #28a745;
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
  font-size: 14px;
  cursor: pointer;
  font-weight: bold;
}

.egyszerű-gombok button:hover {
  background: #218838;
}

.egyszerű-gombok button:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.form-konzisztens {
  margin-bottom: 30px;
}

.field-group {
  margin-bottom: 15px;
  display: flex;
  flex-direction: column;
  gap: 5px;
}

.field-group label {
  font-weight: bold;
  color: #495057;
}

.field-group input {
  padding: 8px 12px;
  border: 1px solid #ced4da;
  border-radius: 4px;
  font-size: 14px;
}

.field-group input:focus {
  outline: 2px solid #28a745;
  outline-offset: 2px;
  border-color: #28a745;
}

.konzisztens-nav ul {
  list-style: none;
  padding: 0;
  margin: 0 0 30px 0;
  display: flex;
  gap: 15px;
  flex-wrap: wrap;
}

.konzisztens-nav a {
  text-decoration: none;
  padding: 10px 15px;
  background: #17a2b8;
  color: white;
  border-radius: 4px;
  font-weight: bold;
  transition: background 0.2s ease;
}

.konzisztens-nav a:hover {
  background: #138496;
}

.konzisztens-nav a:focus {
  outline: 2px solid #ffc107;
  outline-offset: 2px;
}

.valaszthato-elemek {
  border: 1px solid #ced4da;
  border-radius: 4px;
  padding: 15px;
  background: white;
}

.valaszthato-elemek legend {
  font-weight: bold;
  color: #495057;
  padding: 0 10px;
}

.radio-group, .checkbox-group {
  margin-bottom: 10px;
}

.radio-group label, .checkbox-group label {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-weight: normal;
}

.radio-group input, .checkbox-group input {
  margin: 0;
}

.radio-group input:focus, .checkbox-group input:focus {
  outline: 2px solid #28a745;
  outline-offset: 2px;
}
</style>

Az elérhető név „Mentés” pontosan megegyezik a gomb szövegével. Nincs zavaró eltérés a látott és hallott címke között.

Hibás megoldás

Látható címke nincs benne az elérhető névben

<!-- Rossz: Eltérés a látható és elérhető név között -->
<div class="rossz-cimkek">
  <h3>Hibás címkézési példák</h3>
  
  <!-- Rossz: Látható "X" de elérhető név "Bezárás" -->
  <button aria-label="Bezárás">X</button>
  <!-- Hiba: A látható "X" szöveg nincs benne az elérhető névben -->
  
  <!-- Rossz: Látható "Küldés" de elérhető név "Elküld" -->
  <button aria-label="Elküld">Küldés</button>
  <!-- Hiba: Az elérhető név nem tartalmazza a látható "Küldés" szót -->
  
  <!-- Rossz: Látható "Regisztráció" de elérhető név "Feliratkozás" -->
  <button aria-label="Feliratkozás">Regisztráció</button>
  <!-- Hiba: Teljesen más szöveg az elérhető névben -->
  
  <!-- Rossz: Látható link "Termékek" de elérhető név "Áruk" -->
  <a href="/termekek" aria-label="Áruk böngészése">Termékek</a>
  <!-- Hiba: A "Termékek" szó nincs az elérhető névben -->
</div>

Probléma: A látható „X” szöveg nincs benne az elérhető névben („Bezárás”), ami zavart okoz a képernyőolvasó felhasználók számára.

Placeholder szöveg használata egyetlen címkeként

<!-- Rossz: Csak placeholder, nincs proper label -->
<div class="rossz-placeholder">
  <h3>Hibás placeholder használat</h3>
  
  <!-- Rossz: Csak placeholder szöveg -->
  <input type="text" placeholder="Felhasználónév" name="username">
  <!-- Hiba: A placeholder látható, de nem elérhető név -->
  
  <!-- Rossz: Placeholder mint egyetlen címke -->
  <input type="email" placeholder="E-mail cím megadása" name="email">
  <!-- Hiba: Nincs megfelelő elérhető név -->
  
  <!-- Rossz: Placeholder és rossz aria-label kombináció -->
  <input type="password" 
         placeholder="Jelszó" 
         name="password"
         aria-label="Titkos kód">
  <!-- Hiba: A látható "Jelszó" nincs az elérhető névben ("Titkos kód") -->
  
  <!-- Rossz: Üres aria-label placeholder mellett -->
  <input type="tel" 
         placeholder="Telefonszám" 
         name="phone"
         aria-label="">
  <!-- Hiba: Üres elérhető név, csak placeholder -->
</div>

Probléma: A placeholder látható, de nem képezi a megfelelő elérhető nevet. A placeholder szöveg eltűnhet, amikor a felhasználó gépelni kezd.

Képek vagy ikonok címkeként elérhető szöveg nélkül

<!-- Rossz: Kép/ikon gombok megfelelő elérhető név nélkül -->
<div class="rossz-ikonok">
  <h3>Hibás ikon/kép gombok</h3>
  
  <!-- Rossz: Üres alt attribútum -->
  <button>
    <img src="save-icon.png" alt="">
  </button>
  <!-- Hiba: Nincs elérhető név, mert az alt üres -->
  
  <!-- Rossz: Hiányzó alt attribútum -->
  <button>
    <img src="delete-icon.png">
  </button>
  <!-- Hiba: Nincs alt attribútum, nincs elérhető név -->
  
  <!-- Rossz: Icon font elérhető név nélkül -->
  <button>
    <i class="fas fa-trash"></i>
  </button>
  <!-- Hiba: Az ikon látható, de nincs elérhető név -->
  
  <!-- Rossz: SVG ikon title/desc nélkül -->
  <button>
    <svg width="24" height="24" viewBox="0 0 24 24">
      <path d="M3 6h18v2H3V6zm0 5h18v2H3v-2zm0 5h18v2H3v-2z"></path>
    </svg>
  </button>
  <!-- Hiba: SVG ikon látható (hamburger menü), de nincs elérhető név -->
  
  <!-- Rossz: Emoji gomb aria-label nélkül -->
  <button>❤️</button>
  <!-- Hiba: Az emoji látható, de az elérhető név lehet hogy nem érthető -->
  
  <!-- Rossz: Kép link alt nélkül -->
  <a href="/kezdolap">
    <img src="logo.png">
  </a>
  <!-- Hiba: Logo látható, de nincs elérhető név -->
</div>

Probléma: Nincs elérhető név, mert az alt üres és nincs egyéb címkézés. A képernyőolvasók nem tudják bejelenteni a gomb funkcióját.

Helytelen ARIA használat, amely felülírja a látható címkét

<!-- Rossz: ARIA címke nem egyezik a látható szöveggel -->
<div class="rossz-aria">
  <h3>Hibás ARIA címkézés</h3>
  
  <!-- Rossz: Label és aria-label ütközés -->
  <label for="kereses-input">Keresés</label>
  <input id="kereses-input" aria-label="Találás">
  <!-- Hiba: Látható "Keresés", elérhető "Találás" -->
  
  <!-- Rossz: Gomb szöveg és aria-label eltérés -->
  <button aria-label="Eltávolítás">Törlés</button>
  <!-- Hiba: Látható "Törlés", elérhető "Eltávolítás" -->
  
  <!-- Rossz: aria-labelledby rossz elemre mutat -->
  <span id="wrong-label">Mentés</span>
  <button aria-labelledby="wrong-label">Küldés</button>
  <!-- Hiba: Gomb "Küldés", de elérhető név "Mentés" -->
  
  <!-- Rossz: aria-label felülír látható szöveget -->
  <a href="/kapcsolat" aria-label="Elérhetőségek">Kapcsolat</a>
  <!-- Hiba: Látható "Kapcsolat", elérhető "Elérhetőségek" -->
  
  <!-- Rossz: Komplex aria-labelledby rossz hivatkozásokkal -->
  <span id="wrong-action">Szerkesztés</span>
  <span id="user-name">Kiss János</span>
  <button aria-labelledby="wrong-action user-name">Törlés</button>
  <!-- Hiba: Gomb "Törlés", de elérhető név "Szerkesztés Kiss János" -->
  
  <!-- Rossz: title attribútum és látható szöveg eltérése -->
  <button title="Bezárás">X</button>
  <!-- Hiba: A title nem elérhető név, és nem tartalmazza az "X"-et -->
</div>

Probléma: Az elérhető név „Találás”, a látható címke „Keresés” között eltérés van, ami megzavarja a felhasználókat.

Többszörös címkézési problémák

<!-- Rossz: Zavaró többszörös címkézés -->
<div class="rossz-tobbszoros">
  <h3>Hibás többszörös címkézés</h3>
  
  <!-- Rossz: Dupla label különböző szövegekkel -->
  <label for="name-field">Név</label>
  <input id="name-field" aria-label="Teljes név megadása">
  <label for="name-field">Teljes név</label>
  <!-- Hiba: Két label, eltérő szövegek, zavaró -->
  
  <!-- Rossz: aria-label és aria-labelledby együtt ütközve -->
  <span id="confusing-label">E-mail</span>
  <input aria-label="Elektronikus levelezési cím" 
         aria-labelledby="confusing-label">
  <!-- Hiba: Két különböző ARIA címkézés egyszerre -->
  
  <!-- Rossz: Label + aria-label + placeholder mind más -->
  <label for="multi-confuse">Telefonszám</label>
  <input id="multi-confuse" 
         aria-label="Mobil szám" 
         placeholder="Hívószám">
  <!-- Hiba: Három különböző "címke" -->
  
  <!-- Rossz: Gomb szöveg + title + aria-label mind eltér -->
  <button title="Dokumentum letöltése" 
          aria-label="Fájl mentése">
    Letöltés
  </button>
  <!-- Hiba: "Letöltés", "Dokumentum letöltése", "Fájl mentése" -->
  
  <!-- Rossz: aria-describedby-t címkeként használni -->
  <span id="not-label">Jelszó megadása</span>
  <input type="password" aria-describedby="not-label">
  <!-- Hiba: aria-describedby nem címke, és nincs proper label -->
</div>

<style>
.rossz-cimkek, .rossz-placeholder, .rossz-ikonok, .rossz-aria, .rossz-tobbszoros {
  max-width: 600px;
  margin: 20px auto;
  padding: 20px;
  border: 2px solid #dc3545;
  border-radius: 8px;
  background: #f8d7da;
}

.rossz-cimkek h3, .rossz-placeholder h3, .rossz-ikonok h3, .rossz-aria h3, .rossz-tobbszoros h3 {
  color: #721c24;
  margin-top: 0;
}

.rossz-cimkek button, .rossz-aria button, .rossz-tobbszoros button {
  background: #dc3545;
  color: white;
  border: none;
  padding: 8px 16px;
  border-radius: 4px;
  margin: 5px;
  cursor: pointer;
}

.rossz-placeholder input, .rossz-aria input, .rossz-tobbszoros input {
  display: block;
  width: 100%;
  padding: 8px 12px;
  margin: 8px 0;
  border: 2px solid #dc3545;
  border-radius: 4px;
  box-sizing: border-box;
}

.rossz-ikonok button {
  background: #6c757d;
  color: white;
  border: none;
  padding: 10px;
  margin: 5px;
  border-radius: 4px;
  cursor: pointer;
}

.rossz-ikonok img {
  width: 20px;
  height: 20px;
}

.rossz-aria a, .rossz-cimkek a {
  color: #721c24;
  text-decoration: underline;
  margin: 5px;
  display: inline-block;
}

.rossz-tobbszoros label {
  display: block;
  font-weight: bold;
  color: #721c24;
  margin: 5px 0;
}
</style>

Probléma: Többszörös, egymásnak ellentmondó címkézés zavart okoz. A „Név”, „Teljes név megadása” és „Teljes név” mind különböző címkék ugyanarra a mezőre.

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