2012-01-20 12 views
11

Estoy buscando una forma de que los navegadores más antiguos muestren una imagen PNG en lugar de un SVG como una alternativa cuando se detectan. El logotipo de mi sitio se encuentra actualmente en SVG, pero los navegadores más antiguos, específicamente IE 8 y versiones posteriores, no lo renderizarán. Ya tengo el logo en PNG. ¿Cuál es la mejor manera de ejecutar esto?¿Código condicional para mostrar PNG en lugar de SVG para navegadores antiguos?

Gracias

+0

nueva solución a http://stackoverflow.com/a/26577458/304371 – Artru

Respuesta

16

Use los comentarios condicional de HTML.

<!--[if lte IE 8]><img src="logo.png" /><![endif]--> 
<!--[if gt IE 8]><img src="logo.svg" /><![endif]--> 
<!--[if !IE]> --><img src="logo.svg" /><!-- <![endif]--> 

http://msdn.microsoft.com/en-us/library/ms537512%28v=vs.85%29.aspx

Si también está buscando una manera de manejar esto para los navegadores que no sean IE, usted debe comprobar el agente de usuario con javascript o php.

+0

Gracias, que funcionaba perfectamente. Solo queda un problema ahora que imagino que se puede resolver fácilmente con el código correcto. En IE 8 y abajo, el PNG se muestra bien, pero el contorno gris y el icono rojo X de IE sin saber qué hacer con el SVG aún permanece. ¿Hay alguna manera de que IE ignore mi etiqueta SVG IMG? Gracias. – Charlie

+0

Es por eso que deberías poner los tres comentarios condicionales allí. IE no verá el archivo .svg si está dentro de una etiqueta

+2

Una ligera desventaja es que los navegadores normalmente descargan ambos recursos en este caso. –

+0

Otra desventaja es que el elemento "objeto" puede tener algún comportamiento de evento extraño, p. Las sugerencias de herramientas de jQuery UI conectadas al "objeto" se abrirán pero no cerrarán en mouse en muchos navegadores. – hmundt

2

sugiero volver a escribir el atributo src de sus imágenes SVG cuando detecte (a través de Modernizr o similar) que el navegador no soporta SVG de forma nativa. Algo así como:

if (!Modernizr.svg) { 
    var imgs = document.getElementsByTagName('img'); 
    var endsWithDotSvg = /.*\.svg$/ 
    var i=0; 
    var l = imgs.length; 
    for (; i != l; ++i) { 
     if (imgs[i].src.match(endsWithDotSvg)) { 
      imgs[i].src = imgs[i].src.slice(0, -3) + "png"; 
     } 
    } 
} 
2

utilizo the "transparent gradient" technique porque es de sólo CSS y no requiere cortes específicas del navegador.

La técnica se basa en el hecho de que los navegadores que pueden usar degradados CSS son lo suficientemente modernos como para admitir la representación SVG. Por lo tanto, si utilizamos una imagen de fondo compuesta por dos capas, una SVG y otra gradiente, solo aquellos navegadores capaces de comprender la sintaxis de gradiente intentarán mostrar el SVG.

El código siguiente muestra las reglas básicas de CSS:

background: transparent url(fallback-image.png) center center no-repeat; 
background-image: -webkit-linear-gradient(transparent, transparent), url(vector-image.svg); 
background-image: -moz-linear-gradient(transparent, transparent), url(vector-image.svg); 
background-image: linear-gradient(transparent, transparent), url(vector-image.svg); 

Con esta técnica, todos los usuarios podrán ver la imagen y se mostrará el uso de SVG para las últimas versiones de navegadores. El precio a pagar es que algunas versiones antiguas del navegador (como IE9 o Firefox 3.5) que también son capaces de renderizar SVG pero que no admiten gradientes mostrarán la versión alternativa.

0

Para realizar un seguimiento del comentario de Adiabatic: También podría establecer la ruta de img de respaldo como atributo de datos. Esto permite una mayor flexibilidad en sus rutas de respaldo.

Ejemplo (HTML + JS):

<object type="image/svg+xml" data="image.svg" data-fallback="image.png"></object> 

<script> 
if (!Modernizr.svg) { 
    var imgs = document.getElementsByTagName('img'); 
    var endsWithDotSvg = /.*\.svg$/ 
    var i=0; 
    var l = imgs.length; 
    for (; i != l; ++i) { 
     if (imgs[i].src.match(endsWithDotSvg)) { 
      var fallback = imgs[i].getAttribute('data-fallback'); 
      if(typeof fallback !== "undefined" && fallback !== "") 
      { 
       imgs[i].src = fallback; 
      } 
     } 
    } 
} 
</script> 
2

¿Qué tal esto?

<img src="your.svg" onerror="this.src=your.png"> 

también echar un vistazo a SVGeezy.

+0

Esto carga el svg en todos los casos. También podría introducir un bucle infinito si la imagen onerror causa un error. – Nemo64

+0

@ Nemo64 Esto reemplaza la svg si no se puede cargar. La mayoría de los navegadores comprueban 'onerror' solo una vez (como Chrome y FF 15+). Para obtener más información sobre Firefox, consulte https://bugzilla.mozilla.org/show_bug.cgi?id=528448. Para compatibilidad con versiones anteriores, simplemente puede agregar 'this.onerror = null;' before settings 'src'. – SepehrM

+0

@ Nemo64 Aunque hoy recomiendo SVGeezy en este enfoque, muchos sitios web populares todavía usan este. – SepehrM

0

Prefiero la técnica de "comentarios condicional SVG fallback" para imágenes de contenido, como describe David Goss, si las imágenes no son una decoración.

HTML:

<a class="site-logo" href="/"> 
    <!--[if gte IE 9]><!--><img alt="Acme Supplies" src="logo.svg" data-fallback="logo.png" onerror="this.src=this.getAttribute('data-fallback');this.onerror=null;" /><!--<![endif]--> 
    <!--[if lt IE 9]><img alt="Acme Supplies" src="logo.png" /><![endif]--> 
</a> 

http://davidgoss.co.uk/2013/01/30/use-svg-for-your-logo-and-still-support-old-ie-and-android/

Para imágenes decorational, uso la "técnica de retorno transparente gradiente SVG", como se describe por Pau Giner.

CSS:

.icon-file { 
    background: transparent url(../images/file.png) center center no-repeat; 
    background-image: -webkit-linear-gradient(transparent,transparent), url(../images-svg/file.svg); 
    background-image:  -o-linear-gradient(transparent,transparent), url(../images-svg/file.svg); 
    background-image: -moz-linear-gradient(transparent,transparent), url(../images-svg/file.svg); 
    background-image:  -ms-linear-gradient(transparent,transparent), url(../images-svg/file.svg); 
    background-image:   linear-gradient(transparent,transparent), url(../images-svg/file.svg); 
    background-size: 100%; 
} 

http://pauginer.com/post/36614680636/invisible-gradient-technique

-1

Este método funcionó para mí:

<?php 
$browser = get_browser(null, true); 
$extension = "png"; 

if ($browser['browser'] == "Chrome" && $browser['version'] >= 49){ 
    $extension = "svg"; 
}else if($browser['browser'] == "Firefox" && $browser['version'] >= 57){ 
    $extension = "svg"; 
}else if($browser['browser'] == "Opera" && $browser['version'] >= 49){ 
    $extension = "svg"; 
}else if($browser['browser'] == "IE" && $browser['version'] >= 11){ 
    $extension = "svg"; 
}else if($browser['browser'] == "Safari" && $browser['version'] >= 11){ 
    $extension = "svg"; 

} 
?> 

Por defecto le está diciendo a la variable "$ extensión" para ser PNG, pero si el navegador la versión es capaz de renderizar SVG, entonces la variable cambiará a SVG.

Luego, en su HTML solo completa la extensión de archivo haciendo un eco de la variable.

<img src="image.<?php echo $extension ?>"> 

Ahora su página web cargará "image.png" o "image.svg" dependiendo de la versión del navegador.

Información adicional:

** con el fin de hacer que esto funcione secuencia de comandos que necesita para configurar el browscap.ini archivo para que pueda utilizar el "get_browser" función de PHP.

** capacidades de navegador con respecto a SVG se obtuvieron de este sitio web:

https://caniuse.com/#search=svg

+0

Todos los navegadores modernos han soportado SVG durante años. Haga clic en el botón Mostrar todo en la página caniuse para ver qué tan atrás está el soporte.Esta respuesta podría haber sido útil hace 5 años, hoy es completamente inútil y también incorrecta ya que algo como Firefox ESR soporta SVG perfectamente bien y sin embargo lo excluiría usando sus pruebas. –

+0

Bueno ... dependiendo de su ubicación, la cantidad de personas que NO usan navegadores modernos puede variar mucho. En mi entorno, al menos este script no es inútil y me ayuda con mis proyectos ... Por otro lado, el hecho de que no incluí Firefox ESR, no hace que la respuesta sea incorrecta, solo tiene que agregar que versión específica del navegador para el script. – user289877

Cuestiones relacionadas