Skip to content

A11y: a route-váltás nincs bejelentve, nincs fókusz-visszaállítás #67

Description

@Xentinus

Jelenség

SPA-navigáció után semmi nem jelzi a képernyőolvasónak, hogy új oldal jött. A router csak a görgetést és az analytics beacont kezeli:

scrollBehavior(to) {
  if (to.hash) return { el: to.hash }
  return { top: 0 }
},
...
router.afterEach((to, _from, failure) => {
  if (failure) return
  trackView(to)
})

A useDocumentMeta frissíti a document.title-t, de a címváltozást a képernyőolvasók nem jelentik be következetesen — valódi oldalbetöltésnél teszik, history.pushState esetén nem. Fókusz-visszaállítás sincs: navigáció után a fókusz azon a linken marad, amire kattintottak, ami már nem is létezik a DOM-ban, tehát a fókusz a <body>-ra esik vissza — onnan a Tab újra a lap tetejéről indul.

Vagyis a klaviatúrás és a képernyőolvasós látogató számára a navigáció csendes és tájékozódás nélküli.

Javaslat

  1. Élő régió az App.vue-ban: egy vizuálisan rejtett (sr-only, nem display: none) <div aria-live="polite" aria-atomic="true">, amibe a router afterEach beírja az új oldal címét. A címet a useDocumentMeta amúgy is előállítja — érdemes ugyanabból a forrásból venni, hogy ne csúszhasson el.
  2. A bejelentés a tartalom betöltése után történjen, ne a navigáció pillanatában: a ArticleView a store-ból oldja fel a slugot, tehát a cím néhány tick-kel később áll rendelkezésre. Előbb bejelentve „Portfólió" hangzana el minden oldalon.
  3. Fókusz-visszaállítás: navigáció után a fókusz a <main> elemre (tabindex="-1", programozott focus()) — ez az A3-mal (skip link és main landmark) együtt működik, tehát a kettőt érdemes egy körben megcsinálni.
  4. A scrollBehavior hash-ág maradjon: ha a látogató horgonyra navigál, a fókusz a horgonyzott elemre kerüljön, ne a main-re.
  5. Teszt: a Tests: hiányos frontend teszt-fedettség a publikus SPA-ban #59 keretében a router spec ellenőrizze, hogy a bejelentés megtörténik és a fókusz a main-en van.

Érintett fájlok

  • portfoliocms.client/src/App.vue
  • portfoliocms.client/src/router/index.ts
  • portfoliocms.shared/composables/useDocumentMeta.ts
  • portfoliocms.client/src/assets/public.css (sr-only osztály)
  • portfoliocms.client/src/router/__tests__/ — új spec

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions