174 votes

faire d'un objet html svg également un lien cliquable

J'ai un objet SVG dans ma page HTML et je l'enveloppe dans une ancre de sorte que lorsque l'on clique sur l'image SVG, l'utilisateur est dirigé vers le lien de l'ancre.

<a href="http://www.google.com/">
    <object data="mysvg.svg" type="image/svg+xml">
        <span>Your browser doesn't support SVG images</span>
    </object>
</a>

Lorsque j'utilise ce bloc de code, le fait de cliquer sur l'objet svg ne m'amène pas sur google. Dans IE8< le texte du span est cliquable.

Je ne veux pas modifier mon image svg pour qu'elle contienne des balises.

Ma question est la suivante : comment puis-je rendre l'image svg cliquable ?

270voto

energee Points 509

En fait, la meilleure façon de résoudre ce problème est... sur la balise <objet>, utilisez :

pointer-events: none;

http://jsfiddle.net/energee/UL9k9/

4 votes

Note : IE ne supportera pas les événements de pointeur sur les éléments réguliers avant IE 11, mais les supporte déjà sur SVG. Voir caniuse.com/pointer-événements

0 votes

Cela fonctionne parfaitement, merci. Pour mémoire, j'utilisais un événement jQuery Click sur un élément, qui ne fonctionnait que sur le padding jusqu'à ce que j'ajoute le CSS ci-dessus sur la balise object.

11 votes

Un inconvénient de cette solution (et de celle de noelmcg également) est que si votre fichier SVG contient des règles CSS avec un sélecteur :hover, ces règles cesseront de fonctionner. La solution proposée par Ben Frain n'a pas ce problème.

49voto

Richard Points 91

J'ai eu le même problème et j'ai réussi à le résoudre :

Envelopper l'objet avec un élément réglé sur block ou inline-block

<a>
    <span>
        <object></object>
    </span>
</a>

Ajout à la balise <a> :

position: relative; z-index: 1;

et à la balise <objet> ajouter :

position: relative; z-index: -1

Voir un exemple ici : http://jsfiddle.net/WEbGd/

Trouvé via le commentaire 20 ici https://bugzilla.mozilla.org/show_bug.cgi?id=294932

1 votes

Mes excuses, j'ai oublié l'élément display : inline-block/block pour envelopper l'objet.

2 votes

La meilleure solution ici !

0 votes

C'est la meilleure solution pour ce problème et elle fonctionne sur tous les navigateurs.

36voto

noelmcg Points 358

J'aimerais m'en attribuer le mérite, mais j'ai trouvé une solution ici :

https://teamtreehouse.com/forum/how-do-you-make-a-svg-clickable

ajoutez ce qui suit à la css de l'ancre :

a.svg {
  position: relative;
  display: inline-block; 
}
a.svg:after {
  content: ""; 
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left:0;
}

<a href="#" class="svg">
  <object data="random.svg" type="image/svg+xml">
    <img src="random.jpg" />
  </object>
</a>

Le lien fonctionne sur le svg et sur le fallback.

3 votes

Il s'agit de la solution la plus simple et la plus soutenue dans l'opinion publique.

4 votes

Il y a toujours un problème : Les événements du pointeur SVG (animations) ne fonctionnent plus (mouseover, mouseout, click) ! Comme si on utilisait simplement pointer-events : none sur l'objet lui-même ...

27voto

Feuermurmel Points 1288

Une simplification de la solution de Richard. Fonctionne au moins dans Firefox et Safari :

<a href="..." style="display: block;">
    <object data="..." style="pointer-events: none;" />
</a>

Voir http://www.noupe.com/tutorial/svg-clickable-71346.html pour des solutions supplémentaires.

3 votes

Merci, j'avais besoin que l'affichage soit réglé sur block ou inline-block sur le parent <a> .

0 votes

Bon lien : noupe.com/inspiration/tutorials-inspiration/ a pros et contre pour chaque solution.

1 votes

J'ai aussi eu besoin d'utiliser inline-block dans certains cas, mais block semble bien fonctionner dans d'autres cas ; je suppose que cela dépend des blocs qui l'entourent...

19voto

Erik Dahlström Points 21519

Le plus simple est de ne pas utiliser <objet>. Utilisez plutôt une balise <img> et l'ancre devrait fonctionner parfaitement.

0 votes

Cela fonctionne. Mon principal problème est qu'il est plus difficile de créer une solution de repli pour IE, mais l'utilisation de la balise alt est suffisante.

1 votes

La balise img devrait normalement aller là où se trouve la balise span pour que cela se dégrade de manière élégante.

19 votes

L'idée n'est-elle pas d'afficher un vecteur svg, et non une image ?

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