Возможности SVG

Коростелева Татьяна, Avito

Возможности SVG

Avito Frontend Academy

Основные свойства SVG

Человекопонятный код

SVG можно создать самому в любимом редакторе

				<svg>
				    <line ... />
				</svg>
			

SVG масштабируемы

SVG доступны

				<svg aria-labelledby="imgTitle imgDesc" role="img" >
				    <title id="imgTitle" >Кружка чая</title>
				    <desc id="imgDesc" >
				        Изображена кружка горячего чая
				    </desc>
				    ...
				</svg>
			

SVG доступны

Изображение Voice Over

Прочтение страницы Voice Over

SVG доступны

Текст можно выделить, скопировать

SVG

SVG доступны

CSS/JS в SVG

Подключение стилей

			<svg...>
				<style>
					@import url(../common/index.css);
					@import url(page.css);
				</style>
				...
			</svg>
		

SVG адаптивны

SVG адаптивны

			.hidden-sm, .hidden-md { transition: all 1s }
			@media (max-width: 380px) {
				.hidden-sm { opacity: 1 }
				.hidden-md { opacity: 0 }
			}
		

SVG адаптивны

DEMO

SVG широко поддерживаемы

Некоторые альтернативы SVG

SVG vs Icon Fonts

До прихода svg иконочные шрифты справлялись с проблемами масштабирования, стилизации.

			<!-- Добавление иконки на страницу -->
			<i class="fa fa-home" aria-hidden="true"></i>
		

SVG vs Icon Fonts

SVG vs Icon Fonts

SVG vs JPG/PNG

SVG vs JPG/PNG

SVG vs JPG/PNG

Золотое правило - четко понимать, когда нужно использовать SVG, а когда лучше использовать растровое изображение.

SVG vs JPG/PNG

Mayyyybe SVG

Нужно сравнивать gzip размеры файла SVG и растра

Not SVG

Как использовать SVG уже сейчас?

Существуют несколько способ добавить svg на сайт.

Как использовать SVG уже сейчас?

Обычная картинка

			<div>
				<img src="apple.svg" alt="Изображение яблока" />
			</div>
		

Как использовать SVG уже сейчас?

Inline svg

			<div>
				<svg ... >
					<line .... />
				</svg>
			</div>
		

Как использовать SVG уже сейчас?

Embed, object, iframe

			<div>
				<iframe src="apple.svg" ... > </iframe>
			</div>
		

Как использовать SVG уже сейчас?

SVG иконки (спрайты)

			<svg>
				<defs>
					<symbol id="pinapple"><line .../></symbol>
					<symbol id="grape"><line .../></symbol>
					<symbol id="orange"><line .../></symbol>
				</defs>
			</svg>
		

Как использовать SVG уже сейчас?

SVG иконки (спрайты)

			<div>
				<svg>
					<use xlink:href="fruits.svg#pinapple" />
				</svg>
			</div>
		

Как использовать SVG уже сейчас?

SVG иконки (спрайты)

Как использовать SVG уже сейчас?

SVG иконки (спрайты)

Как использовать SVG уже сейчас?

SVG как свойство background-image

Также data:image/svg+xml, data-url

			.element {
				background: url(apple.svg);
			}
		

Оптимизация SVG

Выигрыш в размере может быть до 90%

Оптимизация SVG

Настройка gzip на сервере (css-tricks)
			htaccess
				addType image/svg+html .svg .svhg
			<ifmodule mod_deflate.c>
				AddOutputFilterByType DEFLATE text/html image/svg+xml
			</ifmodule>
		

Системы координат SVG

The SVG Canvas

The viewport

The viewport

			<!-- viewport 100px x 100px -->
			<svg width="100" height="100">...</svg>
		
Можно задать размер в любых единицах (em, px, pt, cm, percentages, ...)

The viewBox

			<svg viewBox="min-x min-y width height">
				...
			</svg>
		

min-x, min-y — задают верхний левый угол
width, height — задают ширину и высоту области

The viewBox

В данном примере viewBox равен viewport, но они могут не совпадать

			<svg width="100" height="100" viewBox="0 0 100 100">
				...
			</svg>
		

The viewBox

Когда viewBox и viewport не совпадают, SVG масштабируется с учетом коэффициента, показывающего разницу этих атрибутов — unit.

1 unit width = viewport-width / viewBox-width
1 unit height = viewport-height / viewBox-height

The viewBox

1 unit = 1

The viewBox

1 unit = 0.5

The viewBox

1 unit = 2

The preserveAspectRatio

By Sara Soueidan

The preserveAspectRatio

By Sara Soueidan

The preserveAspectRatio

			<!-- xMaxYMax - выравнивание правого нижнего угла -->
			<!-- meet - сохранение пропорций насколько возможно -->
			<svg preserveAspectRatio="xMaxYMax meet">...</svg>
		

Системы координат SVG

Фигуры SVG

Фигуры SVG — lines

Фигуры SVG — dashing

Фигуры SVG — corners

SVG градиенты

SVG градиенты

			<linearGradient id="linear-gradient">
				<stop offset="0%" stop-color="gold"/>
				<stop offset="100%" stop-color="yellowgreen"/>
			</linearGradient>
			 
			<rect fill="url(#linear-gradient)" .../>
		

SVG градиенты

			<radialGradient id="radial-gradient" fx="30%" fy="20%">
				<stop offset="0%" stop-color="gold"/>
				<stop offset="51%" stop-color="crimson"/>
				<stop offset="100%" stop-color="yellowgreen"/>
			</radialGradient>
			 
			<rect fill="url(#radial-gradient)" .../>
		

SVG Clip-path

Strawberry

SVG Clip-path

			<svg>
				<clipPath id="clip-path"><path d="..." /></clipPath>
			</svg>
			 
			<img class="clip-svg" src="..." ... />
			.clip-svg { clip-path: url(#clip-path) }
		

SVG маски

See the Pen Flashlight by yoksel (@yoksel) on CodePen.

SVG фильтры

See the Pen SVG Glitch by Dirk Weber (@DirkWeber) on CodePen.

SVG в рассылках

SVG в рассылках

Почтовые клиенты и движки рендеринга

Email client Rendering engine
Apple Mail, Android Mail
Outlook for Mac, iOS Mail
WebKit
Outlook 2000/02/03 Internet Explorer
Outlook 2007/10/13 Microsoft Word

SVG в рассылках

SVG Поддержка браузерами *
SVG as Image Tag 60%
SVG as Inline HTML 25%
SVG as CSS background Image 40%
SVG as Object Embed 55%

Браузеры: AOL Web, Outlook 2013, Outlook.com, Yahoo!, Mail (OSX), Mail (iOS), Gmail, Gmail (iOS), Gmail (Android)

			<div class="no-webkit">
				<img src="path/to/fallback/image">
			</div>
			<!--[if !mso 9]><-->
			<div class="is-webkit" style="display: none; max-height: 0">
				<img src="path/to/logo.svg">
			</div>
			<!--<![endif]-->
		
			@media all and (-webkit-min-device-pixel-ratio:1) {
				.is-webkit {
					display: block !important;
					max-height: none !important;
				}
				.no-webkit {
					display: none !important;
				}
			}
		

SVG в рассылках

CSS/JS in SVG. Немного практики

currentColor

			<ul class="menu">
				<li class="menu-item">
					<svg class="menu-item-icon">...</svg>
					<label class="menu-item-label">Title</label>
				</li>
				...
			</ul>
		

currentColor

SVG в разметке html

			<svg class="menu-item-icon">
				<use xlink:href="fruits.svg#apple" />
			</svg>
		

currentColor

SVG разметка внутри fruits.svg

			<svg xmlns="http://www.w3.org/2000/svg">
				<symbol id="apple" viewBox="0 0 100 100"/>
					<path d="....." />
				</symbol>
			</svg>
		

currentColor

			.menu-item-icon {
				fill: currentColor;
				stroke: currentColor;
				transition: all 0.3s;
			}
			
			.menu-item { color: yellowgreen }
			.menu-item:hover { color: crimson }
		

currentColor

CSS variables

Использование в CSS

			element {
				--main-bg-color: brown;
				background-color: var(--main-bg-color);
			}
		

CSS variables

Использование в JS

			element.style.getPropertyValue("--foo");
			getComputedStyle(element).getPropertyValue("--foo");
			element.style.setProperty("--foo", "bar");
		

CSS variables

Использование в JS

			var root = document.documentElement;
			document.addEventListener("mousemove", evt => {
				let x = evt.clientX / innerWidth;
				root.style.setProperty("--mouse-x", x);
			});
		

CSS variables

Использование в SVG

			<svg ...>
				...
				<circle class="iris" cx="45" ... />
			</svg>
		

CSS variables

Использование в SVG

			.iris {
				cx: calc(25px + 55px * var(--mouse-x));
			}
		
25px - миниальное значение для положения глаза слева
25px + 55px - максимально значение для положения глаза справа

CSS variables

Лоадеры

See the Pen SVG Sprite Animation by Mark Nelson (@marknelson) on CodePen.

See the Pen SVG Path Animation by Poorva Janbandhu (@poorvanj) on CodePen.

See the Pen SVG CSS3 Menu / Burger Button by Kyle Henwood (@kyleHenwood) on CodePen.

See the Pen SVG Animated Drum Kit (Play Me!) 🥁 by Josh (@iamjoshellis) on CodePen.

See the Pen X-ray me (SVG Experiment) by Noel Delgado (@noeldelgado) on CodePen.

See the Pen When you're an introvert... by Sarah Drasner (@sdras) on CodePen.

Что еще о SVG?

Полезные ссылки

Вопросы?