7 votes

Bouton HTML dans un document SVG

J'ai le problème suivant : je veux créer dynamiquement des boutons HTML dans un document SVG. D'abord je regarde le document SVG, je trouve le reactangle approprié et je remplace le rectangle par <foreignObject> élément. Je suis capable de générer le SVG suivant

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   version="1.1"
   width="100%"
   height="100%"
   viewBox="0 0 93.875076 43.283451"
   id="svg20755"
   xml:space="preserve">

    <g id="Button-1" transform="translate(0.5000775,0.50220189)">

       <foreignObject xmlns="http://www.w3.org/2000/svg" x="0" y="0" width="93" height="43">
           <body xmlns="http://www.w3.org/1999/xhtml" style="margin: 0px; height: 100%;">
            <button type="button" style="width:100%; height:100%;" onclick="alert('Button clicked')">
                Juhuhuhu!
            </button>
           </body>
       </foreignObject>

    </g>
</svg>

Voici comment je crée l'élément.

var ns_HTML = 'http://www.w3.org/1999/xhtml';
var ns_SVG = REX.HELPERS.ns_svg;

var element = <Some code to load an SVG element>

var foreignObject = document.createElementNS(ns_SVG, 'foreignObject');

var body = document.createElementNS(ns_HTML, 'body');
body.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); // FF
body.style.margin = '0px';
body.style.height = '100%';        

var button = document.createElementNS(ns_HTML, 'button');    
button.setAttribute('type','button');    
button.setAttribute('style','width:100%; height:100%;');
button.innerHTML = 'Test!';

body.appendChild(button);
foreignObject.appendChild(body);

J'ai deux problèmes, notamment dans le navigateur Chrome :

  1. L'élément <body> n'a pas rempli la hauteur de la <foreignObject>
  2. Le site button ne se comportait pas comme un bouton (pas de réaction au passage de la souris et à la descente de la souris) (Il semble que ce problème ait été corrigé dans les nouvelles versions de Chrome et de Firefox).

JSFiddle ici

1voto

schlebe Points 716

Je ne sais pas pourquoi tu dis <body> ne remplit pas la hauteur de l'élément <foreignObject> ! ?

Lorsque j'essaie maintenant en 2020, je ne vois qu'un bouton au milieu de l'écran.

J'ai ajouté un SVG <rect> de même taille (largeur et hauteur) que l'élément <foreignObject> pour avoir la possibilité de comparer ces 2 objets.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
  xmlns="http://www.w3.org/2000/svg"
  version="2.0"
  width="100%"
  height="100%"
  viewBox="0 0 90 50"
  >

<g transform="translate(1 0)">
    <foreignObject xmlns="http://www.w3.org/2000/svg" x="0" y="0" width="80" height="20">
        <body xmlns="http://www.w3.org/1999/xhtml" style="margin:0px; height:100%;">
            <button type="button" style="width:100%; height:100%;" onclick="alert('Button clicked')">
            Juhuhuhu!
            </button>
        </body>
    </foreignObject>
    <rect x="0" y="25" width="80" height="20" stroke="orange" stroke-width="2" fill="white"/>
</g>

Comme vous pouvez le voir, ils ont la même taille !

enter image description here

Je mets une image pour prouver ce que je dis car il est possible que dans 1 an ce que j'ai écrit soit faux !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X