Grunticon je sada nástrojů pro maximalizaci zpětné kompatibility SVG.
Nabízí přímé vložení vektorového obrázku do značky <svg> pomocí Javascriptu. To vám umožní ovlivňovat části SVG pomocí stylů a skriptů podobně jako to děláte u jiných části stránky. Jako bonus od Grunticon dostanete kompatibilitu až do Internet Exploreru ve verzi 6. Pamatujete si na něj ještě?
V „balení“ najdete Grunt úlohu pro zpracování sady SVG obrázků a javascriptovou knihovnu pro ošetření fallbacků. Úloha vygeneruje PNG verze obrázků pro staré prohlížeče a tři verze souborů se styly. Kouskem skriptu se pak rozhoduje, který typ fallbacku se použije.
Připravil jsem malé demo využití Grunticon. Pojďme to vše ukázat v detailním postupu implementace.
1. Nainstalujte Grunticon
npm install grunt-grunticon --save-dev
Předtím možná budete potřebovat rozchodit Node.js ekosystém na svém počítači.
2. Nastavte Grunt úlohu
grunticon: {
icons: {
files: [
{
expand: true,
cwd: 'src/img/svg',
src: ['*.svg'],
dest: 'dist/grunticon'
}
],
options: {
enhanceSVG: true,
compressPNG: true,
pngpath: '../png',
datasvgcss: 'css/icons.css',
datapngcss: 'css/icons-png.css',
urlpngcss: 'css/icons-png-bg.css'
}
}
}
- Složku se zdrojovými SVG obrázky definujeme v
cwd. enhanceSVG: trueříká, že SVG chcete vkládat přímo do DOMu.compressPNG: true– výstupní PNG alternativy se komprimují.pngpath– cesta k PNG alternativám z pohledu CSS.datasvgcss– styl pro moderní prohlížeče.datapngcss– styl pro prohlížeče co neumí inline SVG. Týká se dědka IE8, Opery Mini nebo Androidu do verze 2.3.urlpngcss– styl pro prohlížeče co neumí inline SVG, ani data-uri. Týká se třeba IE7 a IE6. Pradědka a prapradědka.
Grunt úlohu pak prostě spustíte:
grunt grunticon
V definovaných adresářích by se měly objevit nové soubory. V dest adresáři je pak náhledový soubor, kde si vygenerované můžete hned zkusit.
3. Úprava HTML
Ikonu vložíte jednoduše třídou ze stylu co vygeneruje Grunticon – v demonstračním příkladu je to třeba .icon-bootstrap. Pokud stojíte o vložení do DOMu pomocí značky <svg>, stačí použít parametr data-grunticon-embed:
<div class="icon icon-bootstrap"
data-grunticon-embed>
</div>
Do hlavičky přidáte skript, který vám Grunticon vygeneruje pro načítání ikonek a zavoláte funkci grunticon():
<script src="/js/grunticon.loader.js"></script>
<script>
grunticon(
[
// 1. SVG jako data-uri:
"/css/icons.css",
// 2. PNG jako data-uri:
"/css/icons-png.css",
// 3. PNG jako obrázek na pozadí:
"/css/icons-png-bg.css"
],
grunticon.svgLoadedCallback
);
</script>
Nezapomeňte uvést i alternativu pro prohlížeče bez běžícího Javascriptu:
<noscript>
<link href="/css/icons-png-bg.css" rel="stylesheet">
</noscript>
Další kroky jsou volitelné. Potřeboval jsem je udělat, protože ikony používám v responzivním layoutu.
Ošetření zachování poměru stran
Zachování poměru stran se hodí pro krátký čas než se načtou SVG ikony a pro prostředí bez Javascriptu. Tohle nám trochu zkomplikuje HTML kód:
<p class="icon">
<span class="icon-container">
<span class="icon-inside icon-bootstrap"
data-grunticon-embed></span>
</span>
</p>
V CSS pak použijeme známým trik pro vkládaná média:
.icon-container {
display: block;
position: relative;
width: 100%;
height: 0;
padding-bottom: 56.25%; /* 16:9 */
/* Zástupná barva než se do boxíku načtou ikony: */
background-color: #ddd;
}
.icon-inside {
display: block;
position: absolute;
width: 100%;
height: 100%;
/* Pro background-image fallbacky: */
background-size: contain;
}
Vkládané SVG se samo o sobě nepřizpůsobuje rodičovskému kontejneru, proto je potřeba zapnout ještě tohle:
.icon svg {
width: 100%;
height: 100%;
}
Velikost alternativních PNG obrázků
Šířka a výška fallback obrázků se bere z hodnot, které máte ve zdrojových obrázcích u značky <svg>. Buď si je tedy nastavte podle fixní šířky layoutu ve starších prohlížečích, nebo se bez nich v SVG zdrojích obejděte a velikosti PNG si nastavte v Grunt úloze parametry defaultWidth a defaultHeight.
A to je vše, přátelé. Více najdete v demu na Githubu.
Komentáře
Máte doplnění, komentář nebo jste našli chybu?
Pro přidání názoru se prosím
přihlaste nebo si zřiďte účet.