2.5.7 - Drag and drop mozdulatok

Röviden a szabványpontról

A WCAG 2.5.5 (Target Size) előírja, hogy minden funkcionalitás, amely húzási mozgásokat igényel, egyszerű mutatóval is működtethető legyen húzás nélkül. Ez azt jelenti, hogy a felhasználóknak ugyanazt az eredményt el kell tudniuk érni egyszerűbb mutató műveletekkel, mint az érintés vagy kattintás, anélkül hogy húzniuk kellene. Ez minden interaktív tartalomra vonatkozik, ahol húzást használnak elemek manipulálására: csúszkák, húzd-és-ejtsd felületek vagy átméretezhető komponensek.

Mire vonatkozik: Minden interaktív tartalomra weboldalak vagy alkalmazások esetén, ahol húzást használnak elemek manipulálására: csúszkák, húzd-és-ejtsd felületek, átméretezhető komponensek.

Cél: Biztosítani, hogy azok a felhasználók is teljes értékűen tudják használni az interakciókat, akik számára a húzó mozdulatok végrehajtása nehézséget okoz – például mozgássérülés, remegés, korlátozott kézügyesség, ideiglenes sérülés, kis képernyőn való használat vagy olyan segítő technológia miatt, amely nem képes a húzást szimulálni.

Kiket érint

Elsődleges felhasználók: Mozgássérült személyek, korlátozott kézügyességgel rendelkezők, remegéssel élők vagy segítő technológiákat használók, amelyek nem tudják könnyen szimulálni a húzást.

Másodlagos előnyök: Javítja a használhatóságot érintőeszközök felhasználóinak, ideiglenes sérülésekkel élőknek és korlátozott környezetben lévő felhasználóknak, ahol a húzás nehézkes (egykézzel való használat, kis képernyős eszközök).

Tesztelés

  1. Csak billentyűzetes teszt: Győződj meg róla, hogy a húzási funkcionalitás teljesen működtethető billentyűzet bevitelekkel (nyíl billentyűk, Tab, Enter, Space)
  2. Egypontos mutató teszt: Próbáld meg a húzási funkciót egyszerű érintéssel vagy kattintással aktiválni és befejezni húzás helyett
  3. Segítő technológia teszt: Használj képernyőolvasókat vagy kapcsoló eszközöket annak megerősítésére, hogy a funkció elérhető húzási gesztusok nélkül
  4. Érintőeszköz teszt: Érintőképernyőn próbáld meg a funkciót húzás nélkül végrehajtani, például gombok érintésével vagy alternatív vezérlőkkel
  5. Automatizált eszközök: Használj akadálymentességi tesztelő eszközöket, amelyek jelzik a csak húzással működő műveleteket, amelyeknek nincs alternatívája (megjegyzés: a manuális tesztelés itt kritikus)

Jó megoldások

1. Csúszka vezérlő alternatív gombokkal

<!-- Jó: Csúszka húzással és gombokkal is működtethető -->
<div class="hangerő-vezérlo">
  <label for="hangerő-csuszka">Hangerő beállítása</label>
  
  <div class="csuszka-container">
    <button id="hangerő-csokkentes" 
            aria-label="Hangerő csökkentése"
            class="csuszka-gomb">
      🔉 -
    </button>
    
    <div class="csuszka-track">
      <input type="range" 
             id="hangerő-csuszka"
             role="slider"
             aria-valuemin="0" 
             aria-valuemax="100" 
             aria-valuenow="50"
             aria-describedby="hangerő-ertekek"
             class="csuszka-input">
      <div class="csuszka-jelolések">
        <span>0</span>
        <span>25</span>
        <span>50</span>
        <span>75</span>
        <span>100</span>
      </div>
    </div>
    
    <button id="hangerő-novelés" 
            aria-label="Hangerő növelése"
            class="csuszka-gomb">
      🔊 +
    </button>
  </div>
  
  <div id="hangerő-ertekek" class="ertek-kijelzés">
    Jelenlegi hangerő: <span id="hangerő-szam">50</span>%
  </div>
  
  <div class="gyors-beallitasok">
    <button onclick="hangerőBeallitas(0)" class="gyors-gomb">🔇 Némítás</button>
    <button onclick="hangerőBeallitas(25)" class="gyors-gomb">Alacsony</button>
    <button onclick="hangerőBeallitas(50)" class="gyors-gomb">Közepes</button>
    <button onclick="hangerőBeallitas(75)" class="gyors-gomb">Magas</button>
    <button onclick="hangerőBeallitas(100)" class="gyors-gomb">Maximum</button>
  </div>
</div>

<style>
.hangerő-vezérlo {
  max-width: 500px;
  margin: 20px auto;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  background: #f9f9f9;
}

.csuszka-container {
  display: flex;
  align-items: center;
  gap: 15px;
  margin: 15px 0;
}

.csuszka-gomb {
  padding: 10px 15px;
  background: #007bff;
  color: white;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  font-size: 16px;
  min-width: 60px;
}

.csuszka-gomb:hover {
  background: #0056b3;
}

.csuszka-gomb:focus {
  outline: 3px solid #ffbf47;
  outline-offset: 2px;
}

.csuszka-track {
  flex: 1;
  position: relative;
}

.csuszka-input {
  width: 100%;
  height: 8px;
  background: #ddd;
  border-radius: 4px;
  outline: none;
  appearance: none;
  cursor: pointer;
}

.csuszka-input::-webkit-slider-thumb {
  appearance: none;
  width: 20px;
  height: 20px;
  background: #007bff;
  border-radius: 50%;
  cursor: pointer;
}

.csuszka-input::-moz-range-thumb {
  width: 20px;
  height: 20px;
  background: #007bff;
  border-radius: 50%;
  cursor: pointer;
  border: none;
}

.csuszka-input:focus {
  box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.3);
}

.csuszka-jelolések {
  display: flex;
  justify-content: space-between;
  margin-top: 5px;
  font-size: 12px;
  color: #666;
}

.ertek-kijelzés {
  text-align: center;
  font-weight: bold;
  margin: 15px 0;
  padding: 10px;
  background: #e7f3ff;
  border-radius: 4px;
}

.gyors-beallitasok {
  display: flex;
  gap: 8px;
  justify-content: center;
  margin-top: 15px;
  flex-wrap: wrap;
}

.gyors-gomb {
  padding: 8px 12px;
  background: #28a745;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 12px;
}

.gyors-gomb:hover {
  background: #218838;
}

.gyors-gomb:focus {
  outline: 2px solid #ffbf47;
  outline-offset: 2px;
}
</style>

<script>
const hangerőCsuszka = document.getElementById('hangerő-csuszka');
const hangerőSzam = document.getElementById('hangerő-szam');
const csökkentésGomb = document.getElementById('hangerő-csokkentes');
const növelésGomb = document.getElementById('hangerő-novelés');

// Csúszka értékének frissítése
function hangerőFrissités() {
  const ertek = hangerőCsuszka.value;
  hangerőSzam.textContent = ertek;
  hangerőCsuszka.setAttribute('aria-valuenow', ertek);
  
  // Vizuális visszajelzés
  const szazalek = (ertek / 100) * 100;
  hangerőCsuszka.style.background = 
    `linear-gradient(to right, #007bff 0%, #007bff ${szazalek}%, #ddd ${szazalek}%, #ddd 100%)`;
}

// Csúszka eseménykezelők
hangerőCsuszka.addEventListener('input', hangerőFrissités);
hangerőCsuszka.addEventListener('change', hangerőFrissités);

// Gomb vezérlők
csökkentésGomb.addEventListener('click', function() {
  let jelenlegiErtek = parseInt(hangerőCsuszka.value);
  let ujErtek = Math.max(0, jelenlegiErtek - 5);
  hangerőCsuszka.value = ujErtek;
  hangerőFrissités();
  
  // Vizuális visszajelzés
  this.style.background = '#28a745';
  setTimeout(() => {
    this.style.background = '#007bff';
  }, 150);
});

növelésGomb.addEventListener('click', function() {
  let jelenlegiErtek = parseInt(hangerőCsuszka.value);
  let ujErtek = Math.min(100, jelenlegiErtek + 5);
  hangerőCsuszka.value = ujErtek;
  hangerőFrissités();
  
  // Vizuális visszajelzés
  this.style.background = '#28a745';
  setTimeout(() => {
    this.style.background = '#007bff';
  }, 150);
});

// Gyors beállítások funkciója
function hangerőBeallitas(ertek) {
  hangerőCsuszka.value = ertek;
  hangerőFrissités();
}

// Billentyűzet támogatás a csúszkához
hangerőCsuszka.addEventListener('keydown', function(e) {
  let jelenlegiErtek = parseInt(this.value);
  let ujErtek = jelenlegiErtek;
  
  switch(e.key) {
    case 'ArrowLeft':
    case 'ArrowDown':
      e.preventDefault();
      ujErtek = Math.max(0, jelenlegiErtek - 5);
      break;
    case 'ArrowRight':
    case 'ArrowUp':
      e.preventDefault();
      ujErtek = Math.min(100, jelenlegiErtek + 5);
      break;
    case 'Home':
      e.preventDefault();
      ujErtek = 0;
      break;
    case 'End':
      e.preventDefault();
      ujErtek = 100;
      break;
    case 'PageDown':
      e.preventDefault();
      ujErtek = Math.max(0, jelenlegiErtek - 10);
      break;
    case 'PageUp':
      e.preventDefault();
      ujErtek = Math.min(100, jelenlegiErtek + 10);
      break;
  }
  
  if (ujErtek !== jelenlegiErtek) {
    this.value = ujErtek;
    hangerőFrissités();
  }
});

// Kezdeti állapot beállítása
document.addEventListener('DOMContentLoaded', function() {
  hangerőFrissités();
});
</script>

A csúszka húzással állítható, de a +/- gombok és gyors beállítás gombok alternatívát biztosítanak. Teljes billentyűzet támogatással rendelkezik.

2. Húzd-és-ejtsd billentyűzet támogatással

<!-- Jó: Lista átrendezése húzással és billentyűzettel -->
<div class="teendok-lista-container">
  <h2>Teendők lista - átrendezhető</h2>
  
  <div class="vezerlesi-utasitasok">
    <p><strong>Átrendezési módok:</strong></p>
    <ul>
      <li>🖱️ Húzd az elemeket új pozícióba

A lista elemek húzással és billentyűzettel (Space + nyíl billentyűk) is átrendezhetők. A pozíció gombok egyszerű alternatívát biztosítanak.

3. Átméretezhető panel fogásokkal és gombokkal

<!-- Jó: Panel átméretezése húzással és gombokkal -->
<div class="atmeretezheto-container">
  <div class="panel-fejlec">
    <h2>Átméretezhető tartalom panel</h2>
    <div class="meretezesi-vezerlok">
      <button id="szelesseg-csokkentes" 
              aria-label="Panel szélességének csökkentése"
              class="meretezesi-gomb">
        ↔️ -
      </button>
      <span class="meret-kijelzes" id="szelesseg-ertek">400px</span>
      <button id="szelesseg-noveles" 
              aria-label="Panel szélességének növelése"
              class="meretezesi-gomb">
        ↔️ +
      </button>
      
      <button id="magassag-csokkentes" 
              aria-label="Panel magasságának csökkentése"
              class="meretezesi-gomb">
        ↕️ -
      </button>
      <span class="meret-kijelzes" id="magassag-ertek">300px</span>
      <button id="magassag-noveles" 
              aria-label="Panel magasságának növelése"
              class="meretezesi-gomb">
        ↕️ +
      </button>
    </div>
  </div>
  
  <div id="atmeretezheto-panel" 
       class="atmeretezheto-panel"
       role="region"
       aria-label="Átméretezhető tartalom panel"
       tabindex="0"
       aria-describedby="panel-utasitasok">
    
    <div class="panel-tartalom">
      <h3>Panel tartalom</h3>
      <p>Ez a panel átméretezhető többféle módon:</p>
      <ul>
        <li>Húzd a sarkokat vagy oldalakat</li>
        <li>Használd a fejlécben lévő gombokat</li>
        <li>Billentyűzet: fókuszáld a panelt, majd Ctrl + nyíl billentyűk</li>
      </ul>
      <p>A tartalom automatikusan alkalmazkodik a panel méretéhez.</p>
    </div>
    
    <!-- Átméretezési fogások -->
    <div class="atmeretezesi-fogas top-left" 
         data-irany="nw" 
         aria-label="Panel átméretezése bal felső sarokból"
         tabindex="0"></div>
    <div class="atmeretezesi-fogas top-right" 
         data-irany="ne" 
         aria-label="Panel átméretezése jobb felső sarokból"
         tabindex="0"></div>
    <div class="atmeretezesi-fogas bottom-left" 
         data-irany="sw" 
         aria-label="Panel átméretezése bal alsó sarokból"
         tabindex="0"></div>
    <div class="atmeretezesi-fogas bottom-right" 
         data-irany="se" 
         aria-label="Panel átméretezése jobb alsó sarokból"
         tabindex="0"></div>
    <div class="atmeretezesi-fogas right" 
         data-irany="e" 
         aria-label="Panel szélességének állítása"
         tabindex="0"></div>
    <div class="atmeretezesi-fogas bottom" 
         data-irany="s" 
         aria-label="Panel magasságának állítása"
         tabindex="0"></div>
  </div>
  
  <div id="panel-utasitasok" class="utasitasok-szoveg">
    Átméretezés: Húzd a széleket/sarkokat, vagy használd a gombokat. Billentyűzet: Ctrl + nyíl billentyűk.
  </div>
  
  <div class="gyors-meretek">
    <h4>Gyors méretek:</h4>
    <button onclick="panelMeret(300, 200)" class="gyors-meret-gomb">Kicsi</button>
    <button onclick="panelMeret(400, 300)" class="gyors-meret-gomb">Közepes</button>
    <button onclick="panelMeret(600, 400)" class="gyors-meret-gomb">Nagy</button>
    <button onclick="panelMeret(800, 500)" class="gyors-meret-gomb">Extra nagy</button>
  </div>
</div>

<style>
.atmeretezheto-container {
  max-width: 900px;
  margin: 20px auto;
  padding: 20px;
  background: #f8f9fa;
  border-radius: 8px;
}

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

.meretezesi-vezerlok {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.meretezesi-gomb {
  padding: 8px 12px;
  background: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 14px;
  min-width: 40px;
}

.meretezesi-gomb:hover {
  background: #0056b3;
}

.meretezesi-gomb:focus {
  outline: 2px solid #ffbf47;
  outline-offset: 2px;
}

.meret-kijelzes {
  padding: 5px 10px;
  background: #e9ecef;
  border-radius: 3px;
  font-weight: bold;
  font-size: 12px;
  min-width: 60px;
  text-align: center;
}

.atmeretezheto-panel {
  position: relative;
  width: 400px;
  height: 300px;
  background: white;
  border: 2px solid #007bff;
  border-radius: 8px;
  overflow: hidden;
  margin: 0 auto;
  resize: both;
}

.atmeretezheto-panel:focus {
  outline: 3px solid #ffbf47;
  outline-offset: 2px;
}

.panel-tartalom {
  padding: 20px;
  height: 100%;
  overflow-y: auto;
}

.atmeretezesi-fogas {
  position: absolute;
  background: #007bff;
  cursor: pointer;
}

.atmeretezesi-fogas:hover {
  background: #0056b3;
}

.atmeretezesi-fogas:focus {
  outline: 2px solid #ffbf47;
  outline-offset: 2px;
  background: #0056b3;
}

/* Sarok fogások */
.top-left, .top-right, .bottom-left, .bottom-right {
  width: 12px;
  height: 12px;
  border-radius: 50%;
}

.top-left {
  top: -6px;
  left: -6px;
  cursor: nw-resize;
}

.top-right {
  top: -6px;
  right: -6px;
  cursor: ne-resize;
}

.bottom-left {
  bottom: -6px;
  left: -6px;
  cursor: sw-resize;
}

.bottom-right {
  bottom: -6px;
  right: -6px;
  cursor: se-resize;
}

/* Oldal fogások */
.right {
  top: 50%;
  right: -4px;
  width: 8px;
  height: 40px;
  transform: translateY(-50%);
  cursor: e-resize;
  border-radius: 4px;
}

.bottom {
  bottom: -4px;
  left: 50%;
  width: 40px;
  height: 8px;
  transform: translateX(-50%);
  cursor: s-resize;
  border-radius: 4px;
}

.utasitasok-szoveg {
  margin: 15px 0;
  padding: 10px;
  background: #e7f3ff;
  border-radius: 4px;
  font-size: 14px;
  color: #0066cc;
}

.gyors-meretek {
  margin-top: 20px;
  text-align: center;
}

.gyors-meretek h4 {
  margin-bottom: 10px;
}

.gyors-meret-gomb {
  padding: 8px 16px;
  background: #28a745;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  margin: 0 5px;
  font-size: 14px;
}

.gyors-meret-gomb:hover {
  background: #218838;
}

.gyors-meret-gomb:focus {
  outline: 2px solid #ffbf47;
  outline-offset: 2px;
}
</style>

<script>
const panel = document.getElementById('atmeretezheto-panel');
const szelessegErtek = document.getElementById('szelesseg-ertek');
const magassagErtek = document.getElementById('magassag-ertek');

let jelenlegiSzelesseg = 400;
let jelenlegiMagassag = 300;
let huzasAktiv = false;
let huzasSajan = null;

// Gomb vezérlők
document.getElementById('szelesseg-csokkentes').addEventListener('click', () => {
  jelenlegiSzelesseg = Math.max(200, jelenlegiSzelesseg - 20);
  panelMeretFrissites();
});

document.getElementById('szelesseg-noveles').addEventListener('click', () => {
  jelenlegiSzelesseg = Math.min(800, jelenlegiSzelesseg + 20);
  panelMeretFrissites();
});

document.getElementById('magassag-csokkentes').addEventListener('click', () => {
  jelenlegiMagassag = Math.max(150, jelenlegiMagassag - 20);
  panelMeretFrissites();
});

document.getElementById('magassag-noveles').addEventListener('click', () => {
  jelenlegiMagassag = Math.min(600, jelenlegiMagassag + 20);
  panelMeretFrissites();
});

// Panel méret frissítése
function panelMeretFrissites() {
  panel.style.width = jelenlegiSzelesseg + 'px';
  panel.style.height = jelenlegiMagassag + 'px';
  szelessegErtek.textContent = jelenlegiSzelesseg + 'px';
  magassagErtek.textContent = jelenlegiMagassag + 'px';
}

// Gyors méret beállítás
function panelMeret(szelesseg, magassag) {
  jelenlegiSzelesseg = szelesseg;
  jelenlegiMagassag = magassag;
  panelMeretFrissites();
}

// Húzási eseménykezelők a fogásokhoz
document.querySelectorAll('.atmeretezesi-fogas').forEach(fogas => {
  fogas.addEventListener('mousedown', huzasKezdet);
  fogas.addEventListener('keydown', billentyuzetesAtmeretez);
});

function huzasKezdet(e) {
  huzasAktiv = true;
  huzasSajan = e.target.getAttribute('data-irany');
  
  document.addEventListener('mousemove', huzasMozgas);
  document.addEventListener('mouseup', huzasVege);
  
  e.preventDefault();
}

function huzasMozgas(e) {
  if (!huzasAktiv) return;
  
  const rect = panel.getBoundingClientRect();
  
  switch(huzasSajan) {
    case 'se': // jobb alsó sarok
      jelenlegiSzelesseg = Math.max(200, e.clientX - rect.left);
      jelenlegiMagassag = Math.max(150, e.clientY - rect.top);
      break;
    case 'e': // jobb oldal
      jelenlegiSzelesseg = Math.max(200, e.clientX - rect.left);
      break;
    case 's': // alsó oldal
      jelenlegiMagassag = Math.max(150, e.clientY - rect.top);
      break;
  }
  
  panelMeretFrissites();
}

function huzasVege() {
  huzasAktiv = false;
  huzasSajan = null;
  document.removeEventListener('mousemove', huzasMozgas);
  document.removeEventListener('mouseup', huzasVege);
}

// Billentyűzetes átméretezés a fogásoknál
function billentyuzetesAtmeretez(e) {
  const irany = e.target.getAttribute('data-irany');
  let lepesek = e.shiftKey ? 5 : 1;
  
  switch(e.key) {
    case 'ArrowRight':
      e.preventDefault();
      if (irany.includes('e')) {
        jelenlegiSzelesseg = Math.min(800, jelenlegiSzelesseg + (10 * lepesek));
        panelMeretFrissites();
      }
      break;
    case 'ArrowLeft':
      e.preventDefault();
      if (irany.includes('e')) {
        jelenlegiSzelesseg = Math.max(200, jelenlegiSzelesseg - (10 * lepesek));
        panelMeretFrissites();
      }
      break;
    case 'ArrowDown':
      e.preventDefault();
      if (irany.includes('s')) {
        jelenlegiMagassag = Math.min(600, jelenlegiMagassag + (10 * lepesek));
        panelMeretFrissites();
      }
      break;
    case 'ArrowUp':
      e.preventDefault();
      if (irany.includes('s')) {
        jelenlegiMagassag = Math.max(150, jelenlegiMagassag - (10 * lepesek));
        panelMeretFrissites();
      }
      break;
  }
}

// Panel billentyűzetes átméretezése
panel.addEventListener('keydown', function(e) {
  if (e.ctrlKey) {
    let lepesek = e.shiftKey ? 5 : 1;
    
    switch(e.key) {
      case 'ArrowRight':
        e.preventDefault();
        jelenlegiSzelesseg = Math.min(800, jelenlegiSzelesseg + (10 * lepesek));
        panelMeretFrissites();
        break;
      case 'ArrowLeft':
        e.preventDefault();
        jelenlegiSzelesseg = Math.max(200, jelenlegiSzelesseg - (10 * lepesek));
        panelMeretFrissites();
        break;
      case 'ArrowDown':
        e.preventDefault();
        jelenlegiMagassag = Math.min(600, jelenlegiMagassag + (10 * lepesek));
        panelMeretFrissites();
        break;
      case 'ArrowUp':
        e.preventDefault();
        jelenlegiMagassag = Math.max(150, jelenlegiMagassag - (10 * lepesek));
        panelMeretFrissites();
        break;
    }
  }
});

// Kezdeti állapot beállítása
document.addEventListener('DOMContentLoaded', function() {
  panelMeretFrissites();
});
</script>

A panel húzható fogásokkal átméretezhető, de gombok és billentyűzet (Ctrl + nyíl billentyűk) alternatívát biztosítanak. Gyors méret gombok is rendelkezésre állnak.

Helytelen megoldások

Csak húzható csúszka

<!-- Rossz: Csúszka csak húzással állítható -->
<div class="rossz-csuszka-container">
  <label for="rossz-csuszka">Fényerő beállítása</label>
  <div class="csuszka-track">
    <input type="range" 
           id="rossz-csuszka"
           role="slider"
           aria-valuemin="0" 
           aria-valuemax="100" 
           aria-valuenow="50"
           class="csak-huzhatò-csuszka">
  </div>
  <!-- Nincs +/- gomb, nincs billentyűzet támogatás -->
</div>

<style>
.csak-huzhatò-csuszka {
  width: 100%;
  height: 8px;
  background: #ddd;
  border-radius: 4px;
  outline: none;
  appearance: none;
  cursor: pointer;
}

/* Rossz: Billentyűzet navigáció letiltva */
.csak-huzhatò-csuszka:focus {
  outline: none; /* Rossz: nincs fókusz jelző */
}

.csak-huzhatò-csuszka::-webkit-slider-thumb {
  appearance: none;
  width: 20px;
  height: 20px;
  background: #007bff;
  border-radius: 50%;
  cursor: pointer;
}

/* Rossz: Nincs billentyűzet eseménykezelő */
</style>

<script>
// Rossz: Csak húzás eseménykezelő, nincs gomb alternatíva
document.getElementById('rossz-csuszka').addEventListener('input', function() {
  console.log('Érték: ' + this.value);
  // Csak húzással változtatható
});

// Rossz: Nincs billentyűzet támogatás
// Rossz: Nincsenek +/- gombok
// Rossz: Nincs gyors beállítás lehetőség
</script>

Probléma: A csúszka csak húzással állítható, nincs +/- gomb vagy billentyűzet támogatás. Ez kizárja azokat a felhasználókat, akik nem tudnak húzni.

Húzd-és-ejtsd billentyűzet alternatíva nélkül

<!-- Rossz: Csak húzással átrendezhető lista -->
<ul id="rossz-lista" class="csak-huzhatò-lista">
  <li draggable="true" class="lista-elem">1. elem</li>
  <li draggable="true" class="lista-elem">2. elem</li>
  <li draggable="true" class="lista-elem">3. elem</li>
  <li draggable="true" class="lista-elem">4. elem</li>
</ul>

<style>
.csak-huzhatò-lista {
  list-style: none;
  padding: 0;
}

.lista-elem {
  padding: 15px;
  margin: 5px 0;
  background: #f8f9fa;
  border: 1px solid #dee2e6;
  cursor: move;
}

.lista-elem:hover {
  background: #e9ecef;
}

/* Rossz: Nincs tabindex, nincs fókusz */
/* Rossz: Nincsenek pozíció vezérlő gombok */
</style>

<script>
// Rossz: Csak húzd-és-ejtsd eseménykezelők
document.querySelectorAll('.lista-elem').forEach(elem => {
  elem.addEventListener('dragstart', function(e) {
    e.dataTransfer.setData('text/plain', e.target.outerHTML);
    e.target.style.opacity = '0.5';
  });
  
  elem.addEventListener('dragover', function(e) {
    e.preventDefault();
  });
  
  elem.addEventListener('drop', function(e) {
    e.preventDefault();
    // Csak húzással működik
  });
  
  elem.addEventListener('dragend', function(e) {
    e.target.style.opacity = '1';
  });
});

// Rossz: Nincs billentyűzet eseménykezelő
// Rossz: Nincs alternatív átrendezési mód
// Rossz: Nincs fókusz kezelés
// Rossz: Nincs ARIA támogatás
</script>

Probléma: A lista csak húzással rendezhető át, nincs billentyűzet támogatás vagy alternatív gombok. A segítő technológiák nem tudják használni.

Átméretezhető elem alternatív vezérlők nélkül

<!-- Rossz: Csak húzással átméretezhető panel -->
<div id="rossz-panel" 
     class="csak-huzhatò-panel" 
     aria-label="Átméretezhető panel">
  <div class="panel-tartalom">
    <h3>Csak húzással átméretezhető</h3>
    <p>Ez a panel csak a jobb alsó sarok húzásával méretezhető át.</p>
  </div>
  
  <!-- Rossz: Csak egy átméretezési fogas, nincs alternatíva -->
  <div class="csak-huzhatò-fogas"></div>
</div>

<style>
.csak-huzhatò-panel {
  position: relative;
  width: 300px;
  height: 200px;
  background: white;
  border: 1px solid #ddd;
  border-radius: 6px;
  margin: 20px auto;
}

.panel-tartalom {
  padding: 20px;
}

.csak-huzhatò-fogas {
  position: absolute;
  bottom: 0;
  right: 0;
  width: 20px;
  height: 20px;
  background: #666;
  cursor: se-resize;
  
  /* Rossz: Nincs tabindex, nem fókuszálható */
  /* Rossz: Nincs aria-label */
}

.csak-huzhatò-fogas:hover {
  background: #333;
}

/* Rossz: Nincs :focus stílus */
</style>

<script>
let huzas = false;

// Rossz: Csak egér eseménykezelők
document.querySelector('.csak-huzhatò-fogas').addEventListener('mousedown', function(e) {
  huzas = true;
  
  document.addEventListener('mousemove', function(e) {
    if (huzas) {
      const panel = document.getElementById('rossz-panel');
      const rect = panel.getBoundingClientRect();
      panel.style.width = (e.clientX - rect.left) + 'px';
      panel.style.height = (e.clientY - rect.top) + 'px';
    }
  });
  
  document.addEventListener('mouseup', function() {
    huzás = false;
  });
});

// Rossz: Nincs billentyűzet támogatás
// Rossz: Nincsenek +/- gombok
// Rossz: Nincs gyors méret beállítás
// Rossz: Nincs fókusz kezelés
// Rossz: Nincs ARIA támogatás
</script>

Probléma: A panel csak húzással méretezhető át, nincs billentyűzet támogatás, gombok vagy bármilyen alternatív vezérlési mód. Nem elérhető segítő technológiákkal.

Rejtett húzási funkcionalitás

<!-- Rossz: Rejtett húzási funkciók dokumentáció nélkül -->
<div class="titokzatos-interface">
  <h2>Képgaléria</h2>
  <div class="kep-grid">
    <img src="/kep1.jpg" alt="Kép 1" class="huzhatò-kep">
    <img src="/kep2.jpg" alt="Kép 2" class="huzhatò-kep">
    <img src="/kep3.jpg" alt="Kép 3" class="huzhatò-kep">
    <img src="/kep4.jpg" alt="Kép 4" class="huzhatò-kep">
  </div>
  <!-- Nincs információ arról, hogy a képek húzhatók -->
  <!-- Nincs alternatív vezérlés -->
</div>

<style>
.kep-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 10px;
  padding: 20px;
}

.huzhatò-kep {
  width: 100%;
  height: 200px;
  object-fit: cover;
  border-radius: 6px;
  /* Rossz: Nincs vizuális jel, hogy húzható */
}

.huzhatò-kep:hover {
  opacity: 0.8;
  /* Rossz: Nem egyértelmű, hogy mi történik */
}
</style>

<script>
// Rossz: Rejtett húzási funkcionalitás
document.querySelectorAll('.huzhatò-kep').forEach(kep => {
  kep.draggable = true;
  
  kep.addEventListener('dragstart', function(e) {
    // Rejtett funkció: képek átrendezhetők
    // De nincs visual cue, nincs dokumentáció
    e.dataTransfer.setData('text/plain', e.target.src);
  });
  
  kep.addEventListener('dragover', function(e) {
    e.preventDefault();
  });
  
  kep.addEventListener('drop', function(e) {
    e.preventDefault();
    // Titokzatos swap funkció
    const forras = e.dataTransfer.getData('text/plain');
    const celSrc = e.target.src;
    e.target.src = forras;
    
    // Rossz: Nem található elem visszaállítása
    document.querySelectorAll('.huzhatò-kep').forEach(otherKep => {
      if (otherKep.src === forras) {
        otherKep.src = celSrc;
      }
    });
  });
});

// Rossz: Nincs billentyűzet támogatás
// Rossz: Nincs alternatív módszer
// Rossz: Nincs felhasználói dokumentáció
// Rossz: Nincs vizuális feedback
// Rossz: Nincs undo funkció
</script>

Probléma: A képek húzható funkcionalitása rejtett, nincs vizuális jelzés, dokumentáció vagy alternatív vezérlési mód. A felhasználók nem is tudják, hogy itt egy módosítható elem van.

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