Přejít k navigační liště

Zdroják » Webdesign » Jak na SVG fallbacky

Jak na SVG fallbacky

Články Webdesign

Pojďme prozkoumat náhradní řešení pro prohlížeče, které neumí SVG. Aktuálně se to týká jen Internet Exploreru ve verzi 8 a Android Browseru 2.3 a starších. V ČR to budou 2 – 4 % uživatelů.

Nálepky:

Článek původně vyšel na autorově webu Vzhůru dolů.

Jako fallback do těchto prohlížečů najčastěji posíláme PNG bitmapu. Proto se ji musíme nejprve naučit nějak elegantně vytvořit.

Jak generovat PNG alternativy

Možností je hodně. Od ruční konverze pomocí editoru nebo online nástrojů přes generování na serveru až po Grunt na lokále, který používám já. U mě jde konkrétně o kombinaci dvou pluginů: grunt-contrib-imagemin pro zmenšení SVG a grunt-svg2png pro generování PNG alternativ.

PNG obrázky bychom měli, teď se potřebujeme naučit detekovat podporu vektorového formátu.

Detekce SVG v prohlížečích

Nejspolehlivější detekci nabízí javascriptová metoda s detekcí pomocí document.implementation.hasFeature.

Tady je kód, který jakmile zjistí, že prohlížeč SVG neumí, přidá k dokumentu třídu .no-svg. Ta se nám bude hodit v CSS.

if (!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1")) {
  document.documentElement.className = "no-svg";
}

Stejný kód používá i detekční knihovna Modernizr. Ta navíc umí zjišťovat podporu pro jednotlivé vlastnosti SVG.

Rozebereme si teď jednotlivé způsoby vkládání SVG a možnosti fallbacků pro ně.

SVG jako obrázek na pozadí v CSS

Do CSS budeme dávat asi hlavně ikony a dekorativní grafiku, jako je třeba vzhled tlačítek udělaný pomocí vektorů.

Vybaveni kouskem detekčního javascriptu, který nám přidává třídu .no-svg, můžeme vložit SVG ikonku s fallbackem do PNG:

.icon {
  background-image: url('icon.svg');
}

.no-svg .icon {
  background-image: url('icon.png');
}

Příklad s SVG v CSS na CodePenu: cdpn.io/e/FEzcI.

Na webu asi najdete i další fallback řešení. Například pomocí vícenásobných pozadí nebo gradientů. To moc nedoporučuji. Jde o hack, který nefunguje ve všech prohlížečích, ve kterých fungovat má. Detekce vlastností je spolehlivější.

SVG v HTML jako <img>

Řešení hlavně pro obsahovou grafiku – schémata, grafy nebo logotypy. Občas i ikony.

Pomocí detekce vlastnosti

V HTML se tváříte, že SVG zvládají všechny prohlížeče:

<img src="logo.svg" 
  width="100" height="100" alt="">

V javascriptovém kódu pak obstaráte výměnu koncovky souboru v src v momentě, kdy zjistíte, že prohlížeč vektorový formát nezvládne:

if (!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1")) {
  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';
      }
  }
}

Tohle používám na Vzhůru dolů. Příklad s SVG v HTML na CodePenu: cdpn.io/e/isrIB.

Pomocí Picturefillu

Málo se ví, že polyfil Picturefill umí – kromě rozchození responzivních obrázků ve všech prohlížečích – také detekovat SVG. Pokud už na stránce Picturefill používáte pro jiné účely, tohle se vám bude líbit:

<picture>
  <source type="image/svg+xml" srcset="logo.svg">
  <img src="logo.png" alt="">
</picture>

Fallbacky pro inline <svg>

Tady je to složitější, protože dovnitř HTML můžete chtít SVG vložit jak kvůli obyčejnému efektu po najetí myši nebo proto, že máte složitou infografiku. Fallback řešení je pokaždé trochu jiné.

Pomocí detekce vlastnosti

Tady je potřeba zjišťovat podporu trochu jiným způsobem. Můžeme použít detekci z CSS Tricks:

function supportsSvg() {
  var div = document.createElement('div');
  div.innerHTML = '<svg/>';
  return (div.firstChild && div.firstChild.namespaceURI) 
    == 'http://www.w3.org/2000/svg';
};

Pomocí alternativního HTML obsahu

Výhodné zejména v situaci, kdy v SVG máte interaktivnější nebo strukturovanější typ obsahu.

<svg>
  <desc>
    <div class="svg-fallback">
        <h1>Obsah v podobě tabulky</h1>
        <table></table>  
    </div>
  </desc>
  <!-- Obsah v podobně interaktivního SVG -->
</svg>

Značka <desc> slouží pro popsání obsahu SVG slepeckým čtečkám. Byla by proto chyba vložit do ní varování typu „Váš prohlížeč nepodporuje SVG“. Dejte tam prostě obsah v alternativní podobě. To je perfektní řešení pro čtečky i staré prohlížeče.

Jo – a pozor na <img>. Ten uvnitř <desc> být může, ale stáhnou ho všechny prohlížeče. Tedy i ty, které namísto obrázku vykreslí SVG obsah.

Pomocí Grunticon

Grunticon je malá javascriptová knihovna a Grunt plugin, který obstarává kompletní workflow pro práci s SVG. Včetně generování fallbacků. Pokud chcete používat vektory uvnitř <svg> značky, javascriptová část Grunticon je vloží do DOMu a Grunt plugin vám předgeneruje CSS s fallbacky i pro velmi staré prohlížeče typu IE6.

Komentáře

Odebírat
Upozornit na
guest
3 Komentářů
Nejstarší
Nejnovější Most Voted
to je jedno

Hezky clanek, chvili jsem premyslel to studovat detailneji a neco se priucit, ale nakonec jsem si rekl: at si to aktualizujou, prdim na ne, je to jejich boj.

karel

IE8 – znamena win XP už kvůli tomu na ně kašlat
android browser 2.3 <= no to samé jako s XP
pokud uživatelům nevadí OS bez aktualizací a se spoustou bezpečnostních chyb jistě jim nebude vadit web bez SVG

Martin

Ale zrovna u SVGček je ten fallback skoro bez práce (alespoň u těch, která jsou jako background). Přidáte jeden řádek JS, který přidá .no-svg třídu, a grunt (gulp) vygenruje svgčka pro moderní prohlížeče a pngčka pro dinosaury. Navíc k tomu mám mixinu, která mi udělá i příslušné třídy (s no-svg a bez no-svg) s rozměry obrázků.
A pokud se mi nechce řešit vlastní detekci, tak nasadím grunticon (tam jde jen o přečtení si, jak to rozchodit).

Co je nového v Gitu 2.55.0

Git 2.55.0 přináší šest zajímavých novinek – od dlouho očekávané podpory fsmonitoru na Linuxu, přes zjednodušení úprav historie commitů pomocí nového příkazu git history fixup, až po další krok v postupné integraci jazyka Rust do jádra Gitu. Přidává se i možnost pushovat do skupiny vzdálených repozitářů, omezit šířku grafu u git log --graph a zrychlit git grep a git cherry v částečných klonech.

Od statických stránek k edge computingu: Historie webových technologií za 30 let

Třicet let. Tak dlouho už web existuje v podobě, kterou bychom dnes alespoň zhruba poznali — od prvních statických dokumentů přes éru aplikací běžících v prohlížeči až po kód, který se spouští na stovkách míst po celém světě jen pár milisekund od uživatele. Tenhle příběh ale není jen suchým výčtem technologií a verzí. Je to příběh jednoho kyvadla, které se celé tři dekády houpe mezi serverem a klientem — a které právě teď nachází nový bod rovnováhy někde uprostřed, na okraji sítě.