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?

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.


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/


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


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.


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.


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.


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.

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


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


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>

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>

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.