DEV Community

Cover image for đŸ‡«đŸ‡· L'art de faire un Zoom en Web
Gravisto
Gravisto

Posted on • Updated on

đŸ‡«đŸ‡· L'art de faire un Zoom en Web

Dans une application d’édition (photo, vidĂ©o, schĂ©ma 
), il y a toujours un moyen de zoomer et de dĂ©zoomer et il est facile de se dire que c’est une fonctionnalitĂ© rapide Ă  implĂ©menter. Puis on le fait et on se rend compte de sa complexitĂ©.

Je vais donc expliquer quelles sont les conditions pour qu’un zoom soit rĂ©ussi et 2 façons de l’implĂ©menter, avec leurs avantages et leurs inconvĂ©nients.

On ne va pas trop parler maths, ne vous inquiétez pas.

math focus people

Qu’est ce qu’un zoom rĂ©ussi ?

Il y a 3 conditions pour qu’un zoom soit fonctionnel et intuitif pour l’utilisateur:

  • Les objets sur lesquels on zoom doivent grossir ou rapetisser selon l’action voulue et toutes les actions doivent ĂȘtre rĂ©versibles.
  • Pour que le feeling du zoom soit rĂ©ussi et que l’utilisateur ne se perde pas lors d’un zoom, il faut que le zoom prenne en compte la position de la souris.
  • La modification de la distance entre les objets doit ĂȘtre proportionnel au ratio de zoom.

Et si on prend des schĂ©mas, en prenant en exemple d’un Ă©diteur (le rectangle noir reprĂ©sentant la page afficher):

zoom schema

unzoom schema

Les lignes pointillĂ©es vertes reprĂ©sentent les lignes de fuite des objets, prenant pour centre le curseur de la souris. Ces lignes ne doivent pas ĂȘtre modifiĂ©es avec le zoom, mais seulement avec la position des objets et de la souris.

Lors d’une modification du zoom, tous les objets doivent se dĂ©placer le long de ces lignes pour rendre le zoom fluide et comprĂ©hensible.

Comment on fait ça ?

PremiÚrement, il faut choisir si on prend un ratio de zoom constant ou un step de zoom constant. Le ratio est le zoom fait par rapport au précédent et le step est la différence entre 2 zooms.

  • ratio de 50% : 100% ⇒ 150% ⇒ 225% ⇒ 337.5
  • step de 50% : 100% ⇒ 150% ⇒ 200% ⇒ 250%

Il n’y a pas de diffĂ©rence d’implĂ©mentation entre les deux, c’est juste un choix d’UX.

Pour l’implĂ©mentation, je vais prĂ©senter deux solutions avec leurs avantages et leurs inconvĂ©nients et je vous laisse faire votre choix en fonction de votre besoin.

schema

Utiliser les rĂšgles CSS

Avec les propriĂ©tĂ©s CSS ‘scale’ et ‘translate’, il est possible de crĂ©er un effet de zoom trĂšs facilement.

Le but est de faire notre page comme elle doit ĂȘtre, puis de la grossir globalement du facteur voulu (par exemple 50%) et enfin de dĂ©placer la page en fonction de la position de la souris.

Pour le zoom on obtient ceci :

schema

Le rectangle rouge représente la page sur laquelle on veut zoomer, contenant les rectangles jaunes.

Le rectangle noir reprĂ©sente la vue que l’utilisateur a (l’écran de l’utilisateur), sur le schĂ©ma de gauche les rectangles noir et rouge sont confondus.

Aprùs le zoom, la page est scaled de 150% (ici) et translated d’une certaine valeur en x et y.

La translation est de : -rmx sur x et -rmy sur y avec:

  • r le ratio de zoom (ici 50%)

  • (mx;my) la position de la souris sur l’écran

Et pour le dézoom :

schema

Dans ce cas la translation est de r*mx et r*my.

Pour plusieurs zooms, si le ratio est constant (par exemple chaque zoom est un grossissement de 50%) alors le scale se multiplie avec le prĂ©cĂ©dent, par contre si le step est constant (100% ⇒ 150% ⇒ 200% ⇒ 250% 
) alors le scale s’additionne avec le prĂ©cĂ©dent. Dans tous les cas la translation s’additionne avec la prĂ©cĂ©dente.

L’implĂ©mentation en CSS est facile puisqu’il ne faut pas gĂ©rer chaque Ă©lĂ©ment de notre page un par un, tout sera gĂ©rĂ© en une seule fois.

Cependant, il y a des problÚmes avec cette implémentation :

  • ComplexitĂ© de la gestion de la position de la souris par rapport aux Ă©lĂ©ments
  • TrĂšs peu modulable

Pour résoudre ces problÚmes, il y a une autre implémentation possible.

Bouger nos éléments

Si on ne veut pas faire du CSS, il est possible de faire bouger les objets le long des lignes de fuite qu’on a vues prĂ©cĂ©demment.

Pour cela, on va modifier la taille et la position des objets.

La taille c’est facile, on multiplie juste la taille actuelle par le zoom effectuĂ© pour obtenir la nouvelle taille.

Par contre la position, c’est un autre problùme.

Les objets doivent suivre la ligne dĂ©finie par la position de la souris, et la position de leur centre. Ces lignes dĂ©finissent l’orientation du vecteur de dĂ©placement de chaque objet.

vecteur schema

La norme de ces vecteurs dépend de leur distance avec la souris.

Le vecteur de déplacement est donc défini comme suit :

  • r*(x-mx)+mx
  • r* (y-my)+my

Avec r le ratio de zoom, (x;y) la position de l’objet Ă  dĂ©placer et (mx;my) la position de la souris.

On obtient ceci :

schema

Cette mĂ©thode est plus complexe d’implĂ©mentation mais permet de gĂ©rer entiĂšrement la position et la taille des objets. Elle permet aussi de pouvoir connaitre facilement la position de la souris par rapport aux objets. De plus, comme tous les objets connaissent leur taille affichĂ©e, il n’est pas nĂ©cessaire de connaitre le ratio de zoom actuel pour l’obtenir et l’utiliser (pour d’autres fonctionnalitĂ©s par exemple).

Conclusion

Le zoom n’est donc pas une fonctionnalitĂ© si simple Ă  implĂ©menter et les problĂšmes rencontrĂ©s dĂ©pendent du choix de l’implĂ©mentation, que l’on peut rĂ©sumer comme ceci :

Implémentation 1 : CSS Implémentation 2 : Gestion des Objet 1 à 1
Avantages Simple d’implĂ©mentation & Gestion de toute la page en une seule fois ModularitĂ© complĂšte & Interactions utilisateur plus simple
InconvĂ©nients Peu Modulable & Interactions utilisateur plus complexe ComplexitĂ© d’implĂ©mentation & Gestion de chaque propriĂ©tĂ© peut devenir fastidieux

J’ai proposĂ© 2 choix d’implĂ©mentations mais il en existe surement d’autres avec chacun des avantages et inconvĂ©nients. J’ai une prĂ©fĂ©rence pour la 2Ăšme implĂ©mentation malgrĂ© sa complexitĂ© pour sa modularitĂ©.

Il faut cependant bien connaitre les contraintes pour faire un choix pertinent, ni trop complexe ni trop contraignant.

Top comments (0)