Введение в SVG
SVG, сокращение от Scalable Vector Graphics, представляет собой язык разметки XML, используемый для описания двухмерной векторной графики.Графика SVG не зависит от разрешения, поэтому графика не будет показывать очевидных зубчатых краев из-за увеличения масштаба.
icon sprite
Когда нам нужно использовать несколько иконок, для экономии запросов и облегчения управления иконки обычно объединяются в один файл, а затем из файла коллекции иконок определенным методом извлекается необходимая графика и отображается во время использования. наиболее популярными из них должны быть знакомые CSS Sprite и Icon Font.
CSS Sprite
Принцип CSS Sprite заключается в организации нескольких значков в один файл изображения в соответствии с определенными правилами и использовании их при использовании.background-image
а такжеbackground-position
Отображение определенной части изображения.Технология CSS Sprite широко используется в течение длительного времени, существует множество инструментов для автоматической генерации изображений Sprite и файлов CSS, таких как (gulp.spritesmith)[GitHub.com/Привет, Вольфсон/Итак…].
.icon1 {
background-image: url(/res/icon1.png)
}
.icon1-increase {
background-position: -10px -10px;
}
<i class="icon1 icon1-increase"/>
Технология CSS Sprite отработана и обладает хорошей совместимостью, но ее недостатки также очевидны, например, в реальных потребностях соответствующие значки одинаковой формы, но разного цвета должны сохранять копию для каждого значка разных цветов, иногда необходимо увеличить существующую иконку При отображении обнаружено, что зубчатость серьезная, тогда необходимо сохранить еще одну увеличенную версию значка.Поэтому файл спрайта со временем будет становиться все больше и больше, а содержимое будет становиться все более и более хаотичным, и постепенно станет трудно управлять.
Icon Font
Основной принцип Icon Font заключается в том, чтобы определить Icon как шрифт изображения, который используется в CSS.@font-face
Представлен пользовательский шрифт Icon Font, повторно используемыйfont-family
и код символа для отображения указанного значка.
@font-face {
font-family: 'iconfont';
src: url(/res/icon2.ttf) format('truetype');
}
.icon2 {
font-family: 'iconfont';
}
<i class="icon2">!</i>
Так как используется шрифт, можно пройтиcolor
, font-size
Установите стиль значка.Шрифт значка имеет меньший размер файла, чем изображения CSS Sprite, и его легче поддерживать, чем изображения, но шрифты значков обычно используют только один цвет, а создание файла шрифта сложнее, чем CSS Sprite.
SVG Sprite
Обычно при использовании SVG мы пишем напрямуюsvg
Среди тегов:
<svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 3 2">
<rect width="1" height="2" x="0" fill="#008d46" />
<rect width="1" height="2" x="1" fill="#ffffff" />
<rect width="1" height="2" x="2" fill="#d2232c" />
</svg>
На этом этапе графика SVG будет отображаться прямо на странице.В атрибутах SVG вы можете использовать (symbol
)[developer.Mozilla.org/this-cn/docs/…, и использовать (use
)[developer.Mozilla.org/this-cn/docs/…, чтобы реализовать функцию SVG Sprite.
Пример SVG-спрайта:
<svg style="height:0;width:0;display:none;" version="1.1" xmlns="http://www.w3.org/2000/svg">
<symbol id="icon-italy" width="150" height="100" viewBox="0 0 3 2">
<rect width="1" height="2" x="0" fill="#008d46" />
<rect width="1" height="2" x="1" fill="#ffffff" />
<rect width="1" height="2" x="2" fill="#d2232c" />
</symbol>
<symbol id="icon-france" width="150" height="100" viewBox="0 0 3 2">
<rect width="1" height="2" x="0" fill="#002496" />
<rect width="1" height="2" x="1" fill="#ffffff" />
<rect width="1" height="2" x="2" fill="#ee2839" />
</symbol>
</svg>
<svg><use xlink:href="#icon-italy"/></svg>
<svg><use xlink:href="#icon-france"/></svg>
Это реализует SVG Sprite.
принцип
Это можно наблюдать через devtool,use
Метки реализованы с помощью теневого дома.
это проходитxlink:href
этот XMLattribute
Ссылка на указанный SVGsymbol
, указанный во время рендерингаsymbol
Содержимое тега будет обработано и отображено на странице. Это означает, что если вы не можете напрямуюuse
Доступ к теневому дому в теге и его изменение.Например, что-то вродеuse#rect
Такие селекторы не могут действовать, поэтому их нельзя сочетать с обычными селекторами CSS.use
Различные части графика контролируются.
CSS-стили
Чаще всего нам нужно изменить только размер и цвет иконки, в SVG Sprite это не сложно реализовать.
- размер
Путем измененияsvg
Размер контейнера, размер значка можно легко контролировать.
.icon{
width: 120px;
height: 80px;
}
.icon.icon-small{
width: 60px;
height: 40px;
}
<svg class="icon"><use xlink:href="#icon-italy"/></svg>
<svg class="icon icon-small"><use xlink:href="#icon-italy"/></svg>
- цвет
- монохромный
Поскольку цвет не может быть напрямую сопоставленuse
Выбрана графическая метка в корне тени значка, поэтому при определении цвета значка необходимо использоватьfill: inherit
Это одно свойство.
svg path{
fill: inherit;
}
.icon2-green{
fill: #008d46;
}
.icon2-red{
fill: #dc352f;
}
<svg class="icon2 icon2-green">
<use xlink:href="#icon-increase"/>
</svg>
<svg class="icon2 icon2-red">
<use xlink:href="#icon-increase"/>
</svg>
использоватьinherit
, вы также можете определитьstroke-width
, stroke
и другие свойства.
- многоцветный
В дополнение к определению общего цвета значка, вы также можете определить цвет различных частей графика по мере необходимости.Здесь используются пользовательские свойства css (CSS Custom Properties).
нужно быть здесьicon.svg
Внесите изменения, чтобы установить цвет каждой части графика наfill: var(--*[, default])
форма.
<symbol id="icon-flag" width="150" height="100" viewBox="0 0 3 2">
<rect width="1" height="2" x="0" style="fill: var(--color0, #008d46)" />
<rect width="1" height="2" x="1" style="fill: var(--color1, #fff)"/>
<rect width="1" height="2" x="2" style="fill: var(--color2, #d2232c)"/>
</symbol>
определить стиль css
.flag-belgium {
--color0: #201b18;
--color1: #f1ee3d;
--color2: #dc352f;
}
<svg class="icon">
<use xlink:href="#icon-flag"/>
</svg>
<svg class="icon flag-belgium">
<use xlink:href="#icon-flag"/>
</svg>
Кроме того, есть и другие формы определения стиля, более подробное содержание можно прочитатьStyling SVG Content with CSS.
фактическое использование
ссылка на внешний svg
Выше описано использование встроенного svg, но на самом деле можно использовать и внешний svg.
<svg class="icon">
<use xlink:href="/res/svg/icon.svg#icon-flag"/>
</svg>
Однако этот метод не совместим с IE9~10, но если вам нужно использовать форму внешнего svg, вы можете ввести полифиллsvg4everybody, при работе без внешней поддержки svg этот pollyfill загрузит файл комитета svg через асинхронный запрос и внедрит его на страницу, преобразуя эталонный метод во встроенный svg.
использовать в ftl
допустимыйsvg.ftl
определить сериюmacro
Используется для загрузки.svg
документ.
<#macro svgicon path>
<#include "${path}">
</#macro>
<#macro svgicon3 >
<@svgicon "./icon3.svg"/>
</#macro>
ссылка на страницеdemo.ftl
:
<@svgicon1/>
<svg>
<use xlink:href="#icon-italy"/>
</svg>
использовать в обычном
xlink:href
является функцией XML, использующей пространства имен, если она написана на.html
Тег страницы, эта функция может быть проанализирована браузером и завершить рендеринг svg.Если переменная svg создается через DOM API, ее необходимо обрабатывать с помощью определенного метода (SVG with USE tag not rendering).
нужно использоватьcreateElementNS
а такжеsetAttributeNS
Метод объявляет пространство имен во время создания.
var use = document.createElementNS('http://www.w3.org/2000/svg', 'use');
use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#icon-increase');
document.querySelector('#svgid').appendChild(use);
Пока он должен быть динамически созданuse
элементы, вам нужно использовать описанный выше метод для создания экземпляров элементов в SVG Sprite, но в текущей версии Regular (0.4.3) пространство имен не будет обрабатываться, а это означает, что если вы напрямую используете<svg><use xlink:href/></svg>
При написании в шаблоне компонента Regular метка не может нормально отрисовываться, для этого можно добавить директивуr-xlink:href
чтобы завершить настройку пространства имен вручную.
Regular.directive('r-xlink:href', function (elem, val) {
if (val&& val.type === 'expression') {
this.$watch(val, function (newVal) {
elem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', newVal);
});
} else {
elem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', val);
}
});
Затем в шаблоне компонента вы можете сделать это как в обычном.html
SVG Sprite используется как в .Конечно, сначала убедитесь, что SVG Sprite записан на страницу.
<svg>
<use r-xlink:href="#icon-italy"/>
</svg>
В практике регулярного SVG я получил руководство от Чжэн Хайбо, иначе нам придется идти по более длинному маршруту, чтобы решить проблему.Я хотел бы выразить здесь свою благодарность.
резюме
По сравнению с CSS Sprite и Icon Font, упомянутыми выше, SVG имеет очевидные преимущества:
- Увеличение и уменьшение масштаба без искажений
- Такие атрибуты, как размер, цвет и т. д., можно гибко настраивать
- Небольшой размер и простое управление
Хотя SVG Sprite обладает высокой степенью гибкости, в то же время SVG-совместимость нуждается в изучении, а его производительность рендеринга не так высока, как у картинок и шрифтов, что в некоторых случаях может быть неприменимо. сценарии, svg спрайт Это также может принести большое удобство в разработке.