Статьи

Создайте свои собственные иконки SVG

Веб-шрифты — это простой способ интегрировать гибкую систему значков в веб-проект, не жертвуя совместимостью с устаревшими браузерами. Технический процесс создания веб-шрифтов также стал намного проще с момента появления онлайн-инструментов, таких как Icomoon или Fontello .

Но HTML5 предоставил нам еще более универсальный способ использования значков на веб-страницах: SVG — масштабируемая векторная графика.

Базовые функции SVG теперь широко поддерживаются практически всеми браузерами (взгляните на caniuse.com ), поэтому сейчас есть гораздо меньше причин не использовать его.

И если вам нужно поддержать Explorer 8, есть несколько очень простых вариантов, которые вы можете применить.

Рисование значков

Этот шаг точно такой же, как вы можете прочитать в моей статье о веб-шрифтах , посмотрите на нее подробнее, как подготовить ваши иконки.

Коллекция файлов SVG

Когда ваши SVG-файлы будут готовы, вам понадобится метод, чтобы включить их в ваш проект.

Давайте посмотрим на варианты, которые у нас есть.

Использование <img>

Это очень простое решение, и хотя оно не очень подходит для нашей области применения, оно приносит нам некоторые интересные соображения.

Для этого требуется только простой тег img вы, вероятно, использовали с тысячами JPG, GIF и PNG.

Загрузка SVG с тегом HTML IMG

Это очень простой способ использовать файлы SVG; Вы можете управлять размером изображения, как требуется, используя атрибуты width и / или height , но вы не можете контролировать цвет.

Этот метод полностью совместим со всеми современными браузерами, кроме IE8 (и более старых IE) и ранних моделей телефонов Android. В некоторых случаях width и height требуются для правильного отображения.

IE8 откаты

Есть много способов обеспечить совместимость с устаревшими браузерами, если вам это нужно. В каждом случае вам нужно будет предоставить файлы PNG для замены SVG.

Лично я предпочитаю изящно унизительную технику, которая требует, чтобы все файлы использовали одинаковые имена и имели одинаковый путь. Это также требует Modernizr.

Несколько строк JavaScript сделают свое дело:

 if(!Modernizr.svg) { var imgs = document.getElementsByTagName('img'); for(var i = 0; i < imgs.length; i++) { var this_src = imgs[i].src; if(this_src.match(/(\.svg)$/)) { imgs[i].src = this_src.replace(/(\.svg)$/, '.png'); } } } 

Эта техника — и некоторые варианты — рассматриваются в этой статье: SVG Fallback с изображениями PNG .

Другое очень умное решение было описано Алексеем Теном, а также рассмотрено Крисом Койером в его статье SVG Fallbacks .

Вы также можете загрузить изображение в iframe SVG, используя теги object или iframe . Каждый из них предоставляет только разметку для загрузки резервных изображений:

 <object data="svg_image.svg" type="image/svg+xml"> <!-- the following image is displayed if browser can't load svg image --> <img src="fallback.png" alt="fallback image"> </object> 

Взгляните на мой код SVG для встраивания для обзора всех текущих методов встраивания.

img тега img с помощью ссылки SVG

Основное использование img для файлов SVG может быть расширено с помощью идентификаторов фрагментов .

Идентификаторы фрагментов являются встроенным свойством SVG: мы можем ссылаться на часть SVG, используя спецификацию представления SVG или обращаясь к элементу SVG по его идентификатору <view> .

Первый метод заключается в указании viewBox при загрузке файла SVG.

 <img src="svg_file.svg#svgView(viewBox(x,y,w,h))"> 

Где x,y,w,h представляют координаты фрагмента из исходных файлов ( x и y ), а также ширину и высоту фрагмента ( w и h ).

Например, чтобы показать только черного коня из этого спрайта шахматных фигур (из Википедии ), вы должны определить значения, как показано на схеме ниже:

Окно координат для черного коня

Это может напомнить вам о методах «CSS image sprite», которые некоторые сайты используют для своих элементов пользовательского интерфейса.

Вы можете увидеть результат здесь:

См. Идентификатор фрагмента Pen svg img + от Massimo Cassandro ( @ massimo-cassandro ) в CodePen .

Второй способ требует, чтобы SVG содержал определенный <view> нашего фрагмента.

Если наш файл «Шахматные фигуры» содержал нечто подобное:

 <view id="black-horse" viewBox="140 52 34 33" /> 

Мы могли бы получить тот же результат, используя:

 <img src="Chess_Pieces_Sprite.svg#black-horse"> 

Оба метода совместимы со всеми основными браузерами (включая IE9 +), за исключением устройств IOS, которые неправильно отображают фрагменты метода «просмотра». К счастью, IOS в порядке с первым методом.

Все браузеры требуют, чтобы изображение имело явный размер (с атрибутами width и height или правилами CSS) для правильного отображения.

Для получения дополнительной информации о ссылках SVG посмотрите:

Больше спрайтов

До сих пор мы не видели ничего, что делает SVG очевидной заменой веб-шрифтов, но мы можем сделать гораздо больше с SVG. Мы можем организовать наши файлы значков SVG, чтобы создать гораздо более гибкий и мощный инструмент.

Есть три основных способа (которые я знаю) сделать это:

  1. Стеки Simurai SVG
  2. CSS спрайт
  3. Использование SVG <defs> и <symbol>

Стеки Simurai SVG

Это первый метод, о котором мне стало известно, и я думаю, что будет справедливо сказать, что он относительно устарел сегодня. Тем не менее, я хочу упомянуть об этом, хотя бы для записи.

Впервые этот метод был описан Симураем в его блоге в 2012 году, хотя я читал об этом и в SitePoint .

Как вы можете видеть на скриншоте ниже, эта техника требует, чтобы все ваши символы накладывались друг на друга — в отличие от слоев Photoshop. Каждый из них имеет одинаковый класс ( icon ) и уникальный идентификатор.

SVG стеки в скобках

SVG содержит следующий CSS.

 <defs> <style> .icon { display: none; } .icon:target { display: inline; } </style> </defs> 

Все значки исчезнут, пока они не будут вызваны с использованием синтаксиса идентификатора фрагмента:

 <img src="icon_file.svg#spriteID"> 

Файл стека SVG

Используя тег img , эта техника хорошо работает с Firefox, Chrome, Safari (рабочий стол) и Opera. Однако он не работает ни с одним браузером IE или устройством IOS.

Вы также можете использовать стеки SVG с фоновыми изображениями (добавив немного CSS на свою страницу), но, к сожалению, это работает только с Firefox.

CSS спрайт

Эта методика была усовершенствована Filament Group и состоит из веб-приложения (или плагина Grunt, если вы предпочитаете).

Веб-приложение Grumpicon

Как вы можете видеть на странице Grumpicon, «инструмент обрабатывает набор файлов SVG, генерирует резервные изображения PNG для устаревших браузеров и экспортирует демонстрационную страницу, показывающую, как использовать окончательные значки».

Я создал демо на Codepen (удаляя резервный скрипт), и вот результат:

Посмотрите демонстрацию Pen Grumpicon от Massimo Cassandro ( @ massimo-cassandro ) на CodePen .

Это качественная, готовая к использованию техника. Я протестировал его во всех основных браузерах (включая IE8), и он работает безупречно во всех них.

Мы также можем использовать CSS-спрайты с внешним SVG-файлом, как мы увидим ниже.

Использование SVG <defs> и <symbol>

Последний метод — тот, который я лично предпочитаю, и он хорошо объяснен в статье CSS-хитрости .

Он использует тег svg в качестве оболочки, в которой каждый значок описан в теге <defs> или <symbol> .

 <svg> <defs> <g id="icon1"> <!-- icon shape here --> </g> </defs> <symbol id="icon2" viewBox="0 0 100 100"> <!-- icon shape here --> </symbol> </svg> 

Иконки отображаются тегом <use> :

 <svg viewBox="0 0 100 100"> <use xlink:href="#icon1" /> </svg> <svg> <use xlink:href="#icon2" /> </svg> 

Вы можете видеть, что, поскольку тег symbol имеет собственный атрибут viewBox , вам не нужно устанавливать его каждый раз, когда отображается значок, что делает этот метод очень простым в использовании .

Коллекция тегов symbol может быть собрана вручную с помощью некоторого плагина Grunt (Google для Grunt SVG merge ) или, опять же, с помощью Icomoon.

Приложение Icomoon

После загрузки значков в приложение Icomoon выберите нужные глифы и вместо создания шрифта нажмите кнопку « Создать SVG / PNG» .

Вы также можете установить некоторые настройки для создания резервных файлов PNG и даже спрайта CSS старого стиля (как для файлов PNG, так и SVG), как в главе « Спрайты CSS» . Обратите внимание, что спрайт-файлы, сгенерированные приложением Icomoon, делают создание почти чистого CSS-отступления очень простым.

Icomoon предпочтения

Затем кнопка загрузки доставит коллекцию файлов, включая готовый файл SVG с встроенными в него идеальными определениями <symbol> .

Вот результат:

Посмотрите демонстрацию символов Pen SVG от Massimo Cassandro ( @ massimo-cassandro ) на CodePen .

Этот метод отлично работает во всех основных браузерах, включая IE9 +, но, поскольку комбинированный SVG встроен в страницу, нет способа кэшировать его в браузере.

К счастью, мы можем ссылаться на символы SVG из внешнего файла. В этом случае синтаксис становится:

 <svg> <use xlink:href="external_file.svg#iconID" /> </svg> 

Этот метод работает во всех основных браузерах, кроме IE9 +. Тем не менее, сценарий Джонатана Нила SVG4everybody может даже решить эту проблему, как четко объяснено в use SVG с внешним источником .

Ресурсы

Я думаю, что есть много интересных возможностей вокруг этих идей. Если вы хотите узнать больше, вот несколько ресурсов, которые я нашел очень полезными: