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.
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):
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.
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 :
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 :
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.
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 :
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)