hacer un objeto html svg también un enlace en el que se pueda hacer clic

143

Tengo un objeto SVG en mi página HTML y lo estoy envolviendo en un ancla, de modo que cuando se hace clic en la imagen svg, lleva al usuario al enlace del ancla.

<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>

Cuando uso este bloque de código, hacer clic en el objeto svg no me lleva a google. En IE8 <se puede hacer clic en el texto de extensión.

No quiero modificar mi imagen svg para que contenga etiquetas.

Mi pregunta es, ¿cómo puedo hacer que se pueda hacer clic en la imagen svg?

iancoleman
fuente

Respuestas:

20

La forma más fácil es no usar <objeto>. En su lugar, use una etiqueta <img> y el ancla debería funcionar bien.

Erik Dahlström
fuente
1
La etiqueta img normalmente iría donde está la etiqueta span para que esto se degrade con gracia.
Adrian Garner
18
¿No es la idea mostrar un vector svg, no una imagen?
Lucas
77
@ ErikDahlström pero <img>con una referencia a los datos de svg no siempre funciona como se espera, incluso en la última versión de Chrome :( stackoverflow.com/questions/15194870/…
dshap
15
Como lo señaló @energee, puede usar la <object>etiqueta y agregar un point-event: none;para hacer clic. Preserva el acceso a su código fuente svg y le permite manipularlo dinámicamente.
Antoine
1
Usar un imgno siempre es una opción. En mi caso, necesito manipular el svg, que no se puede hacer correctamente img, tengo que usarlo object.
Martijn
216

En realidad, la mejor manera de resolver esto es ... en la etiqueta <objeto>, use:

pointer-events: none;

Nota: Los usuarios que tienen instalado el complemento Ad Blocker obtienen un [Bloque] similar a una pestaña en la esquina superior derecha al pasar el mouse (lo mismo que se obtiene con un banner flash). Al configurar este CSS, eso también desaparecerá.

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

energee
fuente
44
Nota: IE no admitirá eventos de puntero en elementos regulares hasta IE 11, pero ya los admite en SVG. Ver caniuse.com/pointer-events
webdesserts
9
Un inconveniente de esta solución (y también la de noelmcg) es que si su archivo SVG contiene reglas CSS con un: selector de desplazamiento, estas reglas dejarán de funcionar. La solución propuesta por Ben Frain no tiene este problema.
MathieuLescure
66
Esta debe ser la respuesta aprobada. Usar imgcon svg hace que sea inutilizable para cambiar los estilos SVG internos.
cadavre
3
¡Esta debe ser la respuesta aprobada! Realmente agradable, gracias
Daniel Broughan
55
Gran respuesta. Hice el mío universal con esto en el css global. object [type * = "svg"] {pointer-events: none}
Gregor Macgregor
40

Tuve el mismo problema y logré resolver esto:

Envolviendo el objeto con un conjunto de elementos para bloquear o bloquear en línea

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

Agregando a la <a>etiqueta:

display: inline-block;
position: relative; 
z-index: 1;

y a la <span>etiqueta:

display: inline-block;

y a la <object>etiqueta:

position: relative; 
z-index: -1

Vea un ejemplo aquí: http://dabblet.com/gist/d6ebc6c14bd68a4b06a6

Encontrado a través del comentario 20 aquí https://bugzilla.mozilla.org/show_bug.cgi?id=294932

Ricardo
fuente
1
Disculpas, olvidé la pantalla: bloque en línea / elemento de bloque para envolver el objeto
Richard
1
La mejor solución aquí!
Baldráni
esta es la mejor solución para este problema y funciona en todos los navegadores
Kalpesh Popat
1
si la imagen tiene bg transparente, entonces esos bits no parecen
cliqueables
Esto funcionó para mí, también tuve que agregar altura: 100% a los elementos a y span en mi situación
sk03
32

Me gustaría tomar el crédito por esto, pero encontré una solución aquí:

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

agregue lo siguiente al CSS para el ancla:

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>

Link funciona en el svg y en el respaldo.

noelmcg
fuente
2
Esta es la solución más fácil y más compatible en opinión
tipo-estilo
3
esto todavía tiene un problema: ¡los eventos de puntero SVG (animaciones) ya no funcionan (mouseover, mouseout, click)! Al igual que simplemente usando eventos de puntero: ninguno en el objeto en sí ...
qdev
26

También podría pegar algo como esto en la parte inferior de su SVG (justo antes de la </svg>etiqueta de cierre ):

<a xmlns="http://www.w3.org/2000/svg" id="anchor" xlink:href="/" xmlns:xlink="http://www.w3.org/1999/xlink" target="_top">
    <rect x="0" y="0" width="100%" height="100%" fill-opacity="0"/>
</a>

Luego solo modifique el enlace para adaptarlo. He usado el 100% de ancho y alto para cubrir el SVG en el que se asienta. El crédito por la técnica es para las personas inteligentes en Clearleft.com, ahí es donde lo vi por primera vez.

Ben Frain
fuente
2
Tengo estilos CSS con un selector de desplazamiento incorporado en mi archivo SVG. Esta es la única solución que no desactiva el estilo.
MathieuLescure
21

Una simplificación de la solución de Richard. Funciona al menos en Firefox, Safari y Opera:

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

Consulte http://www.noupe.com/tutorial/svg-clickable-71346.html para obtener soluciones adicionales.

Feuermurmel
fuente
3
Gracias, lo necesitaba el conjunto de visualización de blocko inline-blocken la matriz <a>.
element119
Buen enlace: noupe.com/inspiration/tutorials-inspiration/… tiene ventajas y desventajas para cada solución.
Serge Stroobandt
También necesitaba usarlo inline-blocken algunos casos, pero blockparecía funcionar bien en otros casos; Supongo que depende de los bloques que lo encierran ...
Gwyneth Llewelyn
9

Para lograr esto en todos los navegadores, debe usar una combinación de los métodos @energee, @Richard y @Feuermurmel.

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

Agregando:

  • pointer-events: none; lo hace funcionar en Firefox.
  • display: block; lo hace funcionar en Chrome y Safari.
  • z-index: 1; z-index: -1; lo hace funcionar en IE también.
ChristopherStrydom
fuente
@janaspage No estoy seguro ... No lo he probado en IE 10. Avísame si funciona :)
ChristopherStrydom
@jaepage No debería importar, porque objectahora estará en un contexto de apilamiento más bajo (debajo) que su padre.
Jason T Featheringham
¿Funciona esto en un iPhone / móvil? no para mi no se puede hacer clic / tocar
bafromca
3

Resolví esto editando el archivo svg también.

Envolví el xml del gráfico svg completo en una etiqueta de grupo que tiene un evento de clic de la siguiente manera:

<svg .....>
<g id="thefix" onclick="window.top.location.href='http://www.google.com/';">
 <!-- ... your graphics ... -->
</g>
</svg>

La solución funciona en todos los navegadores que admiten script de svg de objeto. (por defecto, una etiqueta img dentro de su elemento de objeto para navegadores que no admiten svg y cubrirá la gama de navegadores)

Bruce Pezzlo
fuente
¿Encontraste que agregar el onclick al <svg>elemento externo y no envolverlo no funcionó?
Robert Longson
1
También puede usar los eventos del elemento svg raíz. Además de los eventos onclick, uso onmouseout, ontouchstart, ontouchend, etc ... y en cuanto al elemento svg raíz, uso el evento onload con frecuencia. La solución de Ben Frain a continuación implica dibujar un objeto de portada adicional (un rectángulo) para capturar los eventos de clic ... así que ofrecí esta solución que muestra cómo obtener eventos en los elementos de dibujo sin tener que hacer una cubierta transparente solo para obtener un evento de clic. Especialmente útil cuando no desea dibujar otro elemento o desea los eventos específicos de la forma existente y no un rectángulo.
Bruce Pezzlo
3

Probé este método sencillo y limpio y parece funcionar en todos los navegadores. Dentro del archivo svg:

<svg>
<a id="anchor" xlink:href="http://www.google.com" target="_top">
  
<!--your graphic-->
  
</a>
</svg>
  

Dario Rigon
fuente
El siguiente espacio de nombres 'xlink' tendrá que agregarse al elemento svg para que esto funcione: xmlns: xlink = " w3.org/1999/xlink "
Mere Development
Ninguna de las otras soluciones funcionó para mí, pero esta sí, ¡gracias!
ByteMyPixel
Aunque generalmente no tengo reparos en cambiar un archivo SVG directamente, en mi escenario, uso el mismo SVG para varios enlaces diferentes , lo que significa que, en teoría, tendría que crear un SVG diferente para cada uno. Alternativamente, por supuesto, podría agregar el bit gráfico en línea en la etiqueta <svg>, pero odio el código duplicado (aunque el SVG real que tengo es pequeño ...)
Gwyneth Llewelyn
0

Simplemente no lo uses <object>. Aquí hay una solución que funcionó para mí con <a>y <svg>etiquetas:

<a href="<your-link>" class="mr-5 p-1 border-2 border-transparent text-gray-400 rounded-full hover:text-white focus:outline-none focus:text-white focus:bg-red-700 transition duration-150 ease-in-out" aria-label="Notifications">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="30" 
    height="30"><path class="heroicon-ui" fill="#fff" d="M17 16a3 3 0 1 1-2.83 
    2H9.83a3 3 0 1 1-5.62-.1A3 3 0 0 1 5 12V4H3a1 1 0 1 1 0-2h3a1 1 0 0 1 1 
    1v1h14a1 1 0 0 1 .9 1.45l-4 8a1 1 0 0 1-.9.55H5a1 1 0 0 0 0 2h12zM7 12h9.38l3- 
   6H7v6zm0 8a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm10 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
    </svg>
</a>
Ege Hurturk
fuente
por cierto estoy usando tailwind css.
Ege Hurturk
-5

Hazlo con javascript y agrega un onClickatributo a tu objectelemento:

<object data="mysvg.svg" type="image/svg+xml" onClick="window.location.href='http://google.at';">
    <span>Your browser doesn't support SVG images</span>
</object>
Stefan Fandler
fuente
Intenté esto, con y sin las etiquetas <a> circundantes, y no puedo hacer que esto funcione. Intenté en FF y Chrome en Linux. ¿En qué navegador probaste esto?
iancoleman
66
Sería genial si pudiera probarlo y confirmar que funciona para que otros que lean esto puedan estar seguros de su respuesta. "Debe funcionar" está bien en teoría, pero para mí debe funcionar en la práctica.
iancoleman
Acabo de probar esto en Chrome 45 en Windows y parece funcionar bien. Agregué onClick directamente a una etiqueta SVG sin un ancla de ajuste. Sería bueno si los votos negativos explicaran por qué.
Chase