2.5.4 - Mozgásaktivált vezérlés

Röviden a szabványpontról

A WCAG 2.5.4 (Motion Actuation) előírja, hogy minden funkcionalitás, amely eszközmozgással, vagy felhasználói mozgással működtethető (például eszköz rázása, döntése vagy forgatása), alternatív módon is elérhető legyen felhasználói felület elemeken keresztül. Ez azt jelenti, hogy minden mozgással vezérelt funkciónak van egy alternatív aktiválási módja, amely nem igényel fizikai mozgást.

Mire vonatkozik: Minden webes tartalomra és alkalmazásra, amely mozgásalapú interakciókat használ, különösen mobileszközökön vagy érzékelőkkel rendelkező eszközökön (gyorsulásmérő, giroszkóp).

Cél: Biztosítani, hogy azok a felhasználók, akik nem tudnak bizonyos fizikai mozgásokat végrehajtani:

  • Mozgássérülések vagy korlátozott mobilitás miatt
  • Segítő technológiákat használnak
  • Olyan helyzetben vannak, ahol a mozgás nem praktikus
  • Minden funkcionalitáshoz hozzáférjenek mozgás nélkül is

Kiket érint

Elsődleges felhasználók: Mozgássérült vagy korlátozott fizikai mobilitással rendelkező személyek, akik nem tudnak olyan gesztusokat végrehajtani, mint az eszköz rázása, döntése vagy forgatása. Ide tartoznak a kézsérültek, remegéssel élők és kerekesszéket használók.

Másodlagos előnyök: Olyan helyzetekben lévő felhasználók esetén, ahol a mozgás kényelmetlen, vagy lehetetlen (pl. zsúfolt helyen eszköz stabilan tartása), valamint segítő technológiákat használók, amelyek nem támogatják a mozgásbevitelt jelenthet megoldást.

Tesztelés

  1. Mozgásalapú vezérlők azonosítása: Keress az oldalon vagy alkalmazásban mozgásalapú funkciókat, mint a rázás-frissítés vagy döntés-görgetés
  2. Alternatív vezérlők tesztelése: Próbáld meg ugyanazt a funkcionalitást billentyűzettel vagy képernyőn lévő vezérlővel aktiválni. Győződj meg róla, hogy van látható és működtethető UI elem, amely helyettesíti a mozgásos műveletet
  3. Segítő technológia tesztelés: Használj segítő eszközöket (képernyőolvasó, kapcsoló eszközök) annak ellenőrzésére, hogy az alternatív vezérlők elérhetők-e
  4. Érzékelő nélküli tesztelés: Teszteld mozgásérzékelő nélküli eszközökön vagy kikapcsolt érzékelőkkel, hogy a mozgásalapú funkciók továbbra is működnek-e
  5. Kód áttekintés: Ellenőrizd a dokumentációt és kódot deviceorientation, devicemotion vagy shake eseményfigyelőkért, és győződj meg róla, hogy léteznek tartalék UI vezérlők

Jó megoldások

1. Rázás visszavonáshoz gombbal is működtetve

<!-- Jó: Látható visszavonás gomb a rázás gesztus mellett -->
<div class="szerkeszto-fejlec">
  <h1>Szöveg szerkesztő</h1>
  <div class="muveletek">
    <button id="visszavonas-gomb" 
            aria-label="Utolsó művelet visszavonása"
            class="visszavonas-btn">
      ↶ Visszavonás
    </button>
    <button id="megismetles-gomb" 
            aria-label="Művelet megismétlése"
            class="megismetles-btn">
      ↷ Megismétlés
    </button>
  </div>
</div>

<div class="szerkeszto-terület">
  <textarea id="szoveg-mezo" 
            placeholder="Kezdj el írni..."
            aria-describedby="utasitas-szoveg"></textarea>
  <div id="utasitas-szoveg" class="sr-only">
    Rázd meg az eszközt a visszavonáshoz, vagy használd a visszavonás gombot
  </div>
</div>

<div class="mozgas-info">
  <p><strong>Tipp:</strong> Rázd meg az eszközt a gyors visszavonáshoz, vagy használd a ↶ gombot.</p>
</div>

<style>
.szerkeszto-fejlec {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 15px;
  background: #f8f9fa;
  border-bottom: 1px solid #dee2e6;
}

.muveletek {
  display: flex;
  gap: 10px;
}

.visszavonas-btn, .megismetles-btn {
  padding: 8px 16px;
  border: 1px solid #6c757d;
  background: white;
  border-radius: 4px;
  cursor: pointer;
  font-size: 14px;
}

.visszavonas-btn:hover, .megismetles-btn:hover {
  background: #e9ecef;
}

.visszavonas-btn:focus, .megismetles-btn:focus {
  outline: 2px solid #0066cc;
  outline-offset: 2px;
}

.szerkeszto-terület {
  padding: 20px;
}

#szoveg-mezo {
  width: 100%;
  height: 300px;
  padding: 15px;
  border: 1px solid #ced4da;
  border-radius: 4px;
  font-family: Arial, sans-serif;
  font-size: 14px;
  resize: vertical;
}

#szoveg-mezo:focus {
  outline: 2px solid #0066cc;
  border-color: #0066cc;
}

.mozgas-info {
  padding: 15px;
  background: #e7f3ff;
  border-left: 4px solid #0066cc;
  margin: 20px;
  border-radius: 4px;
}

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

<script>
let szerkeszto_elozmeny = [];
let elozmeny_index = -1;

// Mozgás eseményfigyelő rázáshoz
let utolso_mozgas = 0;
let razas_kuszob = 15;

window.addEventListener('devicemotion', function(event) {
  if (event.accelerationIncludingGravity) {
    let gyorsulas = event.accelerationIncludingGravity;
    let mozgas_ero = Math.abs(gyorsulas.x) + Math.abs(gyorsulas.y) + Math.abs(gyorsulas.z);
    
    if (mozgas_ero > razas_kuszob) {
      let most = new Date().getTime();
      if (most - utolso_mozgas > 1000) { // 1 másodperc cooldown
        document.getElementById('visszavonas-gomb').click(); // Gomb aktiválása
        utolso_mozgas = most;
      }
    }
  }
});

// Visszavonás gomb funkcionalitás
document.getElementById('visszavonas-gomb').addEventListener('click', function() {
  visszavonas_mukodes();
});

// Megismétlés gomb funkcionalitás  
document.getElementById('megismetles-gomb').addEventListener('click', function() {
  megismetles_mukodes();
});

function visszavonas_mukodes() {
  const szoveg_mezo = document.getElementById('szoveg-mezo');
  
  if (elozmeny_index > 0) {
    elozmeny_index--;
    szoveg_mezo.value = szerkeszto_elozmeny[elozmeny_index];
    
    // Vizuális visszajelzés
    document.getElementById('visszavonas-gomb').style.background = '#28a745';
    document.getElementById('visszavonas-gomb').style.color = 'white';
    setTimeout(() => {
      document.getElementById('visszavonas-gomb').style.background = 'white';
      document.getElementById('visszavonas-gomb').style.color = 'black';
    }, 200);
    
    console.log('Visszavonás végrehajtva');
  }
}

function megismetles_mukodes() {
  const szoveg_mezo = document.getElementById('szoveg-mezo');
  
  if (elozmeny_index < szerkeszto_elozmeny.length - 1) {
    elozmeny_index++;
    szoveg_mezo.value = szerkeszto_elozmeny[elozmeny_index];
    
    // Vizuális visszajelzés
    document.getElementById('megismetles-gomb').style.background = '#28a745';
    document.getElementById('megismetles-gomb').style.color = 'white';
    setTimeout(() => {
      document.getElementById('megismetles-gomb').style.background = 'white';
      document.getElementById('megismetles-gomb').style.color = 'black';
    }, 200);
    
    console.log('Megismétlés végrehajtva');
  }
}

// Szöveg változás követése az előzményekhez
document.getElementById('szoveg-mezo').addEventListener('input', function() {
  const ertek = this.value;
  
  // Előzmény hozzáadása késleltetéssel
  setTimeout(() => {
    if (szerkeszto_elozmeny[elozmeny_index] !== ertek) {
      szerkeszto_elozmeny = szerkeszto_elozmeny.slice(0, elozmeny_index + 1);
      szerkeszto_elozmeny.push(ertek);
      elozmeny_index = szerkeszto_elozmeny.length - 1;
    }
  }, 500);
});

// Kezdeti állapot beállítása
szerkeszto_elozmeny.push('');
elozmeny_index = 0;
</script>

A rázás gesztus visszavonást indít, de a látható gomb alternatívát biztosít azoknak, akik nem tudják megrázni az eszközt. A gomb billentyűzettel is elérhető.

2. Döntés görgetéshez alternatívával

<!-- Jó: Görgetési alternatívák döntés gesztus mellett -->
<div class="galeria-container">
  <div class="galeria-fejlec">
    <h2>Képgaléria</h2>
    <div class="gorgetesi-vezerlok">
      <button id="balra-gomb" 
              aria-label="Előző kép"
              class="nav-gomb">
        ← Előző
      </button>
      <button id="jobbra-gomb" 
              aria-label="Következő kép"
              class="nav-gomb">
        Következő →
      </button>
    </div>
  </div>
  
  <div id="gorgetesi-terulet" 
       class="kep-lista" 
       tabindex="0" 
       role="region"
       aria-label="Görgetelhető képgaléria"
       aria-describedby="gorgetesi-utasitas">
    
    <div class="kep-elem">
      <img src="/kepek/kep1.jpg" alt="Természeti táj naplementével">
      <p>Gyönyörű naplementés táj</p>
    </div>
    
    <div class="kep-elem">
      <img src="/kepek/kep2.jpg" alt="Hegyi völgy ködben">
      <p>Ködös hegyi völgy</p>
    </div>
    
    <div class="kep-elem">
      <img src="/kepek/kep3.jpg" alt="Óceán hullámokkal">
      <p>Nyugodt óceán hullámok</p>
    </div>
    
    <div class="kep-elem">
      <img src="/kepek/kep4.jpg" alt="Erdei ösvény">
      <p>Erdei sétaútvonal</p>
    </div>
  </div>
  
  <div id="gorgetesi-utasitas" class="utasitas-szoveg">
    Döntsd az eszközt jobbra vagy balra a görgetéshez, vagy használd a nyíl gombokat. 
    Billentyűzettel: nyíl billentyűk vagy Tab.
  </div>
</div>

<style>
.galeria-container {
  max-width: 800px;
  margin: 20px auto;
  border: 1px solid #ddd;
  border-radius: 8px;
  overflow: hidden;
}

.galeria-fejlec {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 15px 20px;
  background: #f8f9fa;
  border-bottom: 1px solid #dee2e6;
}

.gorgetesi-vezerlok {
  display: flex;
  gap: 10px;
}

.nav-gomb {
  padding: 8px 16px;
  background: #007bff;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 14px;
}

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

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

.nav-gomb:disabled {
  background: #6c757d;
  cursor: not-allowed;
}

.kep-lista {
  display: flex;
  overflow-x: auto;
  scroll-behavior: smooth;
  padding: 20px;
  gap: 20px;
  background: white;
}

.kep-lista:focus {
  outline: 2px solid #0066cc;
  outline-offset: -2px;
}

.kep-elem {
  flex: 0 0 250px;
  text-align: center;
}

.kep-elem img {
  width: 100%;
  height: 200px;
  object-fit: cover;
  border-radius: 8px;
  border: 1px solid #ddd;
}

.kep-elem p {
  margin-top: 10px;
  font-size: 14px;
  color: #666;
}

.utasitas-szoveg {
  padding: 15px 20px;
  background: #e7f3ff;
  color: #0066cc;
  font-size: 14px;
  border-top: 1px solid #bee5eb;
}
</style>

<script>
let gorgetesi_sebesseg = 200;
let dontesi_kuszob = 20; // fok
let utolso_dontesi_ido = 0;

// Eszköz orientáció figyelése döntéshez
window.addEventListener('deviceorientation', function(event) {
  if (event.gamma !== null) {
    let dontesi_szog = event.gamma; // bal-jobb döntés
    let most = new Date().getTime();
    
    // Jobbra döntés
    if (dontesi_szog > dontesi_kuszob && most - utolso_dontesi_ido > 1000) {
      document.getElementById('jobbra-gomb').click();
      utolso_dontesi_ido = most;
    }
    // Balra döntés  
    else if (dontesi_szog < -dontesi_kuszob && most - utolso_dontesi_ido > 1000) {
      document.getElementById('balra-gomb').click();
      utolso_dontesi_ido = most;
    }
  }
});

// Gomb vezérlők
document.getElementById('jobbra-gomb').addEventListener('click', function() {
  gorgetés_jobbra();
});

document.getElementById('balra-gomb').addEventListener('click', function() {
  gorgetés_balra();
});

function gorgetés_jobbra() {
  const terulet = document.getElementById('gorgetesi-terulet');
  terulet.scrollLeft += gorgetesi_sebesseg;
  
  // Vizuális visszajelzés
  document.getElementById('jobbra-gomb').style.background = '#28a745';
  setTimeout(() => {
    document.getElementById('jobbra-gomb').style.background = '#007bff';
  }, 150);
}

function gorgetés_balra() {
  const terulet = document.getElementById('gorgetesi-terulet');
  terulet.scrollLeft -= gorgetesi_sebesseg;
  
  // Vizuális visszajelzés
  document.getElementById('balra-gomb').style.background = '#28a745';
  setTimeout(() => {
    document.getElementById('balra-gomb').style.background = '#007bff';
  }, 150);
}

// Billentyűzet támogatás a görgetési területhez
document.getElementById('gorgetesi-terulet').addEventListener('keydown', function(e) {
  switch(e.key) {
    case 'ArrowLeft':
      e.preventDefault();
      gorgetés_balra();
      break;
    case 'ArrowRight':
      e.preventDefault();
      gorgetés_jobbra();
      break;
    case 'Home':
      e.preventDefault();
      this.scrollLeft = 0;
      break;
    case 'End':
      e.preventDefault();
      this.scrollLeft = this.scrollWidth;
      break;
  }
});

// Görgetés állapot figyelése a gombok engedélyezéséhez/letiltásához
document.getElementById('gorgetesi-terulet').addEventListener('scroll', function() {
  const balra_gomb = document.getElementById('balra-gomb');
  const jobbra_gomb = document.getElementById('jobbra-gomb');
  
  // Balra gomb letiltása, ha a bal szélen vagyunk
  balra_gomb.disabled = this.scrollLeft === 0;
  
  // Jobbra gomb letiltása, ha a jobb szélen vagyunk
  jobbra_gomb.disabled = this.scrollLeft >= (this.scrollWidth - this.clientWidth);
});

// Kezdeti állapot beállítása
document.addEventListener('DOMContentLoaded', function() {
  document.getElementById('gorgetesi-terulet').dispatchEvent(new Event('scroll'));
});
</script>

A felhasználók döntéssel vagy gombokkal is görgethetnek. A billentyűzetes navigáció szintén támogatott, és vizuális visszajelzések segítik a használatot.

3. Forgatás nézet váltáshoz alternatívával

<!-- Jó: Nézet váltás gombbal és forgatással -->
<div class="nezet-valtó-container">
  <div class="fejlec-vezerlok">
    <h2>Termék áttekintés</h2>
    <button id="nezet-valto-gomb" 
            aria-label="Nézet váltása: álló/fektetett"
            class="nezet-gomb">
      <span id="nezet-ikon">📱</span> Álló nézet
    </button>
  </div>
  
  <div id="tartalom-terulet" class="allo-nezet">
    <div class="termek-info">
      <h3>Okostelefon XYZ</h3>
      <div class="termek-kepek">
        <img src="/termekek/telefon1.jpg" alt="Telefon elölnézet">
        <img src="/termekek/telefon2.jpg" alt="Telefon hátlap">
      </div>
      <div class="termek-leiras">
        <p>Modern okostelefon kiváló kamerával és hosszú akkumulátor élettartammal.</p>
        <ul>
          <li>6.1" OLED kijelző</li>
          <li>128GB tárhely</li>
          <li>Dual kamera rendszer</li>
          <li>Víz- és porálló</li>
        </ul>
      </div>
    </div>
  </div>
  
  <div class="mozgas-utasitas">
    <p><strong>Tipp:</strong> Forgasd el az eszközt a nézet váltáshoz, vagy használd a 📱 gombot.</p>
  </div>
</div>

<style>
.nezet-valtó-container {
  max-width: 900px;
  margin: 20px auto;
  border: 1px solid #ddd;
  border-radius: 8px;
  overflow: hidden;
  background: white;
}

.fejlec-vezerlok {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 15px 20px;
  background: #f8f9fa;
  border-bottom: 1px solid #dee2e6;
}

.nezet-gomb {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  background: #007bff;
  color: white;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  font-size: 14px;
  transition: all 0.3s ease;
}

.nezet-gomb:hover {
  background: #0056b3;
  transform: translateY(-1px);
}

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

.nezet-gomb:active {
  transform: translateY(0);
}

.tartalom-terulet {
  padding: 20px;
  transition: all 0.5s ease;
}

/* Álló nézet stílusok */
.allo-nezet .termek-info {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.allo-nezet .termek-kepek {
  display: flex;
  flex-direction: column;
  gap: 15px;
  align-items: center;
}

.allo-nezet .termek-kepek img {
  width: 100%;
  max-width: 300px;
  height: auto;
  border-radius: 8px;
  border: 1px solid #ddd;
}

.allo-nezet .termek-leiras {
  text-align: left;
}

/* Fektetett nézet stílusok */
.fektetett-nezet .termek-info {
  display: flex;
  flex-direction: row;
  gap: 30px;
  align-items: flex-start;
}

.fektetett-nezet .termek-kepek {
  display: flex;
  flex-direction: row;
  gap: 15px;
  flex: 1;
}

.fektetett-nezet .termek-kepek img {
  width: 200px;
  height: 250px;
  object-fit: cover;
  border-radius: 8px;
  border: 1px solid #ddd;
}

.fektetett-nezet .termek-leiras {
  flex: 1;
  text-align: left;
}

.termek-leiras ul {
  padding-left: 20px;
}

.termek-leiras li {
  margin-bottom: 5px;
}

.mozgas-utasitas {
  padding: 15px 20px;
  background: #e7f3ff;
  color: #0066cc;
  font-size: 14px;
  border-top: 1px solid #bee5eb;
}

/* Responsive viselkedés */
@media (max-width: 768px) {
  .fektetett-nezet .termek-info {
    flex-direction: column;
  }
  
  .fektetett-nezet .termek-kepek {
    flex-direction: column;
    align-items: center;
  }
  
  .fektetett-nezet .termek-kepek img {
    width: 100%;
    max-width: 250px;
    height: auto;
  }
}
</style>

<script>
let jelenlegi_nezet = 'allo'; // 'allo' vagy 'fektetett'
let orientacio_kuszob = 45; // fok
let utolso_orientacio_valtás = 0;

// Eszköz orientáció figyelése forgatáshoz
window.addEventListener('deviceorientation', function(event) {
  if (event.beta !== null && event.gamma !== null) {
    let doltesi_szog = Math.abs(event.gamma); // eszköz dőlése
    let most = new Date().getTime();
    
    // Álló pozícióba forgatás
    if (doltesi_szog < orientacio_kuszob && jelenlegi_nezet === 'fektetett' && 
        most - utolso_orientacio_valtás > 1500) {
      nezet_valtas_allo();
      utolso_orientacio_valtás = most;
    }
    // Fektetett pozícióba forgatás
    else if (doltesi_szog > orientacio_kuszob && jelenlegi_nezet === 'allo' && 
             most - utolso_orientacio_valtás > 1500) {
      nezet_valtas_fektetett();
      utolso_orientacio_valtás = most;
    }
  }
});

// Nézet váltó gomb eseménykezelő
document.getElementById('nezet-valto-gomb').addEventListener('click', function() {
  if (jelenlegi_nezet === 'allo') {
    nezet_valtas_fektetett();
  } else {
    nezet_valtas_allo();
  }
});

function nezet_valtas_allo() {
  const tartalom = document.getElementById('tartalom-terulet');
  const gomb = document.getElementById('nezet-valto-gomb');
  const ikon = document.getElementById('nezet-ikon');
  
  tartalom.className = 'tartalom-terulet allo-nezet';
  jelenlegi_nezet = 'allo';
  
  // Gomb szöveg és ikon frissítése
  ikon.textContent = '📱';
  gomb.innerHTML = '<span id="nezet-ikon">📱</span> Álló nézet';
  
  // Vizuális visszajelzés
  gomb.style.background = '#28a745';
  setTimeout(() => {
    gomb.style.background = '#007bff';
  }, 300);
  
  console.log('Váltás álló nézetre');
}

function nezet_valtas_fektetett() {
  const tartalom = document.getElementById('tartalom-terulet');
  const gomb = document.getElementById('nezet-valto-gomb');
  const ikon = document.getElementById('nezet-ikon');
  
  tartalom.className = 'tartalom-terulet fektetett-nezet';
  jelenlegi_nezet = 'fektetett';
  
  // Gomb szöveg és ikon frissítése
  ikon.textContent = '📱';
  gomb.innerHTML = '<span id="nezet-ikon" style="transform: rotate(90deg); display: inline-block;">📱</span> Fektetett nézet';
  
  // Vizuális visszajelzés
  gomb.style.background = '#28a745';
  setTimeout(() => {
    gomb.style.background = '#007bff';
  }, 300);
  
  console.log('Váltás fektetett nézetre');
}

// Billentyűzet támogatás nézet váltáshoz
document.addEventListener('keydown', function(e) {
  // Ctrl + R a nézet váltáshoz
  if (e.ctrlKey && e.key === 'r') {
    e.preventDefault();
    document.getElementById('nezet-valto-gomb').click();
  }
});

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

Az eszköz forgatása válthat a nézetek között, de a gomb mindig elérhető alternatívát biztosít. Billentyűzet paranccsal (Ctrl+R) is elérhető a gyors váltás.

Helytelen megoldások

Csak mozgásos vezérlés, alternatíva nélkül

<!-- Rossz: Csak rázás frissítés, nincs gomb -->
<div class="lista-container">
  <h2>Hírek listája</h2>
  <div id="hirek-lista">
    <div class="hir-elem">Első hír...</div>
    <div class="hir-elem">Második hír...</div>
  </div>
  <p class="utasitas">Rázd meg az eszközt a frissítéshez!</p>
</div>

<script>
// Rossz: Csak mozgás esemény, nincs alternatív vezérlő
window.addEventListener('devicemotion', function(event) {
  if (detectShake(event)) {
    hirek_frissites(); // Csak rázással elérhető
  }
});

function detectShake(event) {
  if (event.accelerationIncludingGravity) {
    let gyorsulas = event.accelerationIncludingGravity;
    let mozgas_ero = Math.abs(gyorsulas.x) + Math.abs(gyorsulas.y) + Math.abs(gyorsulas.z);
    return mozgas_ero > 15;
  }
  return false;
}

function hirek_frissites() {
  // Frissítési logika, de csak rázással elérhető
  console.log('Hírek frissítve');
  location.reload(); // Rossz: teljes oldal újratöltése
}
</script>

Probléma: A funkció csak rázással érhető el, ami kizárja azokat a felhasználókat, akik nem tudják vagy nem szeretnék megrázni az eszközt.

Rejtett mozgásos vezérlés

<!-- Rossz: Titkos mozgásos funkciók dokumentáció nélkül -->
<div class="interaktiv-terkep">
  <h2>Térképnézet</h2>
  <div id="terkep-container"></div>
  <!-- Nincs információ a mozgásos vezérlésről -->
</div>

<script>
// Rossz: Rejtett funkciók, nincs alternatív elérés
window.addEventListener('deviceorientation', function(event) {
  if (event.gamma > 30) {
    terkep_nagyitas(); // Rejtett funkció
  }
  if (event.gamma < -30) {
    terkep_kicsinyites(); // Rejtett funkció
  }
  if (event.beta > 45) {
    terkep_reset(); // Rejtett funkció
  }
});

// Rossz: Dupla érintés helyett csak két ujjal való döntés
let dupla_dontesi_szamlalo = 0;
window.addEventListener('devicemotion', function(event) {
  if (event.rotationRate.alpha > 90) {
    dupla_dontési_szamlalo++;
    if (dupla_dontesi_szamlalo === 2) {
      titkos_menu_megnyitas(); // Nagyon rejtett funkció
      dupla_dontesi_szamlalo = 0;
    }
  }
});

function terkep_nagyitas() {
  // Nagyítás csak döntéssel
  console.log('Térkép nagyítva');
}

function terkep_kicsinyites() {
  // Kicsinyítés csak döntéssel
  console.log('Térkép kicsinyítve');
}

function terkep_reset() {
  // Reset csak előre döntéssel
  console.log('Térkép visszaállítva');
}

function titkos_menu_megnyitas() {
  // Titkos menü csak dupla döntéssel
  console.log('Titkos menü megnyitva');
}
</script>

Probléma: A mozgásos funkciók rejtettek, nincsenek dokumentálva, és nincs alternatív elérési mód. A felhasználók nem is tudnak róluk.

Nem testreszabható mozgás érzékenység

<!-- Rossz: Fix mozgás küszöbök, nincs beállítási lehetőség -->
<div class="jatek-vezerlok">
  <h2>Akció játék</h2>
  <div id="jatek-terület"></div>
</div>

<script>
// Rossz: Fix küszöb értékek, nem állíthatók
const FIX_RAZASI_KUSZOB = 20; // Túl magas sokaknál
const FIX_DONTESI_KUSZOB = 15; // Túl alacsony másoknál
const FIX_FORGÁSI_SEBESSEG = 5; // Nem mindenkinek megfelelő

// Rossz: Kényszerített mozgás vezérlés
window.addEventListener('devicemotion', function(event) {
  if (event.accelerationIncludingGravity) {
    let mozgas = Math.abs(event.accelerationIncludingGravity.x) + 
                 Math.abs(event.accelerationIncludingGravity.y) + 
                 Math.abs(event.accelerationIncludingGravity.z);
    
    if (mozgas > FIX_RAZASI_KUSZOB) {
      karakter_ugras(); // Kötelező mozgás, nem kikapcsolható
    }
  }
});

window.addEventListener('deviceorientation', function(event) {
  if (Math.abs(event.gamma) > FIX_DONTESI_KUSZOB) {
    karakter_mozgas(event.gamma * FIX_FORGÁSI_SEBESSEG);
    // Nincs alternatív vezérlés
  }
});

// Rossz: Nincs lehetőség a mozgás kikapcsolására
function karakter_ugras() {
  console.log('Karakter ugrik - csak rázással!');
  // Nincs gomb alternatíva
}

function karakter_mozgas(irany) {
  console.log('Karakter mozog: ' + irany);
  // Nincs billentyűzet alternatíva
}

// Rossz: Nincs hozzáférési beállítások
// Nincs mozgás kikapcsolás opció
// Nincs érzékenység állítás
// Nincs alternatív vezérlési mód
</script>

Probléma: A fix küszöbértékek nem minden felhasználónak megfelelők, és nincs mód a mozgásos vezérlés kikapcsolására vagy testreszabására.

Véletlen aktiválás megelőzés hiánya

<!-- Rossz: Túl érzékeny mozgás detektálás -->
<div class="kereskedelmi-alkalmazas">
  <h2>Online bolt</h2>
  <div class="termek-lista">
    <div class="termek">Termék 1 - 1000 Ft</div>
    <div class="termek">Termék 2 - 2000 Ft</div>
  </div>
</div>

<script>
// Rossz: Túl alacsony küszöb, véletlen aktiválások
const ALACSONY_KUSZOB = 5; // Túl érzékeny
let utolso_mozgas = 0;

window.addEventListener('devicemotion', function(event) {
  if (event.accelerationIncludingGravity) {
    let mozgas_ero = Math.abs(event.accelerationIncludingGravity.x);
    
    // Rossz: Túl gyakori triggering, nincs cooldown
    if (mozgas_ero > ALACSONY_KUSZOB) {
      kosar_hozzaadas(); // Véletlen vásárlások!
    }
  }
});

// Rossz: Kritikus műveletek mozgással
window.addEventListener('deviceorientation', function(event) {
  if (event.gamma > 10) { // Túl alacsony küszöb
    vasarlas_visszaigazolas(); // Veszélyes!
  }
  
  if (event.beta > 20) {
    fizetesi_adatok_torles(); // Nagyon veszélyes!
  }
});

function kosar_hozzaadas() {
  // Rossz: Fontos művelet véletlenül aktiválódhat
  console.log('Termék hozzáadva kosárhoz!');
  // Nincs megerősítés, nincs visszavonás lehetőség
}

function vasarlas_visszaigazolas() {
  // Rossz: Kritikus művelet mozgással
  console.log('Vásárlás megerősítve!');
  // Pénzügyi tranzakció mozgással!
}

function fizetesi_adatok_torles() {
  // Rossz: Destruktív művelet mozgással
  console.log('Fizetési adatok törölve!');
  // Nincs visszavonás lehetőség
}

// Rossz: Nincs mozgás validáció
// Nincs felhasználói megerősítés
// Nincs visszavonási lehetőség
// Nincs undo funkció
</script>

Probléma: A túl érzékeny mozgás detektálás véletlen aktiválásokhoz vezethet, különösen kritikus műveleteknél (vásárlás, törlés). Nincs megfelelő védelem vagy megerősítés.

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