2012-01-20 13 views
11

Szukam sposobu, aby starsze przeglądarki wyświetlały obraz PNG zamiast SVG jako awarię po wykryciu. Logo mojej witryny jest obecnie w SVG, ale starsze przeglądarki, w szczególności IE 8 i poniżej, nie będą go renderować. Mam już logo w PNG. Jaki jest najlepszy sposób na wykonanie tego?Kod warunkowy wyświetlania PNG zamiast SVG dla starszych przeglądarek?

Dzięki

+0

nowe rozwiązanie w http://stackoverflow.com/a/26577458/304371 – Artru

Odpowiedz

16

Używaj warunkowych komentarzy 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

Jeśli jesteś również szukają sposobu, aby obsłużyć to dla przeglądarek innych niż IE, należy sprawdzić agenta użytkownika z javascript lub php.

+0

Dzięki, że pracował idealnie. Pozostaje tylko jeden problem, który, jak sądzę, można łatwo rozwiązać za pomocą właściwego kodu. W IE 8 i poniżej, PNG wyświetla się dobrze, ale szary kontur i czerwona ikona X z IE nie wiedząc, co zrobić z SVG nadal pozostaje. Czy istnieje sposób, aby IE ignorować mój tag SVG IMG? Dzięki. – Charlie

+0

Dlatego musisz umieścić tam wszystkie trzy komentarze warunkowe. Program IE nie wyświetli pliku .svg, jeśli znajduje się wewnątrz znacznika

+2

Nieznacznym minusem jest to, że przeglądarki zwykle pobierają oba zasoby w tym przypadku. –

+0

Inną wadą jest to, że element "object" może mieć dziwne zachowanie, np. Podpowiedzi interfejsu użytkownika jQuery dołączone do "obiektu" zostaną otwarte, ale nie zamkną się po kliknięciu myszką w wielu przeglądarkach. – hmundt

2

Proponuję przepisywanie atrybut obrazów SVG src gdy wykryje (przez Modernizr lub podobny), że przeglądarka nie obsługuje SVG natywnie. Coś jak:

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

używam the "transparent gradient" technique bo to jest CSS-tylko i nie wymaga hacki konkretnej przeglądarki.

Technika polega na tym, że przeglądarki obsługujące gradienty CSS są na tyle nowoczesne, że obsługują renderowanie SVG. Jeśli więc użyjemy obrazu tła, który składa się z dwóch warstw, z których jedna to SVG, a druga jest gradientem, tylko te przeglądarki, które są w stanie zrozumieć składnię gradientu, spróbują wyświetlić SVG.

Poniższy kod przedstawia podstawowe zasady 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); 

Dzięki tej technice, wszyscy użytkownicy będą widzieć obraz, a zostanie on wyświetlony za pomocą SVG dla najnowszych wersji przeglądarek. Cena do zapłaty jest taka, że ​​niektóre stare wersje przeglądarek (takie jak IE9 lub Firefox 3.5), które są również zdolne do renderowania SVG, ale nie obsługują gradientów, będą wyświetlały wersję zastępczą.

0

Aby śledzić komentarz Adiabatic: Można również ustawić zastępczą ścieżkę img jako atrybut danych. Pozwala to na większą elastyczność w ścieżkach zastępczych.

Przykład (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

Jak chodzi?

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

Zobacz także SVGeezy.

+0

To ładuje svg we wszystkich przypadkach. Może również wprowadzić nieskończoną pętlę, jeśli obraz onerror powoduje błąd. – Nemo64

+0

@ Nemo64 Zastępuje svg, jeśli nie można go załadować. Większość przeglądarek sprawdza 'onerror' tylko raz (np. Chrome i FF 15+). Aby uzyskać więcej informacji o Firefoksie, zobacz https://bugzilla.mozilla.org/show_bug.cgi?id=528448 Aby uzyskać kompatybilność wsteczną, po prostu dodaj 'this.onerror = null;' before settings 'src'. – SepehrM

+0

@ Nemo64 Chociaż obecnie polecam SVGeezy nad tym podejściem, wiele popularnych stron internetowych wciąż używa tego. – SepehrM

0

Preferuję technikę "warunkowego komentarza SVG" w przypadku obrazów treści, zgodnie z opisem Davida Gossa, jeśli obrazy nie są dekoracją.

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/

Na decorational obrazów używać "przezroczysty gradientu SVG awaryjnej techniki", jak opisane przez 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

Metoda ta pracował dla mnie:

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

} 
?> 

Przez wadę mówisz zmiennej "$ rozszerzenie" być PNG, ale jeśli przeglądarce Wersja jest w stanie renderować SVG, wtedy zmienna zmieni się na SVG.

Następnie w HTML wystarczy uzupełnić rozszerzenie pliku, tworząc echo zmiennej.

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

Teraz Twoja strona internetowa załaduje "image.png" lub "image.svg" w zależności od wersji przeglądarki.

Ważne informacje:

** aby uczynić ten skrypt trzeba skonfigurować Browscap.ini plików, dzięki czemu można korzystać z funkcji PHP „get_browser”.

** możliwości przeglądarki dotyczących SVG zostały uzyskane z tej strony:

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

+0

Wszystkie nowoczesne przeglądarki obsługują SVG od lat. Kliknij przycisk Pokaż wszystko na stronie informacyjnej, aby zobaczyć, jak daleko kończy się wsparcie z tyłu.Ta odpowiedź mogła być przydatna 5 lat temu, dziś jest zupełnie bezsensowna, a także niepoprawna, ponieważ Firefox ESR bardzo dobrze obsługuje SVG, a mimo to wykluczysz go za pomocą testów. –

+0

Cóż ... w zależności od lokalizacji, liczba osób, które NIE używają nowoczesnych przeglądarek, może się bardzo różnić. W moim środowisku przynajmniej ten skrypt nie jest bezcelowy i pomaga mi w moich projektach ... Z drugiej strony fakt, że nie zawierałem Firefox ESR, nie czyni odpowiedzi nieprawidłową, wystarczy dodać to konkretną wersję przeglądarki do skryptu. – user289877

Powiązane problemy