Accessibilité
SvelteKit aspire à fournir une plateforme accessible par défaut pour votre application. Les vérifications d’accessibilité lors de la compilation se produisent également pour n’importe application SvelteKit que vous développez.
Voici comment les fonctionnalités d’accessibilité intégrées de SvelteKit fonctionnent et ce que vous avez besoin de faire pour les faire fonctionner aussi bien que possible. Gardez à l’esprit que bien que SvelteKit fournisse une fondation accessible, c’est à vous de vous assurez que votre application est accessible. Si vous débutez avec l’accessibilité, voir la section “Plus de lecture” de ce guide pour en savoir plus.
Nous sommes conscients qu’il peut être difficile de faire de l’accessibilité correctement. Si vous souhaitez suggérez des améliorations quant à la façon dont SvelteKit gère l’accessibilité, merci d’ouvrir une issue Github.
Annonces de routes
Dans des applications rendues sur le serveur traditionnelles, chaque navigation (par ex. lors d’un
clic sur une balise <a>
) déclenche un rechargement complet de la page. Lorsque ceci se produit,
les lecteurs d’écran et autres technologies d’assistance vont lire le titre de la nouvelle page afin
que les utilisateurs et utilisatrices comprennent que la page a changé.
Puisque dans SvelteKit les navigations entre les pages se produisent sans recharger la page
(phénomène appelé “routing côté client”), SvelteKit injecte dans la page une
zone live ARIA qui
va lire le nom de la nouvelle page après chaque navigation. Cette zone live détermine le nom de la
page à afficher en inspectant l’élément <title>
.
À cause de ce comportement, chaque page de votre application devrait avoir un titre unique décrivant
correctement la page. Avec SvelteKit, vous pouvez faire cela en plaçant un élément <svelte:head>
sur chaque page :
<svelte:head>
<title>À faire</title>
</svelte:head>
Ceci va permettre aux lecteurs d’écran et autres technologies d’assistance à identifier la nouvelle page après que la navigation ait eu lieu. Fournir un titre pertinent est également important pour le référencement.
Gestion du focus
Dans des applications rendues sur un serveur traditionnelles, chaque navigation va réinitialiser le focus en haut de la page. Cela assure aux personnes naviguant sur le web avec un clavier ou un lecteur d’écran de commencer l’interaction avec la page au début de cette page.
Pour simuler ce comportement lors des navigation côté client, SvelteKit met le focus sur l’élément
<body>
après chaque navigation et chaque soumission de formulaire
amélioré. Il y a une exception — si l’élément avec l’attribut
autofocus
est
présent, SvelteKit va à la place focaliser cet élément. Assurez-vous d’envisager les implications
sur les technologies
d’assistance
lorsque vous utilisez cet attribut.
Si vous souhaitez personnaliser la gestion du focus de SvelteKit, vous pouvez utiliser le hook
afterNavigate
:
import { function afterNavigate(callback: (navigation: import("@sveltejs/kit").AfterNavigate) => void): void
A lifecycle function that runs the supplied callback
when the current component mounts, and also whenever we navigate to a URL.
afterNavigate
must be called during a component initialization. It remains active as long as the component is mounted.
afterNavigate } from '$app/navigation';
function afterNavigate(callback: (navigation: import("@sveltejs/kit").AfterNavigate) => void): void
A lifecycle function that runs the supplied callback
when the current component mounts, and also whenever we navigate to a URL.
afterNavigate
must be called during a component initialization. It remains active as long as the component is mounted.
afterNavigate(() => {
/** @type {HTMLElement | null} */
const const to_focus: Element | null
to_focus = var document: Document
document.ParentNode.querySelector<Element>(selectors: string): Element | null (+4 overloads)
Returns the first element that is a descendant of node that matches selectors.
querySelector('.focus-me');
const to_focus: Element | null
to_focus?.focus();
});
Vous pouvez aussi naviguer programmatiquement vers une page différente en utilisant la fonction
goto
. Par défaut, cela aura le même comportement de navigation côté client
que le fait de cliquer sur un lien. Toutefois, goto
accepte également une option keepFocus
qui
va préserver l’élément actuellement focalisé plutôt que de réinitialiser le focus. Si vous activez
cette option, assurez-vous que l’élément actuellement focalisé existe toujours sur la page après la
navigation. Si l’élément n’existe plus, l’utilisateur ou l’utilisatrice va perdre le focus, rendant
l’expérience désorientante pour les personnes utilisant des technologies d’assistance.
L’attribut “lang”
Par défaut, le template de page de SvelteKit définit la langue par défaut du document à l’anglais.
Si votre contenu n’est pas en anglais, vous devriez mettre à jour l’élément <html>
dans le fichier
src/app.html
pour qu’il ait l’attribut
lang
correct. Ceci va assurer que les technologies d’assistance lisant le document utilisent la
prononciation adéquate. Par exemple, si votre contenu est en français, vous devriez mettre à jour
app.html
de la manière suivante :
<html lang="fr">
Si votre contenu est disponible dans plusieurs langages, vous devriez définir l’attribut lang
en
fonction de la langue de la page courante. Vous pouvez faire cela avec le hook
handle
de SvelteKit :
<html lang="%lang%">
/** @type {import('@sveltejs/kit').Handle} */
export function function handle({ event, resolve }: {
event: any;
resolve: any;
}): any
handle({ event: any
event, resolve: any
resolve }) {
return resolve: any
resolve(event: any
event, {
transformPageChunk: ({ html }: {
html: any;
}) => any
transformPageChunk: ({ html: any
html }) => html: any
html.replace('%lang%', function get_lang(event: any): string
get_lang(event: any
event))
});
}
import type { type Handle = (input: {
event: RequestEvent;
resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise<Response>;
}) => MaybePromise<...>
The handle
hook runs every time the SvelteKit server receives a request and
determines the response.
It receives an event
object representing the request and a function called resolve
, which renders the route and generates a Response
.
This allows you to modify response headers or bodies, or bypass SvelteKit entirely (for implementing routes programmatically, for example).
Handle } from '@sveltejs/kit';
export const const handle: Handle
handle: type Handle = (input: {
event: RequestEvent;
resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise<Response>;
}) => MaybePromise<...>
The handle
hook runs every time the SvelteKit server receives a request and
determines the response.
It receives an event
object representing the request and a function called resolve
, which renders the route and generates a Response
.
This allows you to modify response headers or bodies, or bypass SvelteKit entirely (for implementing routes programmatically, for example).
Handle = ({ event: RequestEvent<Partial<Record<string, string>>, string | null>
event, resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise<Response>
resolve }) => {
return resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise<Response>
resolve(event: RequestEvent<Partial<Record<string, string>>, string | null>
event, {
ResolveOptions.transformPageChunk?: ((input: {
html: string;
done: boolean;
}) => MaybePromise<string | undefined>) | undefined
Applies custom transforms to HTML. If done
is true, it’s the final chunk. Chunks are not guaranteed to be well-formed HTML
(they could include an element’s opening tag but not its closing tag, for example)
but they will always be split at sensible boundaries such as %sveltekit.head%
or layout/page components.
transformPageChunk: ({ html: string
html }) => html: string
html.String.replace(searchValue: string | RegExp, replaceValue: string): string (+3 overloads)
Replaces text in a string, using a regular expression or search string.
replace('%lang%', function get_lang(event: any): string
get_lang(event: RequestEvent<Partial<Record<string, string>>, string | null>
event))
});
};
Plus de lecture
De manière générale, construire une application SvelteKit accessible est la même chose que construire n’importe quelle application web accessible. Vous devriez être capable d’appliquer les recommandations des ressources générales d’accessibilité à n’importe quelle expérience web que vous construisez :
Modifier cette page sur Github llms.txt