Porady
Brak [href]
Opis
Czy poprawne jest pominięcie atrybutu [href]
w łączu, prawdopodobnie lepiej to sprawdzić dwukrotnie, prawda?
Bibliografia
- https://www.w3.org/TR/html/links.html#links-created-by-a-and-area-elements
- https://github.com/Heydon/REVENGE.CSS/blob/master/revenge.css#L161
- https://github.com/Heydon/REVENGE.CSS/blob/master/revenge.css#L165
Selektor
a:not([href])
Test
<a>Kim jestem? Do czego łączę?</a>
button [role] on a link
Opis
Oczywiście, rola przycisku w linku nie jest chyba tak trudna do przeniesienia do autentycznego znacznika przycisku, prawda?
Bibliografia
Selektor
a[role="button"]
Test
<a href="/" role="button">Wyślij</a>
Czy to wygląda jak [required]?
Opis
Pole wymagane - [required]
lub [aria-required]
powinny być wizualnie zrozumiałe.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-11-10
- https://www.w3.org/TR/WCAG20/#minimize-error-cues
Selektor
[required],
[aria-required]
Test
<form action="">
<label for="field">Pole</label>
<textarea id="field" required></textarea><span>†</span>
</form>
Data i godzina powinny być zrozumiałe
Opis
Zawartość <time>
lub [datetime]
powinna być zrozumiałą i dobrze sformułowaną datą.
Selektor
time,
[datetime]
Test
<time>Wczoraj</time>
Drugi widoczny znacznik main
Opis
W danym momencie powinien być widoczny tylko jeden <main>
. Czy to nie jest oczywiste?
Bibliografia
- https://www.w3.org/TR/html52/changes.html#new-concepts
- https://www.w3.org/TR/html52/grouping-content.html#elementdef-main
Selektor
main ~ main:not([hidden])
Test
<main>Ja jestem główną treścią!</main>
<main>Nie, to ja jestem treścią główną!</main>
Drugi znacznik figcaption
Opis
<figcaption>
powinien być jeden wewnątrz swojego rodzica. Sprawdź specyfikację!
Bibliografia
Selektor
figcaption:not(:first-of-type)
Test

<figure role="group">
<figcaption>Jestem podpisem.</figcaption>
<img src="static/ffoodd.png" alt="Potrzebna" width="144" height="144" />
<figcaption>Ja też jestem podpisem.</figcaption>
</figure>
Kolejność figcaption
Opis
<figcaption>
powinno być pierwszym lub ostatnim dzieckiem. Nie inaczej.
Bibliografia
Selektor
figcaption:not(:first-child):not(:last-child)
Test

Jestem kimś innym. Oh, czekaj.
<figure role="group">
<img src="static/ffoodd.png" alt="Potrzebna" width="144" height="144" />
<figcaption>Jestem podpisem.</figcaption>
<p>Jestem kimś innym. Oh, czekaj.</p>
</figure>
Łącze do pliku
Opis
Łącze do pliku powinno wskazywać format pliku, rozmiar pliku oraz język pliku, jeśli jest inny niż w dokumencie głównym.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-13-6
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-13-7
- https://www.w3.org/TR/WCAG20/#navigation-mechanisms-refs
- https://www.w3.org/TR/WCAG-TECHS/H33.html
Selektor
[download],
[href$=".pdf"]:not(link),
[href$=".doc"]:not(link),
[href$=".png"]:not(link),
[href$=".jpg"]:not(link),
[href$=".gif"]:not(link),
[href$=".mp3"]:not(link),
[href$=".mp4"]:not(link),
[href$=".mov"]:not(link),
[href$=".ogg"]:not(link),
[href$=".xls"]:not(link),
[href$=".txt"]:not(link),
[href$=".zip"]:not(link),
[href$=".rar"]:not(link),
[href$=".docx"]:not(link),
[href$=".webp"]:not(link),
[href$=".apng"]:not(link),
[href$=".svg"]:not(link),
[href$=".svgz"]:not(link)
Test
<a href="/file.png">Chcesz złożyć wniosek?</a>
Łącze e-mail powinno być poprawne
Opis
<href="mailto:">
powinien zawierać poprawny email.
W przeciwnym razie możesz zirytować swoich użytkowników.
Selektor
[href^="mailto"]
Test
<a href="mailto:myself">Niespo-dzianka!</a>
Łącze otwiera nową kartę
Opis
Łącze otwierające nową kartę lub okno powinno ostrzegać użytkownika o swoim zachowaniu.
Możesz użyć na przykład [title]
.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-13-2
- https://www.w3.org/TR/WCAG20/#navigation-mechanisms-refs
- https://www.w3.org/TR/WCAG20/#consistent-behavior-no-extreme-changes-context
- https://www.w3.org/TR/WCAG-TECHS/H33.html
- https://www.w3.org/TR/WCAG-TECHS/H83.html
- https://www.w3.org/TR/WCAG-TECHS/F22.html
Selektor
[target$="blank"]
Test
<a href="/" target="_blank" rel="noopener noreferrer">Nowa karta</a>
Łącze telefoniczne powinno dzwonić pod numer rzeczywisty
Opis
<href="tel:">
powinno zawierać prawidłowy numer telefonu.
W przeciwnym razie możesz zmusić użytkowników do dzwonienia do Berdyczowa.
Selektor
[href^="tel"]
Test
<a href="tel:012345678">Do kogo zadzwonię?</a>
Może ma [role] search?
Opis
[class]
lub [id]
zawierające search może mieć [role]
ARIA wyszukiwania.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-12-10
- https://www.w3.org/TR/WCAG20/#navigation-mechanisms-skip
Selektor
[id*="search"]:not([role="search"]),
[class*="search"]:not([role="search"])
Test
<form class="search" action="">
<label for="field">Szukaj</label>
<input type="search" id="field" /><span>†</span>
</form>
Nie :puste [hidden] rzeczy
Opis
Użycie[hidden]
lub [aria-hidden]
może nie być dobrym pomysłem na ukrycie treści.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-10-13
- https://www.w3.org/TR/WCAG20/#ensure-compat-rsv
Selektor
[hidden]:not(:empty),
[aria-hidden="true"]:not(:empty)
Test
<a href="/" aria-hidden="true">Ważna rzecz!</a>
Placeholder nie może zastąpić etykiety
Opis
Przecież [placeholder]
nie jest etykietą, prawda?
Selektor
[placeholder]:not([title]):not([aria-label]):not([aria-labelledby])
Test
<input type="text" placeholder="Spójrz mamo, nie ma etykiety!" id="test"><span>†</span>
Powtórzona rola
Opis
Niektóre role ARIA powinny być unikalne: [main]
, [search]
, [banner]
, [contentinfo]
.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-12-10
- https://www.w3.org/TR/WCAG20/#navigation-mechanisms-skip
Selektor
[role="main"] ~ [role="main"],
[role="search"] ~ [role="search"],
[role="banner"] ~ [role="banner"],
[role="contentinfo"] ~ [role="contentinfo"]
Test
<main role="main"><br /></main>
<div role="main"><br /></div>
Pusty atrybut [class]
Opis
[class]
nie powinno istnieć, jeśli jest puste. Coś do poprawienia, prawda?
Selektor
[class=""],
[class=" "]
Test
<b class="">Dlaczego jest tu klasa?</b>
Pusty atrybut [id]
Opis
[id]
nie powinien istnieć, jeśli jest pusty. Podziękujesz mi później.
Selektor
[id=""],
[id=" "]
Test
<i id="">Zaczekaj. Dlaczego mój identyfikator jest pusty?</i>
Rzeczy dla video lub audio
Opis
<video>
lub <audio>
potrzebuje kilku rzeczy, aby być dostępne, jak transkrypcja, napisy rozszerzone, kontrolki.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-4-1
- https://www.w3.org/TR/WCAG20/#media-equiv-av-only-alt
- https://www.w3.org/TR/WCAG20/#media-equiv-audio-desc
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-4-13
- https://www.w3.org/TR/WCAG20/#media-equiv-text-doc
Selektor
video,
audio
Test
<video src="/" controls></video><span>†</span>
[scope] powinien być albo col albo row
Opis
Wartość [scope]
może być col lub row (i nic innego) i musi być istotna.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-5-7
- https://www.w3.org/TR/WCAG20/#content-structure-separation-programmatic
- https://www.w3.org/TR/WCAG-TECHS/H63.html
Selektor
th[scope]
Test
Pierwsza kolumna | Druga kolumna |
---|---|
Pierwsza komórka | Druga komórka |
Pierwsza komórka | Druga komórka |
<table>
<caption>Jestem podpisem</caption>
<thead>
<tr>
<th scope="col">Pierwsza kolumna</th>
<td>Druga kolumna</td>
</tr>
</thead>
<tbody>
<tr>
<td>Pierwsza komórka</td>
<td>Druga komórka</td>
</tr>
<tr>
<td>Pierwsza komórka</td>
<td>Druga komórka</td>
</tr>
</tbody>
</table>
<select required> powinien zaczynać się od <option> z pustą [value]
Opis
Element <select required>
, który nie jest [multiple]
i którego [size]
nie jest większy niż 1
, powinien zaczynać się od pustej <option>
. To powiedziawszy, możesz użyć zawartości placeholder dla tej opcji, ale musisz upewnić się, że używasz pustego atrybutu [value]
; lub ustawić atrybut [size]
do <select>
, którego wartość powinna być równa liczbie <option>
.
Bibliografia
- https://twitter.com/WebPlatformNews/status/1346492730223058946
- https://html.spec.whatwg.org/multipage/form-elements.html#placeholder-label-option
- https://validator.w3.org/nu/?showsource=yes&doc=https%3A%2F%2Fjsbin.com%2Ftozopid%2Fquiet
Selektor
select[required]:not([multiple])[size="1"],
select[required]:not([multiple]):not([size])
Test
<select name="slices" required>
<option value="1">Ser</option>
<option value="2">Salami</option>
</select><span>†</span>
[title] powinnie być równy alt
Opis
A [title]
każdej treści graficznej powinno być równe [aria-label]
lub [alt]
.
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-1-3
- https://www.w3.org/TR/WCAG20/#text-equiv-all
- An alt Decision Tree
- https://www.w3.org/TR/html51/semantics.html#alt
- Image ALT Tag Tips for HTML
- TPG, Short note on use of alt="" and the title attribute
- 24 Accessibility. The Trials and Tribulations of the Title Attribute
Selektor
img[alt][title],
area[alt][title],
svg[aria-label][title]
Test

<img src="static/ffoodd.png" alt="Jestem tekstem alternatywnym!" title="Jestem tytułem!" height="144" width="144"><span>†</span>
URL nie HTTPS
Opis
Gdy to możliwe, staraj się używać HTTPS.
Bibliografia
- https://twitter.com/fvsch/status/921748801542639616
- https://transparencyreport.google.com/https/overview?hl=en
- https://letsencrypt.org/
- https://checklists.opquast.com/oqs-v3/criteria/les-echanges-de-donnees-sensibles-sont-securises-et-signales-comme-tels
Selektor
[src^="http:"],
[href^="http:"]
Test
<a href="http://www.ffoodd.fr/">Protokół mojego celu nie jest zabezpieczony</a>
Użyto tabeli układu
Opis
[role="presentation"]
jest dobrym pomysłem dla każdej <table>
używanej dla układu, ale złą rzeczą dla tabeli danych. Sprawdź to dwukrotnie!
Bibliografia
- https://references.modernisation.gouv.fr/rgaa/criteres.html#crit-5-3
- https://www.w3.org/TR/WCAG20/#content-structure-separation-sequence
Selektor
table[role="presentation"]
Test
Pierwsza komórka | Druga komórka |
Pierwsza komórka | Druga komórka |
<table role="presentation">
<tr>
<td>Pierwsza komórka</td>
<td>Druga komórka</td>
</tr>
<tr>
<td>Pierwsza komórka</td>
<td>Druga komórka</td>
</tr>
</table>