A fieldset és a legend igazi szerepe

A cikk témái

Már 1997 óta, azaz a HTML 4 megjelenése óta létezik ez a két jelölőelem, mégis ritkán találkozom velük a kódokban. Csak vélelmezni tudom, hogy sokan vagy nem ismerik, vagy túl lényegtelennek és opcionálisnak tartják a használatukat. Pedig nagyon sok olyan eset van, amikor a használatuk messze nem opcionális, hanem szinte kötelező. Nem véletlen, hiszen tulajdonképpen az akadálymentesség miatt lettek kitalálva.

Definíció szerint a <fieldset> jelölőelem a logikailag összetartozó űrlapelemek csoportosítására szolgál. A csoport címkéjét (nevét) a <legend> jelölőelem segítségével adhatjuk meg, ami az első elem a <fieldset> elemen belül.

Klasszikus példa, amikor egy rendelési űrlapban a szállítási és a számlázási cím megadására szolgáló űrlapmezőket csoportosítjuk:

<form>
  <fieldset>
    <legend>Szállítási cím</legend>
    <label for="szallitasi-nev">Név:</label>
    <input type="text" id="szallitasi-nev" name="szallitasi-nev">
    <!-- ide jönnek a szállítási cím további űrlapmezői -->
  </fieldset>
  <fieldset>
    <legend>Számlázási cím</legend>
    <label for="szamlazasi-nev">Név:</label>
    <input type="text" id="szamlazasi-nev" name="szamlazasi-nev">
    <!-- ide jönnek a számlázási cím további űrlapmezői -->
  </fieldset>
</form>

Sajnos sokszor láttam már különböző HTML oktatóanyagokban, hogy a <fieldset> elemet egyszerűen úgy definiálják, hogy segítségével „keretet lehet rajzoltatni” az űrlapelemek köré. Habár a böngészőprogramok jellemzően valóban keretezéssel jelenítik meg a <fieldset> határait, természetesen nem a grafikai keretezés a lényeg, hanem a logikai összetartozás felhasználóbarát érzékeltetése.

Vagyis az, hogy a felhasználó észlelje és megértse, hogy a <fieldset>-ben lévő űrlapmezők a <legend> által leírt „szempont” miatt összetartoznak, és valamilyen módon észlelje azt is, hogy az adott csoport hol kezdődik, illetve hol ér véget. Utóbbi kapcsán az is érdekes lehet, hogy a hasonló vagy egyforma címkéjű (nevű) űrlapmezőkről a felhasználó nagy biztonsággal eldönthesse, hogy ebbe vagy abba csoportba tartoznak-e. És ami talán akadálymentességi szempontból a leglényegesebb, hogy mindez vizuálisan és hallhatóan is megtörténjen.

Az összetartozás vizuális érzékeltetésére a körbekeretezés kézenfekvő megoldás, de a CSS segítségével egyéb grafikai megoldások is szóba jöhetnek. Ugyanígy a <legend> stílusa is szabadon variálható annak érdekében, hogy a csoport domináns címkéjeként jelenjen meg.

Egyesekben felmerülhet kérdés, hogy Oké, de ez a csoportosítás egy CSS-sel megformázott <div>-vel is megoldható. Miért jobb a <fieldset>?

Ami a <fieldset> és a <legend> párosát igazán megkülönbözteti egy CSS-sel körbekeretezett mezei <div>-től, az a képernyőolvasó programok által biztosított hallható „megjelenés”.

A képernyőolvasó programok ugyanis megértik a <fieldset> szemantikáját (szerepét), és amikor a felhasználó egy ilyen elemhez érkezik, vagy közvetlenül belelép a csoport egyik űrlapelemébe, akkor meghallja, hogy egy csoporthoz érkezett, vagy egy csoportban van. És persze azt is meghallja, hogy mi a csoport neve, hiszen ezt a <legend> biztosítja. Vagyis létrejön az összetartozás hallható érzékeltetése.

Fontos megjegyeznem, hogy a különböző képernyőolvasó programok eléggé eltérő „stratégiával” olvassák fel a <fieldset> és a <legend> elemet. Ennek részleteibe most nem mennék bele, de például van olyan képernyőolvasó és böngészőprogram páros, amelyik a csoport összes űrlapeleménél felolvassa az adott űrlapelem címkéjét és a csoport nevét (vagyis a <legend>-et) is. De van olyan is, amelyik csak az első űrlapelemnél teszi ugyanezt. Ráadásul a felolvasást az is befolyásolhatja, hogy a felhasználó melyik navigációs módszert alkalmazza, amikor az űrlapelemek között lépked.

Például az első mintakódunk esetén az NVDA képernyőolvasó ezt olvassa fel, ha a TAB billentyűvel lépünk bele a szállítási cím csoport első mezőjébe: Szállítási cím elemcsoport, Név, szerkesztőmező. Ugyanez a VoiceOver képernyőolvasó esetén így hangzik: Név, szöveg szerkesztése, Szállítási cím, Szállítási cím, csoport.

Amikor a <fieldset> használata szinte kötelező

Értelemszerűen nem mindegyik űrlap tartalmaz több csoportra osztható mezőket, tehát nem kell indokolatlanul <fieldset>-et használni. Ugyanakkor a bevezetőben is említettem, hogy van egy borzasztóan gyakori űrlaptípus, amikor a <fieldset> használata szinte kötelező. Ezek a rádiógombokat és/vagy jelölőnégyzeteket tartalmazó űrlapok, hiszen ezeknél a választható opciók jellemzően mindig összetartoznak.

Ahogy az Űrlapmezők akadálymentes címkézése című írásomban is leírtam, a rádiógombok, illetve a jelölőnégyzetek esetén is a <label> jelölőelem segítségével címkézhetjük meg magukat a választható opciókat:

<input type="radio" id="piros" name="szin" value="piros">
<label for="piros">Piros</label>
<input type="radio" id="zold" name="szin" value="zold">
<label for="zold">Zöld</label>
<input type="radio" id="kek" name="szin" value="kek">
<label for="kek">Kék</label>

De ebből a példából hiányzik egy nagyon fontos elem. Nevezetesen az, hogy ezek az opciók mire is vonatkoznak, vagyis például mi az a kérdés, amire válaszolnia kell a felhasználónak. Az auditálások során szerzett tapasztalataim szerint ezt sokan úgy oldják meg, hogy egy <p>, <div>, vagy esetleg valamilyen címsor (pl. <h3>) jelölőelembe teszik bele a kérdést. Mondjuk így:

<form>
  <p>Milyen színű legyen?</p>
  <input type="radio" id="piros" name="szin" value="piros">
  <label for="piros">Piros</label>
  <input type="radio" id="zold" name="szin" value="zold">
  <label for="zold">Zöld</label>
  <input type="radio" id="kek" name="szin" value="kek">
  <label for="kek">Kék</label>
</form>

Ez valamilyen alapszintű CSS formázást feltételezve például így nézhet ki:

A kivastagított "Milyen színű legyen?" kérdés alatt a "piros", "zöld" és "kék" rádiógombok látszanak.

Ez a megoldás akadálymentességi szempontból azért problémás, mert a kérdés és a hozzá tartozó opciók között nincsen semmilyen kódolt (a képernyőolvasó program által is meghatározható) logikai kapcsolat. Vagyis a kérdés legfeljebb vizuálisan lesz a rádiógomb-csoport címkéje, ami messze nem elégséges. Felolvasáskor is csak maximum abban az értelemben tekinthető címkének, hogy ha lineáris felolvasási sorrendet feltételezünk, akkor a kérdés előbb hangzik el, mint a lehetséges válaszok. Már ha egyáltalán elhangzik.

Ugyanis kódolt kapcsolat hiányában simán elképzelhető, hogy a képernyőolvasó egyáltalán nem fogja felolvasni a kérdést, ha a felhasználó valamelyik választható opcióra lép. Jellegzetesen a Windows-os képernyőolvasóknál létezik az úgynevezett űrlap üzemmód, amikor a felhasználó kizárólag az űrlapban lévő űrlapelemekkel áll interakcióban. Ebben az üzemmódban csak azokat az információkat hallja, amiket az űrlapelemek közvetlenül, vagy valamilyen kódolt kapcsolat útján tartalmaznak. Ilyenkor az űrlapban található „sima” jelölőelemek (például azok a <p> elemek, amelyek nincsenek kódolt kapcsolatban az űrlapelemekkel) nem kerülnek felolvasásra.

És itt kerül újra képbe a <fieldset> és a <legend> párosa. A <fieldset> tudja kialakítani a kérdés és az opciók közötti logikai összetartozást, míg a <legend> tudja biztosítani a kialakított csoport címkéjét. Az iménti példa akadálymentes megoldása tehát ez lehet:

<form>
  <fieldset>
    <legend>Milyen színű legyen?</legend>
    <input type="radio" id="piros" name="szin" value="piros">
    <label for="piros">Piros</label>
    <input type="radio" id="zold" name="szin" value="zold">
    <label for="zold">Zöld</label>
    <input type="radio" id="kek" name="szin" value="kek">
    <label for="kek">Kék</label>
  </fieldset>
</form>

Tulajdonképpen az történik, hogy a rádiógombok logikailag két címkét is kapnak. Az egyiket a <legend> adja, a másikat a <label>. Mindkettőre szükség van ahhoz, hogy a felhasználó ki tudja választani a megfelelő opciót. Ha például a TAB billentyűvel az első rádiógombra lép, akkor valami ilyesmi hangzik el: Milyen színű legyen? elemcsoport, Piros, választógomb.

A jelölőnégyzeteknél is ugyanez a megoldás javasolt, kivéve a logikailag önálló jelölőnégyzeteket.

Egyéb érdekességek

Talán kevésbé köztudott, hogy a HTML 5.2 óta már érvényes megoldás, ha címsor (pl. <h3>) jelölőelemet teszünk a <legend> elembe. A korábbi HTML specifikációk alapján csak bekezdésen belül használható jelölőelemek (pl. <strong>, <span>, stb.) kerülhettek a <legend> elembe. Ez a változás azonban sokat segíthet például azoknak a képernyőolvasós felhasználóknak, akik címsorok alapján navigálnak az oldalon. Természetesen ez sem jelenti azt, hogy minden esetben ezt a mintát kell követni, de ha a konkrét eset úgy adja magát, akkor nyugodtan használható.

A másik érdekesség, hogy elvileg a <fieldset> elemek egymásba ágyazhatók, vagyis egy elemcsoport simán tartalmazhat egy olyan tagot, ami szintén egy elemcsoport. De ez a megoldás jelenleg mégsem igazán ajánlott, mert a <fieldset> végét (a csoport elhagyását) nem mindegyik képernyőolvasó jelzi, vagyis a felhasználó nem tudhatja teljes bizonyossággal, hogy egy adott űrlapelem még a beágyazott csoportba tartozik-e vagy sem.