PhōsPixel

SVG ? Semaine 1 : notes de lectures MDN + XML + CSS intégré + JS + WP Gutenberg

MDN Web Docs

Documentation sur les SVG

D’une certaine façon, SVG est aux graphiques ce que HTML est au texte.
Balise style dans balise svg

Les éléments SVG

Documentation des éléments sur MDN

Surprise totale que de constater que le premier éléments est <a> ! Aussi simple que cela. C’est peut-être le temps de s’informer sur les différences entre le XML et HTML.

XML ?

Discussion avec chatGPT 3.5 sur le XML et le HTML (et contexte SVG)

XML en bref :

Il est intéressant de penser le SVG comme un média portable avec toutes ses propriétés. Peut-on y inclure aussi une balise <script> enfant de <svg>? Continuez de lire!

SVG, interractivité et accessibilité

Mouse over pour voir !

chatGPT 3.5 pense que c’est un oiseau. Et et moi j’ai ajouté un pseudo élément

Les éléments SVG peuvent être interactifs en utilisant une balise <style> et des événements JavaScript tels que onclick, onmouseover, etc. De plus, en fournissant des descriptions textuelles appropriées à l’aide de la balise <title>, les graphiques SVG peuvent être rendus accessibles aux personnes utilisant des technologies d’assistance, ça fonctionnerait comme un aria-label donc.

Au sujet de l’accessibilité, voici un article très intéressant et détaillé sur css-tricks .

Mouse over pour voir un titre !

Cercle bleu représentant une donnée importante

Intégration directement dans un bloc Gutenberg et pseudo-éléments

À remarquer que la première animation avec le mouse over contient une balise <style> à l’intérieur de <svg>, mais au départ, elle ne contenait aucun id ou classe pour identifier le cercle. Cela fait en sorte que tous les circle:hover sur une même page gagnaient aussi la propriété transform, et non pas que le bloc Gutenburg qui le contient. Pour y remédier, après avoir compris le problème, j’ai ajouté un id pour différencier #ce-cercle. Je me suis aussi amusée en ajoutant une animation css directement à l’intérieur du svg, mais cela est en attandant d’en connaitre plus sur les propriétés d’animation XML propres aux svg : <animate>, <animateMotion> et <animateTransform>, entre autres. Quoique par la suite, le cours que j’ai débuté sur Udemy, utilise des @keyframe et animation, propriétés CSS bien connus et comme j’ai fait par intuition.

<svg
      width="200"
      height="200"
      xmlns="http://www.w3.org/2000/svg">
      <style>
        /* Par défaut, pas de transformation */
        #ce-cercle {
          transition: transform 0.5s ease; /* Ajoute une transition fluide */
          cursor: pointer;
          animation: example 4s infinite;
        }
        /* Lorsqu'on survole le cercle */
        #ce-cercle:hover {
          transform: translate(
            50px,
            -50px
          ); /* Applique la transformation uniquement lors du survol */
        }
        @keyframes example {
          0%   {fill: red;}
          25%  {fill: yellow;}
          50%  {fill: blue;}
          100% {fill: green;}
       }
      </style>

Les blocs Gutenberg de base semblent être bien développés pour prendre en charge les SVG. Je découvre aussi qu’après avoir inséré du code avec le bloc HTML, on peut obtenir un aperçu. L’aperçu ne permet pas de tester l’interractivité CSS tel un :hover.

On peut aussi injecter une page HTML au complet, incluant toute la déclaration DOCTYPE! (et balises header et meta, par exemple). Est-ce une redondance de codes qui sera conserver au final, et sinon, est-ce que cela alourdi l’éxécution ? Probablement. Je vais éviter de faire cela.

Pour en revenir aux éléments SVG … et JavaScript!

La balise <script> peut-être, tout comme <style>, intégrée directement à l’intérieur de la balise HTML <svg>. Certaines compatibilités sont à vérifier, on ne peut pas tout faire, sauf sur Firefox, où même async et defer sont supportés!

Clique sur l’étoile pour voir une boîte alert!

Un script JS dans une balise svg
      <!-- Étoile -->
      <polygon
        points="100,10 130,90 210,90 150,130 170,210 100,170 30,210 50,130                -10,90 70,90"        fill="#ffcc00"
        onclick="alert('Salut à toi!')"
      />

      <!-- Script JavaScript -->
      <script type="text/javascript">
        function showAlert() { alert('Salut à toi!'); }
      </script>

À investiguer