2012-01-20 12 views
11

Sto cercando un modo per far sì che i browser più vecchi visualizzino un'immagine PNG al posto di un file SVG come fallback quando rilevato. Il logo del mio sito è attualmente in SVG, ma i browser più vecchi, in particolare IE 8 e seguenti, non lo renderanno. Ho già il logo in PNG. Qual è il modo migliore per eseguire questo?Codice condizionale per la visualizzazione di PNG al posto di SVG per i browser più vecchi?

Grazie

+0

nuova soluzione a http://stackoverflow.com/a/26577458/304371 – Artru

risposta

16

Usa HTML commenti condizionali.

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

Se siete anche alla ricerca di un modo per gestire questo per browser diversi da IE, si dovrebbe verificare l'user agent con javascript o php.

+0

Grazie, che ha funzionato perfettamente. Rimane solo un problema ora che immagino possa essere risolto facilmente con il codice giusto. In IE 8 e in basso, il PNG viene visualizzato correttamente, ma il contorno grigio e l'icona X rossa di IE non sanno cosa fare con SVG. C'è un modo per far ignorare a IE il mio tag SVG IMG? Grazie. – Charlie

+0

Ecco perché dovresti inserire tutti e tre i commenti condizionali. IE non vedrà il .svg se si trova all'interno di un tag

+2

Un leggero svantaggio è che i browser in genere scaricano entrambe le risorse in questo caso. –

+0

Un altro svantaggio è che l'elemento "oggetto" potrebbe avere un comportamento strano degli eventi, ad es. I tooltipi dell'interfaccia utente jQuery collegati all'oggetto "si apriranno ma non chiuderanno il mouse in molti browser. – hmundt

2

suggerisco riscrivere l'attributo src delle immagini SVG quando si rileva (tramite Modernizr o simili) che il browser non supporta nativamente SVG. Qualcosa di simile:

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

io uso the "transparent gradient" technique perché è CSS-only e non richiede hack specifiche del browser.

La tecnica si basa sul fatto che i browser in grado di utilizzare i gradienti CSS sono abbastanza moderni da supportare il rendering SVG. Quindi, se usiamo un'immagine di sfondo composta da due livelli, uno essendo l'SVG e l'altro un gradiente, solo i browser in grado di comprendere la sintassi del gradiente proveranno a visualizzare SVG.

Il codice seguente mostra le regole di base 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 questa tecnica, tutti gli utenti vedranno l'immagine e questo verrà visualizzato utilizzando SVG per le ultime versioni dei browser. Il prezzo da pagare è che alcune vecchie versioni del browser (come IE9 o Firefox 3.5) che sono anche in grado di mostrare SVG ma non supportano le sfumature mostreranno la versione di fallback.

0

Per dare seguito al commento di Adiabatic: È anche possibile impostare il percorso img di fallback come attributo dei dati. Ciò consente una maggiore flessibilità nei percorsi di fallback.

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

ne dici di questo?

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

prendere anche uno sguardo a SVGeezy.

+0

Questo carica la svg in tutti i casi. Potrebbe anche introdurre un ciclo infinito se l'immagine onerror causa un errore. – Nemo64

+0

@ Nemo64 Sostituisce lo svg se non può essere caricato. La maggior parte dei browser controlla 'onerror' solo una volta (come Chrome e FF 15+). Per maggiori informazioni su Firefox fai riferimento a https://bugzilla.mozilla.org/show_bug.cgi?id=528448 Per compatibilità con le versioni precedenti puoi semplicemente aggiungere 'this.onerror = null;' prima delle impostazioni 'src'. – SepehrM

+0

@ Nemo64 Sebbene al giorno d'oggi raccomando a SVGeezy questo approccio, molti siti Web popolari lo utilizzano ancora. – SepehrM

0

Preferisco la "tecnica di fallback di commenti commenti SVG" per le immagini dei contenuti, come descritto da David Goss, se le immagini non sono decorative.

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/

Per le immagini decorational, utilizza la tecnica "fallback trasparente gradiente SVG", come descritto da 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

Questo metodo ha funzionato per me:

<?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"; 

} 
?> 

per difetto si stanno dicendo la variabile "$ estensione" di essere PNG, ma se il browser la versione è in grado di rendere SVG, quindi la variabile cambierà in SVG.

Quindi nel codice HTML è sufficiente completare l'estensione del file facendo eco della variabile.

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

Ora la tua pagina web caricherà "image.png" o "image.svg" a seconda della versione del browser.

Informazioni importanti:

** al fine di rendere questo lavoro lo script è necessario impostare il file Browscap.ini modo da poter utilizzare la "get_browser" funzione PHP.

** funzionalità browser Per quanto riguarda SVG sono stati ottenuti da questo sito:

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

+0

Tutti i browser moderni supportano SVG da anni. Fai clic sul pulsante Mostra tutto nella pagina dei cani per vedere fino a che punto il supporto arriverà.Questa risposta potrebbe essere stata utile 5 anni fa, oggi è completamente inutile e anche scorretta, dal momento che qualcosa come Firefox ESR supporta SVG perfettamente bene e tuttavia lo escluderesti usando i tuoi test. –

+0

Beh ... a seconda della posizione, il numero di persone che NON usano i browser moderni può variare molto. Nel mio ambiente almeno questo script non è inutile e mi aiuta con i miei progetti .... D'altra parte, il fatto che non includessi Firefox ESR, non rende la risposta errata, basta aggiungere che versione specifica del browser per lo script. – user289877