1485 sujets

Web Mobile et responsive web design

Bonjour à tous,
Voici un bout de code basé sur un SVG (généré par Illustrator et nettoyé sur Notepad), agrémenté d'une bonne dose de CSS.
Sur une dalle FullHD l'effet rend plutôt bien (toutes les critiques sont d'ailleurs les bienvenues), mais dès qu'on passe à une résolution inférieure, les textes deviennent illisibles.
Quelle méthode suggéreriez-vous pour rendre ce schéma lisible sur tous les écrans ?
Merci d'avance pour vos conseils.
Cordialement,
Modifié par Adage (22 Jan 2016 - 18:40)
Bonjour,

Le SVG c'est comme pour tout procès : il vaux mieux avoir en tête les besoins avant la réalisation Smiley cligne

Moi je découperais le SVG en 4 parties (diagnostic, conception, réalisation, livraison) ce qui me donnerait la souplesse de pouvoir les positionner différemment en fonction de la largeur du terminal de l'utilisateur.
Modérateur
Bonjour,

Tu peux éventuellement rajouter dans ton css quelque chose du genre (j'ai pris 1.5em mais ça peut être n'importe quoi d'autre qui te conviendrait) :
text {font-size:1.5em;}
couplé à des média queries qui cibleraient les écrans basse résolution auxquels tu fais allusion (ceci dit, je n'ai pas bien compris de quels genres d'écrans il s'agit).

EDIT : tes textes sont aussi trop proches les uns des autres. Si tu augmentes le font-size pour les basses résolutions, tu vas sans doute devoir les écarter les uns des autres (en modifiant le dernier paramètre des matrix des textes dans le code du svg).

EDIT2 : et je rejoins aussi Olivier C sur la séparation du svg en 4 svg distincts qui viendraient s'afficher les uns en dessous des autres sur les écrans étroits.

Amicalement,
Modifié par parsimonhi (20 Jan 2016 - 10:43)
Modérateur
Bonjour,

Je trouve le svg et les effets vraiment sympa ! Et effectivement sur une plus petite résolution ça devient illisible.

J'aimerais juste apporter une petite réflexion. Plutôt que de découper en 4 ton svg (perso je le laisserai comme ça) je switcherais carrément le truc :
- Soit en remplaçant ce joli svg par un autre graphique plus adapté aux petits écrans.
- Soit par exemple en passant la "ligne de bulle" à la verticale et afficher tout les texte a coté (le responsive et les animations coté svg notamment la re-disposition des élément est intéressant à creuser ! je m'y intéresse actuellement).

Garde a l'esprit que "plus petite résolution" veut essentiellement dire tablette, smartphone etc, donc -> tactile, donc ton effet de hover, à mon avis, n'est pas a conserver sur petite résolution.

Bonne journée ! Smiley smile
Modérateur
_laurent a écrit :
...Soit par exemple en passant la "ligne de bulle" à la verticale et afficher tout les texte a coté...


Ce serait superbe en effet et certainement la solution la plus aboutie.

Amicalement,
Merci pour vos réponse !

Olivier C a écrit :
Le SVG c'est comme pour tout procès : il vaux mieux avoir en tête les besoins avant la réalisation
Effectivement, quand j'ai commencé je pensais ajouter les textes autrement, avant de me rendre compte qu'il était impossible d'insérer des span ou des divs dans des balises SVG... Je suis parti à l'aventure sans vérifier, et bien mal m'en a pris !

_laurent a écrit :
en passant la "ligne de bulle" à la verticale et afficher tout les texte a coté
Maintenant que tu le dis ça parait tellement évident que je me demande comment j'ai pu ne pas y penser avant ! Merci beaucoup pour celle superbe idée... à tel point d'ailleurs que je réfléchis déjà à la possibilité de ne faire QUE du vertical (même sur les grands écrans).

Je ne manquerai pas de poster le résultat ici.

Merci encore.
Pour ne pas supprimer l'option d'affichage de toutes les étapes des grandes phases, j'ai disposé les boutons autrement.
J'ai également du supprimer les actions client, qui pourront être exprimées autrement par la suite.

Encore un peu d'optimisation du svg est nécessaire, mais l'idée est . Je me demande si je ne vais pas garder exclusivement la disposition verticale...

Merci à tous pour vos conseils, et particulière à _laurent pour cette idée géniale !
Modifié par Adage (21 Jan 2016 - 10:44)
Peut-être qu'une amélioration serait aussi de permettre d'afficher plus durablement les légendes suite à un clic ; est-ce possible en full CSS ou faut-il du JS ?
Merci !
Modérateur
Adage a écrit :
afficher plus durablement les légendes suite à un clic ; est-ce possible en full CSS ou faut-il du JS ?

Il doit y avoir des tricks CSS qui retourne la tête... mais le plus simple reste quand même de le faire en 2 lignes de Js qui switch une class CSS au click Smiley ravi
Merci pour ta réponse.
_laurent a écrit :
le plus simple reste quand même de le faire en 2 lignes de Js qui switch une class CSS au click
N'ayant absolument aucune idée de comment fonctionne JS, pourrais-tu m'aiguiller ?
J'ai regardé ici mais n'ayant pas les prérequis je n'y arrive pas du tout !
Merci.
Modérateur
Bonjour,

On va supposer que lorsque ton svg a la classe css "showXXX" cela signifie qu'on doit afficher les textes de la rubrique XXX (par exemple showDiagnostic, mais ça peut être n'importe quel nom).

Tu ajoutes dans le css des instructions du genre svg.showDiagnostic {...} avec tout ce qu'il faut dedans pour afficher les textes pour la rubrique Diagnostic (en gros ce que tu as déjà fait en cas de hover).

Tu fais de même pour les autres rubriques.

Ensuite dans le html où sont définis les boutons des rubriques, par exemple pour Diagnostic, c'est là où il y a <text ...>Diagnostic</text>, tu ajoutes un onclick="...". Par exemle :
<text onclick="document.getElementById('workflow').classList.toggle('showDiagnostic')" transform="matrix(1.011 0 0 1 114.929 29.8066)" font-family="'Raleway'" font-size="16">Diagnostic</text>
Cela a pour effet que quand on clique sur le texte "Diagnostic", ça ajoute la classe "showDiagnostic" au svg "workflow" s'il ne l'a pas déjà, ou bien la retire s'il l'a déjà. Et par conséquent, comme dans le css, on a indiqué que quand le svg a la classe "showDiagnostic", on affiche les textes de la rubrique, cela aura pour effet d'afficher/cacher ces textes.

Et normalement, sauf erreur de typo, ça devrait suffire.

Amicalement,
Modifié par parsimonhi (22 Jan 2016 - 19:56)
Bonjour et merci beaucoup.
J'ai fait un premier test en créant la class showDiagnostic dans mon CSS comme suit :

.showDiagnostic {fill: #fff !important;}


Et en ajoutant le JS sur le premier élément circle du code.

<circle id="rencontre" cx="28.5" cy="281.855" r="25" onclick="document.getElementById('workflow').classList.toggle('showDiagnostic')"/>


Malheureusement j'ai beau cliquer sur le rond... il ne se passe rien !

Merci encore.

EDIT : Voici le fork : codepen.io/adage/pen/QyQKox
Modifié par Adage (22 Jan 2016 - 21:22)
Modérateur
Bonjour,

Déjà, il me semblait que le svg avait comme id workflow, ce qui n'est plus le cas dans l'exemple. Évidemment, c'est très ennuyeux car le code que je t'ai proposé utilisait justement ça : document.getElementById("workflow") signifie qu'on récupère une référence sur l'objet ayant pour id "workflow". Si tu remets id="worflow", déjà ça ira mieux.

Ensuite, pour le css, ce n'est pas l’élément svg ayant pour id worflow qui doit changer de couleur (or c'est celui-là à qui on met la classe "showDiagnostic"), mais ici les cercles si j'ai bien compris. Il faut donc mettre dans le css plutôt quelque chose comme .showDiagnostic circle {fill: #fff !important;}

Si tu fais ces deux trucs, tu vas voir que tes cercles vont tous changer de couleur quand tu vas cliquer dessus. Voilà le début de l'histoire. Si tu ne veux que le premier cercle qui change de couleur, comme il a un id = "rencontre", il faudrait mettre dans le css .showDiagnostic #rencontre {fill: #fff !important;}, et ainsi de suite. Du css classique en fait.

Amicalement,
Modifié par parsimonhi (23 Jan 2016 - 00:22)
Bonjour et merci,
Effectivement ça fonctionne !
Par contre la raison pour laquelle les id= ont été remplacés par des class= est qu'il y a maintenant deux SVG, l'un horizontal et l'autre vertical...
Je lis ici qu'il est possible de faire un getelement par class, mais le code a l'air sensiblement plus compliqué que le tiens ; comment faire pour l'adapter ?
Merci encore.
Modérateur
Bonjour,

L'adaptation dépend de ce que tu veux faire.

Est-ce que tous les svg sont concernés ? Est-ce que ça dépend de l'endroit où tu cliques ? ...

Est-ce qu'il n'y a que des deux svg dans la page ou bien y en a-t-il d'autres ?

Il faut bien comprendre l'idée : on ajoute une classe aux svg concernés.

document.getElementById('abc') : un élément ayant abc pour id

document.getElementsByTagName('svg') : tous les éléments de type svg
Le premier svg est document.getElementsByTagName('svg')[0],
le deuxième est document.getElementsByTagName('svg')[1],
...

document.getElementsByClassName('xxx') : tous les éléments ayant pour classe xxx (on peut utiliser le même principe pour n'importe quelle classe)
Le premier élément de classe xxx est document.getElementsByClassName('xxx')[0],
le deuxième élément de classe xxx est document.getElementsByClassName('xxx')[1],
...

Tu choisis celui qui correspond au svg dont tu veux modifier la classe et tu lui ajoute .classList.toggle('showDiagnostic')

Par exemple, si tu veux ajouter/retirer la classe 'showDiagnostic' du deuxième svg du document et si ce svg n'a pas d'id, alors tu peux quand même t'en sortir et utiliser :
<circle id="rencontre" cx="28.5" cy="281.855" r="25"
onclick="document.getElementsByTagName('svg')[1].classList.toggle('showDiagnostic')"/>
...
Tu peux aussi mettre une fonction comme valeur de "onclick" et définir la fonction ailleurs. On fabrique une fonction appelée par exemple changeShowDiagnostic (on met le code correspondant entre des balises <script></script>, et on met "changeShowDiagnostic comme valeur de l'attribut "onclick" de l'objet sur lequel l'utilisateur devra cliquer pour qu'il se passe quelque chose) :

<script>
function changeShowDiagnostic()
{
    document.getElementsByTagName('svg')[1].classList.toggle('showDiagnostic')
}
</script>
<circle id="rencontre" cx="28.5" cy="281.855" r="25" onclick="changeShowDiagnostic"/>


Enfin, si tu as plusieurs svg à modifier d'un coup, il te suffit de rajouter dans le code de la fonction changeShowDiagnostic autant de ligne que de svg à modifier, ou bien de faire un boucle à l'aide de l'instruction javascript "for" par exemple.

Amicalement,
Modifié par parsimonhi (25 Jan 2016 - 21:37)