https://jecas.cz/svg
2021-10-11
O webu
SVG
SVG
6. prosince 2016 Obrázky Responsivní design
SVG je grafický formát vhodný pro grafické prvky, které mají mít možnost měnit svou velikost.
Podpora
Kdy použít SVG
Výhody SVG
Nevýhody
Vložení SVG na stránku
Značka
Vložení SVG kódu do HTML
CSS background
SVG přes
Značka
Test podpory SVG
SVG fallback
SVG ikony / sprite
Protokol HTTP/2
Různá velikost
SVG v data-uri
Skutečný SVG sprite
SVG sprite z externího souboru
Grafické programy pro SVG
Inkscape
Adobe Illustrator
Online editory
Zobrazení SVG v průzkumníku
Optimalisace SVG
SVGOMG
SVG Editor
Převod PNG na SVG
Text v SVG
SVG ikony ke stažení
Odkazy jinam
SVG animace
SVG bannery
SVG filtry a textury
Generátory
Grafy
WebGL
Přednášky
Zkratka SVG znamená Scalable Vector Graphics – škálovatelná vektorová grafika.
Zásadní rozdíl oproti běžným formátům obrázků jako je PNG, GIF nebo JPG spočívá v tom, že jednotlivé části obrázku jsou přesně popsány XML značkami.
Má-li být na obrázku obdélník (anglicky rectangle), přidá se do značka :
Po nastavení rozměrů a barvy výplně (fill) je obrázek na světě:
Jak je vidět na ukázce, kód SVG obrázku jde vložit přímo do HTML.
Po uložení tohoto krátkého kódu do textového souboru s příponou *.svg vznikne plnohodnotný SVG obrázek.
V uloženém souboru je nutné uvést jmenné prostory:
Potom jde použít jako jakýkoliv jiný obrázek standardním způsobem se značkou :
Nebo jako CSS background:
element {
background: url(obrazek.svg);
}
Podpora
SVG obrázky jde používat od IE 9. Starší Internet Explorery podporují jiný vektorový formát – VML (Vector Markup Language).
Kromě IE 8 nefunguje SVG ještě ve starém Android Browseru 2.3.
Za rozšíření formátu SVG může hlavně vzestup responsivních webů, protože je najednou nutné zobrazovat grafické prvky v různých rozlišeních.
Kdy použít SVG
SVG se hodí prakticky na všechno kromě fotografií, tedy:
loga,
ikony,
prvky uživatelského rozhraní,
vektorové ilustrace
Kromě prostých obrázků se SVG hodí i pro reklamní bannery, infografiky, interaktivní grafické prvky, datové visualisace / grafy, animované ilustrace nebo pro efekty, které jsou aplikovatelné na HTML prvky.
Výhody SVG
Je možné měnit rozměry (width a height) bez ztráty kvality a změny datového objemu.
Proto je SVG velmi užitečné při tvorbě responsivního webu. Při zvětšení nebo zmenšení obrázku mimo skutečné rozměry je SVG obrázek pořád téměř dokonale ostrý.
Dále není potřeba vytvářet více obrázků pro různou hustotu pixelů.
Obrázek v SVG vypadá dobře i při zoomování stránky.
Kromě značky či CSS vlastnosti background jde SVG obrázek vložit přímo do stránky.
SVG obrázek jde stylovat pomocí CSS. Jisté části se klidně mohou například přebarvit při najetí myší (:hover). Změny mohou být díky CSS transition i plynulé.
S obrázkem jde manipulovat JavaScriptem. Pomocí JS jde SVG i nakreslit.
Jednotlivé prvky a efekty SVG obrázku jdou výborně animovat.
Do obrázku jde vkládat text, který je skutečně text a ne jen barevné body, které utváří písmena.
Nevýhody
Existují ale i nevýhody:
Základní podpora v prohlížečích je slabší než u klasických formátů, které fungují všude. SVG nepodporuje IE 8 a Android Browser 2.3.
Vzhledem k tomu, že obrázky často bývají nepostradatelnou součástí stránky, je jejich nezobrazení problematické. Je potom nutné SVG obrázek převést ještě do klasickém formátu pro starší prohlížeče.
Pokročilejší funkce mají potom podporu proměnlivější a chování se občas liší napříč prohlížeči.
SVG se nehodí pro všechno – pro grafiku, která nevzešla z grafického editoru, ale třeba z fotoaparátu, je formát SVG naprosto nevhodný.
Datová velikost může být u SVG větší než u optimalisovaného PNG obrázku. SVG jde ale ještě komprimovat při přenosu pomocí gzipu, což může jeho velikost srazit na podobnou velikost.
Otevřený zdrojový kód – zdrojový kód SVG si lze prohlížet v libovolném textovém editoru. SVG obrázek se chrání před kopírováním a upravováním ještě hůř než klasické obrázky.
Není problém si jednotlivé části SVG projít ve vývojářských nástrojích:
Prohlížení SVG obrázku ve vývojářských nástrojích
Vložení SVG na stránku
Samotné použití SVG na stránce je relativně komplikované. Existují základní tři způsoby:
Značka
Klasická značka funguje i pro SVG:
Fallback pro starší prohlížeče jde potom zajistit JavaScriptem u události onerror:
Případě použít nepopulární detekci na straně serveru. Ta nebude trpět tím, že se nepodporovaným prohlížečům stáhnou dva obrázky.
Vložení SVG kódu do HTML
SVG jde vložit do stránky přímo pomocí elementu . Při tomto postupu se obrázek stane součástí DOMu. To umožní jeho snadné stylování a ovládání JavaScriptem.
Takové vložení je pro pohodlnost vhodné řešit na straně serveru. Příklad v PHP:
Warning : file_get_contents(obrazek.svg): failed to open stream: No such file or directory in /3w/2ld.cz/t/txtapk-com/svg-jecas-cz.txt on line 175
Vložení SVG při použití Latte (šablonovací nástroj Nette frameworku):
{file_get_contents($baseUrl . '/images/obrazek.svg')|noescape}
Tento způsob vložení je hodně podobný použití data-uri. Ušetří se tím HTTP požadavek, ale obrázek se nebude cacheovat.
Inline vložení značkou má lehce horší podporu v prohlížečích. Kromě nepodporovaných prohlížečů IE 8 a Android Browser 2.3 nefunguje tento postup ve starých versích dalších prohlížečů:
Can I use: Inline SVG in HTML5
Pro nepodporované prohlížeče se nabízí detekce na straně serveru. Případně jde pro inline SVG použít záložní obsah s použitím značek a :
Nebo alternativní obsah umístit do značky , jejíž obsah se v podporovaných prohlížečích nezobrazí.
Nabízí se otázka, proč do / neumístit přímo značku . To má svůj dobrý důvod: prohlížeče podporující SVG by potom stáhly i záložní obrázek.
CSS background
Pro všelijaké SVG ikonky a podobně se typicky hodí použít CSS pozadí spolu s background-size:
element {
background: url(obrazek.svg) no-repeat;
background-size: contain;
}
Při použití CSS backgroundu se nabízí poměrně jednoduché řešení fallbacku pro starší prohlížeče. Podpora SVG je v IE stejná jako podpora vícenásobných obrázků (IE 9+):
element {
background: url(obrazek.png);
background-image: url(obrazek.svg), none;
}
Nejprve se nastaví pozadí na PNG obrázek a následně se přepíše dvěma obrázky: SVG obrázkem a ničím (none). Prohlížeče nepodporující vícenásobné pozadí celou deklaraci s background-image zahodí a použijí PNG.
Problematický je v tomto Android Browser 2.3 a starší, který nezná SVG, ale umí vícenásobné pozadí, takže nezobrazí nic.
Obdobně jde využít (ne)podpory CSS gradientů:
element {
background: url(obrazek.png);
background-image: url(obrazek.svg),
linear-gradient(transparent, transparent);
}
To sice vyřadí starý Adroid Browser, ale rovněž bude místo SVG jen záložní obrázek v prohlížečích, které SVG podporují: IE 9 a Opera Mini.
SVG přes
Značka slouží pro universální vložení cizího prvku do stránky.
Výhoda je v tom, že přímo do značky lze umístit obsah, který prohlížeč použije v případě, že objekt nezná.
Záložní obrázek je vhodné vložit prostřednictvím CSS pozadí a ne značkou , aby záložní obrázek zbytečně nestahovaly prohlížeče, které umí .
Značka
Značka SVG umožňuje pomocí elementu vložit v rámci libovolný obrázek:
Z toho jde vymyslet zajímavý fallback pro prohlížeče, co SVG neznají. Značka se mimo element totiž chová prakticky stejně jako , takže jde do src připojit záložní obrázek v PNG.
Starší prohlížeče budou neznámou značku ignorovat a zobrazí jako . Prohlížeče, co SVG znají, potom budou zase ignorovat atribut src a zobrazí obrazek.svg:
Je-li obdélník modrý, zobrazuje se SVG. V nepodporovaných prohlížečích se zobrazuje následující PNG obrázek:
PNG obrázek
Test podpory SVG
Detekovat podporu SVG v JavaScriptu jde pohodlně s využitím knihovny Modernizr:
if (!Modernizr.svg) {
// SVG není podporováno
}
Samostatný test podpory SVG je tam udělán následovně:
function supportsSVG() {
return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', "svg").createSVGRect;
}
SVG fallback
Pro případ, že prohlížeč SVG nepodporuje, se zdá být nejsnazší fallback s CSS backgroundem, který využívá podobné podpory SVG jako vícenásobného pozadí.
element {
background: url(obrazek.png);
background-image: url(obrazek.svg), none;
}
Není závislý na JS a funguje skoro všude. Pro vyšší jistotu se může přidat třída .no-svg pro / na základě detekce podpory SVG v JS nebo dle detekce problematického zařízení na serveru.
A v CSS mít ještě zálohu:
element {
background: url(obrazek.png);
background-image: url(obrazek.svg), none;
}
.no-svg element {
background-image: url(obrazek.png);
}
Další příklady SVG fallbacků:
SVG fallback pure CSS: Can I use Part 5
SVG Fallbacks
A Complete Guide to SVG Fallbacks
SVG ikony / sprite
Pro optimalisaci počtu HTTP spojení bývá zvykem všechny obrázky spojit do jednoho a jednotlivé obrázky zobrazovat vhodně nastaveným background-position.
CSS sprite – spojení všech obrázků do jednoho
Menší vsuvka ohledně budoucnosti:
Protokol HTTP/2
Protokol HTTP/2 řeší problém se stahováním velkého množství externích souborů. Po jeho rozšíření nebude problém připojit do stránky desítky souborů s ikonkami bez zpomalení načítání.
Používání CSS spritů a spojování souborů bude potom naopak anti-pattern, protože bude komplikovat cacheování.
Klasický CSS sprite postup jde použít i v případě SVG. Jen se tím při fixních rozměrech nic moc nezíská (kromě ostrých ikonek při zoomu a na displejích s velkou hustotou pixelů).
Různá velikost
Aby šly ikonky snadno zvětšovat a zmenšovat, je užitečné mít posice jednotlivých obrázků v relativních jednotkách – třeba em.
Díky tomu, že rozměry i posice obrázku jsou v em jednotkách, stačí pro změnu velikosti změnit font-size.
Živá ukázka – změna velikosti SVG ikonek ve spritu
Sprite z SVG ikonkami
Na ukázce je vidět, že není rozumné ikonky nalepit úplně na sebe, ale je dobré ponechat nějaké odsazení.
Dále ke čtení:
Smashing Magazine: Resolution Independence With SVG
SVG v data-uri
Jelikož SVG má stejnou podporu jako Data URI (zápis obsahu souboru pomocí protokolu data:), není příliš problém data: použít místo vytváření SVG spritu:
.icon {
background-image: url('data:image/svg+xml;…');
}
Každá ikonka potom má vlastní background-image, takže se nemusí kouzlit s background-position.
Veškeré SVG obrázky se stanou součástí CSS souboru.
Existují hotové nástroje, které umí z SVG ikonek vygenerovat hotové řešení s fallbacky:
Iconizr – vygeneruje SVG sprite pro CSS background, data-uri i fallbacky v PNG
Grumpicon – vygeneruje SVG do data-uri s PNG fallbacky
Vkládání obrázků pomocí data-uri je dobré zvážit. Má to i své nevýhody:
Obrázky se kešují spolu s CSS souborem, což nemusí být ideální. Změna jediného obrázku vede k nutnosti znovu stahovat celé CSS. Změna CSS v podstatě zneplatní všechny obrázky.
Datově velké obrázky budou zdržovat stažení CSS. Měly by tedy být mimo kritické CSS načítané asynchronně, jinak budou blokovat vykreslení.
Vždy se stáhnou všechny obrázky, ačkoliv na dané stránce nemusí být potřeba.
Pro větší obrázky tedy není tento postup moc šťastný. Detailněji se problematikou zabývá článek:
Why Inlining Everything Is NOT The Answer
Skutečný SVG sprite
SVG nabízí ještě jeden elegantní způsob, jak sprity vytvořit.
Do značky přímo do HTML kódu jde umístit všechny ikonky. Slouží k tomu značka .
Používat element není úplně nutné. Jde použít i skupinu , ale není to tak dobré. Symbol totiž prohlížeče nerenderují před použitím.
Element je skrytý pomocí display: none, jinak by na stránce zabíral nějaký ten prostor.
Jednotlivé nadefinované symboly jde následně použít kdekoliv na stránce pomocí značky :
Třída u slouží pro další stylování. Tímto postupem je navíc možné měnit vlastnosti SVG obrázku pomocí CSS souboru připojeného ke stránce (při jiném způsobu vložení musí být CSS v *.svg souboru).
Tlačítko s SVG ikonkou
Tuto techniku dokáže používat online nástroj Icomoon:
Icomoon – nástroj pro vytvoření SVG spritů
Nevýhoda nastrkání všech SVG ikonek do hlavičky je jasná – ikonky se nebudou ukládat do cache.
Teoreticky je možné ikonky cacheovat JavaScriptem do localStorage:
Osvaldas Valutis: Caching SVG Sprite in localStorage
Nebo SVG definici ikonek stáhnout AJAXem, což použití cache umožní, ale opět to bude závislé na JavaScriptu.
I problém s kešováním se SVG snaží řešit:
SVG sprite z externího souboru
Do konstrukce jde zadat externí soubor se všemi definicemi ikonek a odkázat se na konkrétní symbol:
Tento postup ale bohužel nefunguje v Internet Exploreru (ani v IE 9+, který SVG podporuje).
Detailnější popis SVG spritů:
Sara Soueidan: An Overview of SVG Sprite Creation Techniques
Grafické programy pro SVG
Pro vlastní vytváření SVG je potřeba nějaký ten grafický editor:
Inkscape
Stáhnout Inkscape
Inkscape je zdarma pro všechny platformy – Windows, Mac OS X, Linux.
Kreslení SVG v Inkscape
Výsledný SVG obrázek je potřeba pro použití pročistit od zbytečných značek.
Adobe Illustrator
Stáhnout Illustrator
Poměrně drahý program, který se pro pouhou úpravu SVG asi nevyplatí kupovat.
Online editory
Vzhledem k povaze SVG není takový problém vytvořit editor přímo v prohlížeči.
SVG edit – kreslení SVG přímo v prohlížeči
Zobrazení SVG v průzkumníku
Ve Windows se při prohlížení Explorerem (průzkumníkem) standardně nezobrazují náhledy SVG obrázků. To není moc praktické. Existuje ale rozšíření, které tento problém řeší:
SVG Viewer Extension for Windows Explorer
Po stažení a instalaci se budou automaticky zobrazovat náhledy SVG souborů:
Zobrazení náhledu SVG
Pokud se ihned po instalaci náhledy nezačnou zobrazovat, jde tomu pomoci změnou možnosti Otevřít v programu ve vlastnostech souboru. Po nastavení klidně té samé možnosti by se měly náhledy ukázat.
Optimalisace SVG
Z grafických editorů typicky lezou zbytečně datově velké SVG obrázky. Existují nástroje pro optimalisaci a kompresi.
Mnohdy jde dosáhnout i 50% úspor:
Odstraněním meta dat, které do SVG obrázku uložil grafický editor.
Zjednodušením a zkombinováním cest ().
Snížení počtu desetinných míst typicky vede k největším úsporám.
Pro opakované styly více prvků jde použít CSS.
Úpravy pochopitelně mohou změnit výsledný vzhled obrázku.
SVGOMG
SVGOMG online
SVGOMG je online nástroj běžící přímo v prohlížeči.
Díky tomu jde při různých stupních optimalisace přímo pozorovat výsledek.
Zároveň se zobrazuje míra úspory velikosti.
SVGOMG
Využívá SVGO, které jde použít i pro automatisovanou optimalisaci na lokálním PC.
SVGO – optimalisuje SVG obrázky v Node.js
SVG Editor
SVG Editor online
Hodně podobný nástroj jako SVGOMG.
Další informace o optimalisaci SVG obsahují články:
Mozilla Hacks: Optimising SVG images
Sara Soueidan, Performance Calendar: Tips For Optimising SVG Delivery For The Web
CSS Tricks: 5 Gotchas You’re Gonna Face Getting Inline SVG Into Production
Převod PNG na SVG
Pro použití v responsivním designu se hodí PNG obrázky nahrazovat SVG formátem.
Existuje řada online nástrojů, které se snaží automaticky převádět PNG do SVG. Rozumně to funguje pouze pro jednoduché obrázky.
Složitější věci je nutné ručně překreslit. Některé převodní nástroje pouze zabalí PNG/GIF obrázek do značky , což je k ničemu.
Vector Magic
Convert image to the SVG format
SVG to PNG image conversion
png2svg simple pixel art -> SVG
PicSvg – Convert Picture to SVG
Font-blast – umí převést font-ikony na SVG
Text v SVG
Skutečný text se do SVG obrázku zadává značkou :
Je čas
Je čas
Takový text z obrázku je potom perfektně přístupný a je i možné ho označit myší.
Je čas web design
Je čas
web design
S textem jde potom provádět spoustu věcí. Třeba roztáhnout písmo podle šířky a obarvit ho gradientem.
Další úpravy a animace textu popisuje následující presentace:
Brenna O'Brien: Creative Typography with SVG – formátování a animování písma
SVG ikony ke stažení
Hromadu ikon v SVG je možné zdarma stáhnout z internetu:
Noun Project – ikonky pro všechno se snadnou možností prohledávat
SVG Icons – několik hotových sad ikon připravených ke vložení
Odkazy jinam
CSS Tricks: Using SVG – úvod do používání SVG
Snap SVG – vytváření SVG pomocí JavaScriptu (článek na Sitepointu)
SVG animace
CSS Ticks: SVG Animation and CSS Transforms: A Complicated Love Story
CSS Ticks: Scroll Drawing – kreslení v závislosti na rolování
Smashing Magazine: Styling And Animating SVGs With CSS
Jake Archibald: Animated line drawing in SVG – animované SVG čáry
The new code: Morphing Elements with SVG
JS knihovny pro animace SVG:
Snap.svg
GSAP
Velocity.js
D3.js
SVG bannery
Chris Gannon: My First SVG Banner Ad
SVG filtry a textury
SVG Filters
Textures.js – SVG patterns for Data Visualization
Generátory
Bokeh Backgrounds with SVG and JS – generování pozadí pomocí JS
Grafy
How to Make Charts with SVG
WebGL
CSS Tricks: Rendering SVG Paths in WebGL
Přednášky
Brenda Storer: Cracking the SVG Code
Chris Coyier: The Wonderful World of SVG
Sarah Drasner: Designing Complex SVG Animations
Sara Soueidan: SVG For Web Designers (and Developers)
To je všechno. Líbil se vám článek a chcete se dozvědět, až vyjde další?
Sledujte:
Facebook Twitter
Připomínky mi pište do komentářů ˇ
Podobné stránky
Responsivní obrázky
Responsivní obrázky
Co s obrázky na mobilních zařízeních?
Responsivní logo
Responsivní logo stránky
Jak vytvořit logo, které se bude přizpůsobovat velikosti stránky.
Max-width pro pozadí
Maximální šířka pozadí
Jak obrázkovému pozadí nastavit maximální šířku. Tj. aby se přizpůsobovalo menší šířce okna.
Zvětšení obrázku
Zvětšení obrázku
Jakými způsoby řešit zvětšení malého obrázku.
Nastavení rozměrů responsivního obrázku
Nastavení výšky responsivního obrázku
Jak zabránit poskakování responsivních obrázků během načítání stránky.
PDO
MySQL přes PDO
PDO je PHP rozhraní pro pohodlnější práci s SQL databásí. Jaké přináší výhody a jak ho používat.
Odrolování bez JavaScriptu
Odrolování bez JavaScriptu
Jak odscrollovat na určitou část stránky bez JavaScriptu.
Komentáře
Animace
CSS
Formuláře
Hotová řešení
HTML
JavaScript
Obrázky
PHP
Produktivita
Prohlížeče
Responsivní design
SEO
Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků
2013–2021
txtapk.com
translate-přeložit
2023-03-24-bip39-standalone.html
jeden krucek
ssssssssssssss
Příklad stránky s odkazy
Text odkazu 1
Text odkazu 2
Externí odkaz
Telefonní číslo
Odkaz na sekci
Odkaz na soubor
ssssssssssssss