Fermer

octobre 21, 2021

Respecter les préférences de mouvement des utilisateurs —


Résumé rapide ↬

La requête média préfère les mouvements réduits a une excellente prise en charge dans tous les navigateurs modernes depuis quelques années. Dans cet article, Michelle Barker explique pourquoi il n'y a aucune raison de ne pas l'utiliser aujourd'hui pour rendre vos sites plus accessibles.

Lorsque vous travaillez avec le mouvement sur le Web, il est important de considérer que tout le monde ne le vit pas de la même manière. Ce qui peut sembler lisse et lisse pour certains peut être ennuyeux ou distrayant pour d'autres – ou pire, provoquer des sensations de malaise ou même provoquer des convulsions. Les sites Web avec beaucoup de mouvement peuvent également avoir un impact plus important sur la durée de vie de la batterie des appareils mobiles ou entraîner l'utilisation de plus de données (la lecture automatique de vidéos, par exemple, nécessitera plus de données d'un utilisateur qu'un fichier statique image). Ce ne sont là que quelques-unes des raisons pour lesquelles les sites à forte densité de mouvement peuvent ne pas être souhaitables pour tous.

La plupart des nouveaux systèmes d'exploitation permettent à l'utilisateur de définir ses préférences de mouvement dans ses paramètres au niveau du système. La requête média prefers-reduced-motion (qui fait partie de la spécification Level 5 Media Queries) nous permet de détecter les préférences de mouvement des utilisateurs au niveau du système et d'appliquer des styles CSS qui les respectent.

Les deux options pour préfère-mouvement réduit sont réduire ou pas de préférence. Nous pouvons l'utiliser de la manière suivante dans notre CSS pour désactiver l'animation d'un élément si l'utilisateur a explicitement défini une préférence pour un mouvement réduit :

.some-element {
  animation : rebond 1200ms ;
}

@media (préfère-mouvement réduit : réduire) {
  .quelque-élément {
    animation : aucune ;
  }
}

Inversement, nous pourrions définir l'animation uniquement si l'utilisateur n'a pas de préférence de mouvement. Cela a l'avantage de réduire la quantité de code que nous devons écrire, et signifie qu'il est moins probable que nous oublions de répondre aux préférences de mouvement des utilisateurs :

@media (prefers-reduced-motion: no-preference) {
  .some-element {
    animation : rebond 1200ms ;
  }
}

Un avantage supplémentaire est que les navigateurs plus anciens qui ne prennent pas en charge préfère-mouvement réduit ignoreront la règle et afficheront uniquement notre élément original sans mouvement.

Quelle règle ?[19659010]Contrairement aux media queries min-width et max-widthoù le consensus plus ou moins établi est mobile-first (privilégiant donc min-width) , il n'y a pas une seule "bonne" façon d'écrire vos styles de mouvement réduit. J'ai tendance à privilégier le deuxième exemple (appliquer des animations uniquement si préfère-mouvement réduit : aucune-préférence évalue vrai), pour les raisons énumérées ci-dessus. Tatiana Mac a écrit cet excellent article qui couvre certaines des approches que les développeurs pourraient envisager d'adopter, ainsi que de nombreux autres points intéressants, y compris les questions clés à poser lors de la conception avec mouvement sur le Web.

Comme toujours, la communication d'équipe et une stratégie cohérente sont essentiels pour garantir que toutes les bases sont couvertes en matière d'accessibilité Web.

Plus après le saut ! Continuez à lire ci-dessous ↓

prefers-reduced-motion a de nombreuses applications au-delà de l'application (ou non) d'animations ou de transitions d'images clés. Un exemple est le défilement fluide. Si nous définissons scroll-behaviour: smooth sur notre élément htmllorsqu'un utilisateur clique sur un lien d'ancrage dans la page, il défile en douceur jusqu'à la position appropriée sur la page (actuellement non pris en charge dans Safari):

html {
  comportement de défilement : lisse ;
}

Malheureusement, en CSS, nous n'avons pas beaucoup de contrôle sur ce comportement pour le moment. Si nous avons une longue page de contenu, la page défile très rapidement, ce qui peut être une expérience assez désagréable pour une personne sensible au mouvement. En l'enveloppant dans une requête média, nous pouvons empêcher ce comportement d'être appliqué dans les cas où l'utilisateur a une préférence reduced-motion :

@media (prefers-reduced- mouvement : sans préférence) {
  html {
    comportement de défilement : lisse ;
  }
}

Traitement des préférences de mouvement en Javascript

Parfois, nous devons appliquer le mouvement en JavaScript plutôt qu'en CSS. Nous pouvons également détecter les préférences de mouvement d'un utilisateur avec JS, en utilisant matchMedia. Voyons comment nous pouvons implémenter conditionnellement un comportement de défilement fluide dans notre code JS :

/* Définir la requête multimédia */
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)')

button.addEventListener('click', () => {
  /* Si la requête média correspond, définissez la variable de comportement de défilement sur 'auto',
  sinon, définissez-le sur 'lisse' */
  comportement const = prefersReducedMotion.matches ? 'auto' : 'lisse'

  /* Lorsque le bouton est cliqué, l'utilisateur défile vers le haut */
  window.scrollTo({
    x : 0,
    y : 0,
    comportement
  })
})

Le même principe peut être utilisé pour détecter s'il faut implémenter des interfaces utilisateur riches en mouvements avec des bibliothèques JS – ou même s'il faut charger les bibliothèques elles-mêmes.

Dans l'extrait de code suivant, la fonction revient tôt si l'utilisateur préfère mouvement réduit, évitant l'importation inutile d'une grande dépendance – une performance gagnante pour l'utilisateur. Si aucune préférence de mouvement n'est définie, nous pouvons importer dynamiquement la bibliothèque d'animation Greensock et initialiser nos animations.

const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)')

const loadGSAPAndInitAnimations = () => {
  /* Si l'utilisateur préfère les mouvements réduits, ne rien faire */
  if (préfèreReducedMotion.matches) return
  
  /* Sinon, importe le module GSAP et initialise les animations */
  import('gsap').then((objet) => {
    const gsap = objet.default
    /* Initialiser les animations avec GSAP ici */
  })
}

loadGSAPAndInitAnimations()

reduced-motion Doesn't Mean No Motion

Lors du style pour les préférences de mouvement réduit, il est important que nous fournissions toujours à l'utilisateur des indicateurs significatifs et accessibles de quand un l'action a eu lieu. Par exemple, lors de la désactivation d'un état de survol gênant ou à forte intensité de mouvement pour les utilisateurs qui préfèrent un mouvement réduit, nous devons veiller à fournir un style alternatif clair lorsque l'utilisateur survole l'élément.

La démo suivante montre un style élaboré. transition lorsque l'utilisateur survole ou se concentre sur un élément de la galerie s'il n'a pas de préférence de mouvement définie. S'ils préfèrent un mouvement réduit, la transition est plus subtile, mais indique toujours clairement l'état de survol :

Voir le stylo [Gallery with prefers-reduced-motion](https://codepen.io/smashingmag/pen/KKvMqaL) par Michelle Barker .

Voir le Pen ] se transforme non plus à partir de notre page Web. Par exemple, un bouton doté d'une petite icône en forme de flèche qui se déplace de quelques pixels au survol est peu susceptible de causer des problèmes à quelqu'un qui préfère une expérience de mouvement réduit, et fournit un indicateur plus utile de un changement d'état que la couleur seule.

Je vois parfois des développeurs appliquer des styles de mouvement réduits de la manière suivante, ce qui élimine toutes les transitions et animations sur tous les éléments :

@media screen et (préfère-mouvement réduit : réduire) {
  * {
    animation : aucune !important;
    transition : aucune !important;
    scroll-behavior: auto !important;
  }
}

C'est sans doute mieux que d'ignorer les préférences de mouvement des utilisateurs, mais cela ne nous permet pas de personnaliser facilement les éléments pour fournir des transitions plus subtiles si nécessaire.

Dans l'extrait de code suivant, nous avons un bouton qui grandit en vol stationnaire . Nous procédons à la transition des couleurs et de l'échelle, mais les utilisateurs ayant une préférence pour les mouvements réduits n'obtiendront aucune transition :

bouton {
  couleur d'arrière-plan : rose vif ;
  transition : couleur 300 ms, couleur d'arrière-plan 300 ms, transformation 500 ms cube-bézier (0,44, 0,23, 0,47, 1,27) ;
}

bouton : survoler,
bouton:focus {
  couleur de fond : violet foncé ;
  Couleur blanche;
  transformer : échelle(1.2);
}

@media screen et (préfère-mouvement réduit : réduire) {
  * {
    animation : aucune !important;
    transition : aucune !important;
    scroll-behavior: auto !important;
  }

  bouton {
    /* Même si nous aimerions toujours changer les couleurs de notre bouton, la règle suivante n'aura aucun effet */
    transition : couleur 200 ms, couleur d'arrière-plan 200 ms ;
  }
        
  bouton : survoler,
  bouton:focus {
    /* Empêcher la mise à l'échelle du bouton au survol */
    transformation : échelle(1) ;
  }
}

Découvrez cette démo pour voir l'effet. Ce n'est peut-être pas l'idéal, car le changement de couleur soudain sans transition peut sembler plus choquant qu'une transition de quelques centaines de millisecondes. C'est l'une des raisons pour lesquelles, dans l'ensemble, je préfère généralement le style pour un mouvement réduit au cas par cas.

Si vous êtes intéressé, c'est la même démo refactorisé pour permettre la personnalisation de la transition si nécessaire. Il utilise une propriété personnalisée pour la durée de transition, ce qui nous permet d'activer et de désactiver la transition d'échelle sans avoir à réécrire toute la déclaration. qui peut accéder au Web peut également rendre l'animation, ou rendre l'animation en douceur" dans son article, " Revisiting prefers-reduced-motion, the réduit motion media query ." Pour les appareils avec un faible taux de rafraîchissement, ce qui peut provoquer des animations saccadées, il peut en effet être préférable de supprimer l'animation. La fonction de média update peut être utilisée pour déterminer ceci :

@media screen et
  (préfère-mouvement réduit : réduire),
  (mise à jour : lente) {
  * {
    durée de l'animation : 0,001 ms !important ;
    animation-iteration-count : 1 !important;
    durée de transition : 0,001 ms !important ;
  }
}

Assurez-vous de lire l'article complet pour les recommandations d'Eric, car il est une personne de premier ordre à suivre dans le domaine de l'accessibilité.

La somme de toutes les parties

Il est important de garder à l'esprit la page globale design en se concentrant si étroitement sur le CSS au niveau des composants. Ce qui peut sembler une animation assez inoffensive au niveau des composants pourrait avoir un impact bien plus important lorsqu'il est répété tout au long de la page, et est l'une des nombreuses parties mobiles.

Dans l'article de Tatiana, elle suggère d'organiser des animations (avec préfère- reduce-motion) dans un seul fichier CSS, qui ne peut être chargé que si (prefers-reduced-motion: no-preference) évalue vrai. Voir la somme totale de toutes nos animations pourrait avoir l'avantage supplémentaire de nous aider à visualiser l'expérience de la visite du site dans son ensemble et d'adapter nos styles de mouvement réduit en conséquence.

Explicit Motion Toggle [19659010]Bien que préfère les mouvements réduits soit utile, il présente l'inconvénient de ne s'adresser qu'aux utilisateurs qui connaissent la fonctionnalité dans leurs paramètres système. De nombreux utilisateurs ne connaissent pas ce paramètre, tandis que d'autres peuvent utiliser un ordinateur emprunté, sans accès aux paramètres au niveau du système. Pourtant, d'autres pourraient être satisfaits du mouvement pour la grande majorité des sites, mais trouver les sites avec une utilisation intensive du mouvement difficiles à supporter.

Il peut être ennuyeux de devoir ajuster vos préférences système pour visiter un seul site. Pour ces raisons, dans certains cas, il peut être préférable de fournir un contrôle explicite sur le site lui-même pour activer et désactiver le mouvement. Nous pouvons implémenter cela avec JS.

La démo suivante a plusieurs cercles dérivant autour de l'arrière-plan. Les styles d'animation initiaux sont déterminés par les préférences système de l'utilisateur (avec préfère-mouvement réduit), cependant, l'utilisateur a la possibilité d'activer ou de désactiver le mouvement via un bouton. Cela ajoute une classe au bodyque nous pouvons utiliser pour définir des styles en fonction de la préférence sélectionnée. En prime, le choix de préférence de mouvement est également conservé dans le stockage local — il est donc « mémorisé » lors de la prochaine visite de l'utilisateur.

Voir le Pen [Reduced-motion toggle](https://codepen. io/smashingmag/pen/porEQLB) de Michelle Barker.

Voir le Pen Reduced-motion toggle de Michelle Barker.

Custom Properties[19659038]Une caractéristique de la démo est que la bascule définit une propriété personnalisée, --playStateque nous pouvons utiliser pour lire ou mettre en pause des animations. Cela peut être particulièrement pratique si vous devez mettre en pause ou lire plusieurs animations à la fois. Tout d'abord, nous définissons l'état de lecture sur paused:

.circle {
  animation-play-state : var(--playState, en pause );
}

Si l'utilisateur a défini une préférence pour un mouvement réduit dans ses paramètres système, nous pouvons définir l'état de lecture sur running:

@media (prefers-reduced-motion: no-preference) {
  corps {
    --playState : en cours d'exécution ;
  }
}

Remarque : Définir ceci sur le bodypar opposition à l'élément individuel, signifie que la propriété personnalisée peut être héritée.

Lorsque l'utilisateur clique sur le toggle, la propriété personnalisée est mise à jour sur le bodyqui basculera toutes les instances où elle est utilisée :

// Cela mettra en pause toutes les animations qui utilisent la propriété personnalisée `--playState`
document.body.style.setProperty('--playState', 'paused')

Ce n'est peut-être pas la solution idéale dans tous les cas, mais l'un des avantages est que l'animation se met simplement en pause lorsque l'utilisateur clique sur la bascule, plutôt que de revenir à son état initial, ce qui pourrait être assez choquant.

Un merci spécial à Scott O'Hara pour ses recommandations visant à améliorer l'accessibilité de la bascule. Il m'a fait savoir que certains lecteurs d'écran n'annoncent pas le texte du bouton mis à jour, qui est modifié lorsqu'un utilisateur clique sur le bouton, et a suggéré role="switch" sur le bouton à la place, avec aria- coché basculé sur on ou off sur clic.

Composant vidéo

Dans certains cas, basculer le mouvement au niveau du composant peut être une meilleure option. Prenez une page Web avec un arrière-plan vidéo en lecture automatique. Nous devons nous assurer que la vidéo n'est pas lue automatiquement pour les utilisateurs ayant une préférence pour les mouvements réduits, mais nous devons toujours leur fournir un moyen de lire la vidéo uniquement si ils choisissent. (Certains pourraient prétendre que nous devrions éviter la lecture automatique des vidéos, mais nous ne gagnons pas toujours cette bataille !) De même, si une vidéo est configurée pour la lecture automatique pour les utilisateurs sans préférence déclarée, nous devrions également leur fournir un moyen de mettre la vidéo en pause.

Cette démo montre comment nous pouvons définir l'attribut de lecture automatique lorsque l'utilisateur n'a pas de préférence de mouvement déclarée, en mettant en œuvre un bouton de lecture/pause personnalisé pour lui permettre de basculer également la lecture, quelle que soit sa préférence :

Voir le stylo [Video with motion preference](https://codepen.io/smashingmag/pen/qBXNjqR) par Michelle Barker.

Voir le stylo Vidéo avec préférence de mouvement par Michelle Barker.

(Je suis par la suite tombé sur ce message de Scott O'Haradétaillant ce cas d'utilisation exact.)

Using The Element[19659038]Chris Coyier a écrit un article intéressant combinant quelques techniques pour charger différentes sources multimédias en fonction de les préférences de mouvement de l'utilisateur. C'est plutôt cool, car cela signifie que pour les utilisateurs qui préfèrent les mouvements réduits le fichier GIF beaucoup plus volumineux ne sera même pas téléchargé. L'inconvénient, pour autant que je sache, est qu'une fois le fichier téléchargé, il n'y a aucun moyen pour l'utilisateur de revenir à l'alternative sans mouvement.

Je crée une version modifiée de la démo qui ajoute cette option. . (Activez reduced-motion dans vos préférences système pour le voir en action.) Malheureusement, lorsque vous basculez entre les options animées et sans mouvement dans Chrome, il semble que le fichier GIF soit téléchargé à nouveau à chaque fois, ce qui n'est pas le cas dans les autres navigateurs :

Voir le stylo [Prefers Reduction Motion Technique PLUS! [forked]](https://codepen.io/smashingmag/pen/porbPXG) par Michelle Barker.

Voir le stylo Préfère la technique de réduction du mouvement PLUS ! [forked] de Michelle Barker.

Néanmoins, cette technique semble être une manière plus respectueuse d'afficher les GIF, ce qui peut être une source de frustration pour les utilisateurs.

Support du navigateur et réflexions finales[19659010]prefers-reduced-motion a un excellent support dans tous les navigateurs modernes depuis quelques années. Comme nous l'avons vu, en adoptant une approche de mouvement réduit d'abord, les navigateurs non compatibles obtiendront simplement un mouvement réduit de secours. Il n'y a aucune raison de ne pas l'utiliser aujourd'hui pour rendre vos sites plus accessibles.

Les bascules personnalisées ont certainement leur place et peuvent considérablement améliorer l'expérience pour les utilisateurs qui ne connaissent pas ce paramètre, ou ce qu'il fait. L'inconvénient pour l'utilisateur est l'incohérence : si chaque développeur est obligé de proposer sa propre solution, l'utilisateur doit rechercher une bascule de mouvement à un endroit différent sur chaque site Web.

Il semble que la couche manquante ici est [navigateurs. J'aimerais voir les navigateurs implémenter des bascules à mouvement réduit quelque part facilement accessible à l'utilisateur, afin que les gens sachent où le trouver quel que soit le site sur lequel ils naviguent. Cela pourrait également encourager les développeurs à passer plus de temps à garantir l'accessibilité des mouvements.

Smashing Editorial(vf, yk, il)






Source link