Tutoriel Framer : 7 microinteractions simples pour améliorer vos prototypes

Publié: 2022-03-11

Bienvenue dans le deuxième volet de notre série de didacticiels Framer. Dans le dernier article, nous avons appris les bases de l'utilisation de Framer en mode Conception, ainsi que la façon d'écrire du code simple pour donner vie à nos conceptions. Dans cet article, nous nous concentrerons sur l'utilisation de Framer pour créer des micro-interactions et des transitions animées. Nous expliquerons comment créer sept interactions utiles pour vos prototypes.

Pourquoi devriez-vous prototyper de petites interactions ?

Des mouvements fluides, des changements d'état et des transitions subtiles aident un utilisateur à comprendre comment utiliser votre interface en lui donnant des commentaires sur certaines actions. Souvent, ces transitions font écho à des analogues du monde réel (tels que le glissement d'une commande de commutateur) ou utilisent des modèles d'interaction de périphérique courants (tels que toucher pour étendre). Dans ce didacticiel, nous nous concentrerons sur les interactions qui ajoutent une touche finale à l'interface pour guider la compréhension et susciter le plaisir de l'utilisateur.

Jetez un œil aux exemples ci-dessous. Les designers du monde entier créent ces micro-interactions dans divers produits.

  • exemples de microinteractions
  • exemples de microinteractions
  • exemples de microinteractions

Les 7 prototypes

Dans ce tutoriel, je vais vous donner un aperçu de chaque microinteraction et quelques extraits de code. Nous utiliserons plusieurs techniques différentes, vous pourrez donc choisir celle qui correspond le mieux à votre produit. Il n'y a pas de "bonne" façon de créer quoi que ce soit dans Framer Studio - comme je l'ai mentionné dans mon article précédent, Framer vous donne beaucoup de liberté pour créer comme vous le souhaitez.

Plans de travail dans Framer avec toutes les conceptions d'interaction

Avez-vous déjà vu des interactions comme celles-ci ? Bien sûr, vous avez! Vous les voyez tous les jours sur votre smartphone. Il est temps de créer le vôtre.

1. Bouton d'action

Le bouton d'action représente souvent l'action principale de l'écran actuel. Parfois, il contient plusieurs actions à l'intérieur. Nous allons créer une interaction pour le deuxième cas. Téléchargez le prototype fonctionnel ici : https://framer.cloud/ShBnH

Image

Étape 1 : Créer trois boutons en forme de cercle

Pour commencer, créez un bouton principal en forme de cercle avec une icône à l'intérieur et deux boutons plus petits placés sous le bouton principal. N'oubliez pas de marquer tous ces calques comme interactifs en mode conception (avec l'indicateur cible).

Processus de création en mode conception Framer

Étape 2 : Concevez deux états pour toutes les couches

Créez deux états différents pour les calques. Utilisez le code ci-dessous pour déplacer les petits boutons au-dessus du bouton principal et pour faire pivoter l'icône de 45 ° :

 button_1.states.a = y: 427 x: 246 width: 64 height: 64 button_2.states.a = y: 330 x: 246 width: 64 height: 64 icon.states.a = rotation: 45

Étape 3 : Ajouter un événement

Pour rendre ce prototype animé, nous devons ajouter un événement. Après avoir appuyé sur le bouton d'action, modifiez les états de tous les calques :

 button.onTap -> button_1.stateCycle() button_2.stateCycle() icon.stateCycle()

Étape 4 : Animation printanière

Différence entre la courbe d'animation par défaut et à ressort

À ce stade, l'animation semble très mécanique. Pour ajouter une touche humaine, nous ajouterons une animation printanière pour tous les calques :

 button_1.animationOptions = curve: Spring(tension: 170, friction: 12) button_2.animationOptions = delay: 0.05 curve: Spring(tension: 170, friction: 12) icon.animationOptions = curve: Spring(tension: 250, friction: 5)

Le bouton d'action est prêt à fonctionner !

Image

2. Commutateurs interactifs

Les étapes ci-dessous vous permettront de créer votre propre interaction de commutateur. Téléchargez le prototype fonctionnel ici : https://framer.cloud/ieypV

Commutateur d'interaction dans le prototype de l'iPhone 7

Étape 1 : Concevoir un terrain de jeu pour interrupteurs

Conception de commutateur dans Framer

Vous n'aurez besoin que de deux choses : le commutateur lui-même, qui contient au moins deux calques (arrière-plan et point), et quelques calques à animer après avoir utilisé le commutateur.

Étape 2 : Créer des états

Vous souvenez-vous du premier article comment concevoir des états directement dans Framer Studio ? Concevez vos états comme vous le souhaitez ou utilisez mes paramètres :

 dot.states.a = x: 50 backgroundColor: "rgba(5,106,161,1)" switch_bg.states.a = backgroundColor: "rgba(0,136,205,1)" icon.states.a = opacity: 0 circle.states.a = x: 37 y: 183 width: 301 height: 301 circle_1.states.a = x: 20 y: 166 width: 337 height: 337

Étape 3 : Ajouter un événement

Pour que le prototype fonctionne, nous devons ajouter un événement au commutateur. Après avoir appuyé sur le commutateur, nous allons changer l'état de tous les calques :

 switch_1.onTap (event, layer) -> dot.stateCycle() switch_bg.stateCycle() circle.stateCycle() circle_1.stateCycle() icon.stateCycle()

Étape 4 : Ajustez le timing

Pour rendre tout plus naturel, ajustez le temps et le délai de tous les états :

 dot.animationOptions = time: 0.2 switch_bg.animationOptions = time: 0.2 circle_1.animationOptions = time: 0.5 curve: Spring circle.animationOptions = time: 0.5 delay: 0.05 curve: Spring icon.animationOptions = time: 0.5 curve: Spring

Maintenant, notre prototype est terminé !

3. Action de balayage de l'élément de la liste

Il s'agit d'une interaction typique pour supprimer, archiver ou enregistrer des éléments d'une liste. Balayez vers la gauche ou la droite et un élément sera effacé. Téléchargez le prototype ici : https://framer.cloud/rzMWP

Supprimer l'interaction de l'élément sur la maquette de l'iPhone 7

Étape 1 : Créer un prototype en mode Conception

Supprimer la conception d'interaction d'élément dans Framer

Vous pouvez utiliser votre propre design, si vous le souhaitez. Il suffit de garder la même structure des calques. Comme vous pouvez le voir dans l'image ci-dessus, tous les éléments de la liste ont un bouton "annuler" sous eux.

Étape 2 : Rendre les éléments déplaçables

Pour faire simple, nous allons créer une interaction uniquement pour le premier élément de la liste. Tout d'abord, rendez l'élément de liste déplaçable : item.draggable = true .

Verrouillez ensuite l'axe vertical : item.draggable.vertical = false .

Paramétrez les contraintes de la zone déplaçable : item.draggable.constraints

Et enfin, définissez la taille sur la taille de l'élément : size: item .

Voici à quoi ressemble tout le code :

 item.draggable = true item.draggable.vertical = false item.draggable.constraints = size: item

Vous pouvez maintenant balayer vers la gauche et vers la droite, et l'élément reviendra toujours à sa position d'origine.

Étape 3 : Créer un état

Ensuite, créez l'état de l'élément de liste lorsqu'il est supprimé. Je l'ai simplement déplacé en dehors de l'écran en utilisant l'axe des x.

 item.states.a = x: -360

Étape 4 : Modifier l'état après le balayage

Enfin, nous devons créer un déclencheur pour démarrer l'interaction. Lorsque nous faisons glisser l'élément vers la gauche de l'écran, il doit être supprimé. Le code ressemblera à ceci :

 item.onMove -> if item.x < -70 item.stateCycle("a")

Dans ce cas, nous utilisons une instruction "if". Le code ci-dessus dit essentiellement, lorsque nous déplaçons le calque d'élément de plus de 70 pixels, puis changeons l'état de l'élément en état 'a.' Vous pouvez en savoir plus sur les instructions if dans la documentation de Framer Studio : https://framer.com/getstarted/programming/#conditional

Étape 5 : Annuler l'action après avoir appuyé sur

Nous avons presque terminé cette interaction. Il ne reste plus qu'à annuler cette action :

 item_bg.onTap -> item.stateCycle("default")

Vous devriez être familiarisé avec ce code du didacticiel précédent.

Étape 6 (facultative) : Ajuster la synchronisation de l'animation

Si vous le souhaitez, vous pouvez ajuster le timing de l'animation :

 item.animationOptions = time: 0.75 curve: Spring

4. Chargeur de boutons

C'est une interaction très utile pour les actions qui nécessitent des temps de chargement ou d'attente pour l'utilisateur. Lorsque nous créons cette interaction, vous apprendrez à gérer de nombreuses animations qui se produisent une par une. Téléchargez le prototype ici : https://framer.cloud/FxmHN

Image

Étape 1 : Créer un prototype en mode Conception

Créez un bouton simple avec quatre sous-couches : une barre de progression et trois icônes pour différents états. J'ai conçu mon bouton avec une icône de téléchargement visible, une barre de progression en bas d'une largeur de 0 et deux autres icônes masquées.

Conception de boutons dans Framer

Étape 2 : Ajouter un événement

Tout ce prototype peut être réalisé sans écrire une seule ligne de code, simplement en utilisant les fonctionnalités d'autocodage de Framer.

Tout d'abord, ajoutez un événement. Nous déclencherons toute l'interaction en appuyant sur le calque du bouton :

Image

Voici le code que Framer a écrit pour vous :

 button.onTap (event, layer) ->

Étape 3 : concevoir des animations

Nous utiliserons les fonctionnalités d'autocodage de Framer pour concevoir toutes les animations :

Concevoir une animation avec la fonction d'autocodage de Framer

J'ai conçu quatre animations avec un timing différent :

  • La première animation modifie la largeur de la barre de progression.
  • La seconde cache l'icône de téléchargement avec opacité.
  • Le troisième tourne et affiche l'icône du chargeur.
  • Le dernier affiche et met à l'échelle l'icône de contrôle.

Voici le code que Framer a écrit pour chacune de ces animations :

 # change progress bar width progress.animate width: 247 options: time: 1.4 curve: Bezier.ease # hide upload icon upload.animate opacity: 0.00 y: 39 options: time: 0.2 curve: Bezier.ease # show and rotate loader icon load.animate opacity: 1.00 rotation: 360 options: time: 1 curve: Bezier.ease # show and scale check icon done.animate opacity: 1.00 scale: 1.4 options: time: 0.2 curve: Bezier.ease delay: 1.00

Étape 4 : Réinitialiser l'animation de chargement

Comme vous l'avez peut-être remarqué, nous n'avons pas masqué l'icône du chargeur une fois l'animation terminée. Pour terminer ce prototype, déclenchez une autre animation à l'aide de cet événement : load.onAnimationEnd ->

 load.animate opacity: 0.00 options: time: 0.2 curve: Bezier.ease

5. Tirez pour rafraîchir

Presque tous les produits contenant une liste utilisent ce type d'interaction. L'utilisateur déroule toute la liste pour la rafraîchir. C'est très facile à créer. Téléchargez le prototype ici : https://framer.cloud/DgMDw

Prototype pull-to-refresh sur la maquette de l'iPhone 7

Étape 1 : Créez une liste simple avec une icône d'actualisation

Nous pouvons passer directement en mode conception. Nous avons besoin de deux choses : une liste et une icône d'actualisation. La chose cruciale ici est de masquer l'icône de rafraîchissement avec opacité et de la mettre sur notre liste :

Conception de prototype pull-to-refresh dans Framer

Étape 2 : créer un composant de défilement

Nous voulons rendre notre liste déroulante. Pour ce faire, utilisez un composant de défilement et ajoutez-y une couche de liste :

 scroll = new ScrollComponent size: Screen scrollHorizontal: false list.parent = scroll.content

Étape 3 : Rendre l'icône d'actualisation visible

Créez un état simple pour l'icône :

 icon.states.a = opacity: 1

Étape 4 : Ajouter un événement après l'avoir retiré

Notre liste est déroulante en ce moment. Cela signifie que lorsque nous défilons vers le haut ou vers le bas, tout le contenu du défilement se déplace sur l'axe 'y'. Avec cette connaissance, nous pouvons créer un événement :

 scroll.content.onMove -> if scroll.content.y > 180 icon.stateCycle("a")

Encore une fois, nous utilisons une instruction "if". Si la liste est tirée vers le bas (déplacement sur l'axe y) de plus de 180 pixels, nous déclencherons une action. Dans ce cas, nous allons animer deux calques : la liste et l'icône de rafraîchissement.

 scroll.content.onMove -> if scroll.content.y > 180 icon.stateCycle("a") list.animate y: 210 options: time: 1 curve: Bezier.ease refresh.animate rotation: 360 options: time: 1

Nous utilisons « animer » pour déplacer la liste vers le bas de 210 pixels et faire pivoter l'icône d'actualisation à 360°.

Étape 5 : Réinitialiser tous les états

Le prototype fonctionne presque, mais nous devons réinitialiser tous les calques après l'animation de rafraîchissement. Pour ce faire, nous utiliserons un événement après la fin de l'animation :

 icon.onAnimationEnd ->

Nous animons la rotation de l'icône d'actualisation vers sa position d'origine, et en utilisant le cycle d'état, nous réinitialisons l'état d'arrière-plan de la liste et de l'icône :

 scroll.content.onMove -> if scroll.content.y > 180 icon.stateCycle("a") list.animate y: 210 options: time: 1 curve: Bezier.ease refresh.animate rotation: 360 options: time: 1 icon.onAnimationEnd -> refresh.animate rotation: 0 list.stateCycle("default") icon.stateCycle("default")

C'est ça!

6. Glisser l'interaction

Avez-vous déjà remarqué que lorsque vous faites glisser un élément dans une application, il se passe toujours quelque chose avec l'élément lui-même ? Parfois, l'élément rétrécit, peut-être que d'autres éléments sont flous ou que l'opacité change. Apprenons à créer ce type d'interaction. Téléchargez le prototype fonctionnel ici : https://framer.cloud/YstiW

Faire glisser la conception d'interaction dans Framer

Étape 1 : Concevoir une grille simple avec des tuiles

Créez une grille de tuiles et assurez-vous qu'elles se trouvent à l'intérieur de l'élément parent.

Faire glisser la conception du prototype dans Framer

Étape 2 : Utilisez la boucle "for" pour cibler toutes les tuiles

" for loop" peut sembler effrayant, mais c'est vraiment simple. Si vous n'êtes pas familier avec les boucles for , vous pouvez d'abord lire un peu de contexte : https://framer.com/getstarted/programming/#loops-and-arrays

Nous allons utiliser la boucle for pour cibler toutes les tuiles à l'intérieur de notre grille :

 for item in grid.subLayers

Avec cette simple ligne de code, vous avez ciblé toutes les couches à l'intérieur de la couche de grille.

Étape 3 : Rendre les tuiles déplaçables

Rendez chaque élément à l'intérieur de la grille déplaçable :

 for item in grid.subLayers item.draggable = true

Étape 4 : Concevoir un état de glissement

Tous les éléments doivent avoir un état lorsqu'ils sont déplacés. Vous devez commencer par le code, mais plus tard, vous pourrez modifier cet état dans l'éditeur de couches :

 for item in grid.subLayers item.draggable = true item.states.a = scale: 1.1 shadowBlur: 50 shadowColor: 'rgba(0,0,0,0.5)'

Étape 5 : Faites glisser des événements

Nous devons créer des événements pour déclencher différents états pendant que l'élément est déplacé. Le premier événement déclenchera une action pendant que nous commençons à faire glisser :

 for item in grid.subLayers item.draggable = true item.states.a = scale: 1.1 shadowBlur: 50 shadowColor: 'rgba(0,0,0,0.5)' item.onDragStart -> this.bringToFront() this.stateCycle("a")

J'ai utilisé this.bringToFront() pour m'assurer que l'élément est toujours au-dessus des autres calques.

Le deuxième déclencheur réinitialisera l'état de l'élément :

 for item in grid.subLayers item.draggable = true item.states.a = scale: 1.1 shadowBlur: 50 shadowColor: 'rgba(0,0,0,0.5)' item.onDragStart -> this.bringToFront() this.stateCycle("a") item.onDragEnd -> this.sendToBack() this.stateCycle("default")

À ce stade, nous avons un prototype fonctionnel.

Étape 6 (facultative) : Jouez avec le timing

L'interaction se produit toujours le long d'une chronologie. Il est bon d'ajuster la chronologie pour obtenir un effet parfait :

 for item in grid.subLayers item.draggable = true item.states.a = scale: 1.1 shadowBlur: 50 shadowColor: 'rgba(0,0,0,0.5)' item.onDragStart -> this.bringToFront() this.stateCycle("a") item.onDragEnd -> this.sendToBack() this.stateCycle("default") item.animationOptions = time: 0.3 curve: Spring

7. Plusieurs boutons "J'aime" (avancé)

Dans ce prototype, nous utiliserons des techniques plus avancées pour vous montrer une manière différente de cibler les calques dans Framer Studio, ce qui créera des interactions plus réactives en moins de temps. Si vous n'êtes pas familier avec le codage de base, je vous encourage à lire d'abord cet article : https://blog.framer.com/code-less-achieve-more-with-arrays-in-framer-c43594d13d59

Pour cette interaction, nous allons ignorer la partie conception et utiliser un prototype que j'ai créé spécifiquement pour cet article : https://framer.cloud/SZMCH

Aime l'interaction sur la maquette de l'iPhone 7

Étape 1 : créer des tableaux

Jetez un œil à la structure des calques dans Framer Studio :

Aime le design d'interaction dans Framer

Nous avons un "bouton" à l'intérieur d'une "ligne" dans le groupe "liste". Nous allons créer une interaction sur les couches de boutons, nous devons donc les cibler. Mais d'abord, nous devons trouver toutes les couches de lignes et les mettre dans un tableau :

 rows = list.children buttons = []

J'ai également créé un tableau vide pour tous les calques « bouton » : buttons = [] .

Étape 2 : Ajouter une sous-couche au tableau

Commençons par la "boucle for":

 for i in rows buttons.push(i.children[0])

Pour ajouter des calques dans le tableau, nous utiliserons : buttons.push() . Cela signifie que nous plaçons la première couche de chaque groupe de "lignes" dans un tableau.

Étape 3 : Créer un état et un événement

Nous allons maintenant créer un état pour nos boutons "J'aime" et leur ajouter un événement en appuyant sur :

 for i in buttons i.states.a = scale: 1.2 hueRotate: -80 i.onTap -> this.stateCycle() i.animationOptions = time: 0.3 curve: Spring

Vous pouvez utiliser cette technique pour recréer tous les prototypes précédents et les rendre plus complexes.

Remarque finale

Lorsque vous créez des micro-interactions, vous vous concentrez sur les moindres détails. Vous pouvez créer des animations déclenchées par n'importe quel type d'action et les rendre absolument parfaites. Gardez à l'esprit qu'il existe des centaines de façons de créer le même prototype, et vous devez utiliser la méthode qui correspond à vos compétences et aux besoins de vos conceptions de produits.

• • •

Pour en savoir plus sur le blog Toptal Design :

  • eCommerce UX - Un aperçu des meilleures pratiques (avec infographie)
  • L'importance de la conception centrée sur l'humain dans la conception de produits
  • Les meilleurs portefeuilles de concepteurs UX - Études de cas et exemples inspirants
  • Principes heuristiques pour les interfaces mobiles
  • Conception anticipative : comment créer des expériences utilisateur magiques