0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>5 мар 2021</li>
2
<ul><li>5 мар 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Узнаём про векторную графику, добавляем svg-картинки к HTML и творим всякое-разное с их цветом.</p>
4
</ul><p>Узнаём про векторную графику, добавляем svg-картинки к HTML и творим всякое-разное с их цветом.</p>
5
<p>Автор статей по программированию. Преподаватель, ментор, выпускник Skillbox. Фрилансер, веб-разработчик</p>
5
<p>Автор статей по программированию. Преподаватель, ментор, выпускник Skillbox. Фрилансер, веб-разработчик</p>
6
<p>Помимо привычных растровых форматов (JPG, PNG, GIF), в веб-разработке широко применяют векторный - SVG.</p>
6
<p>Помимо привычных растровых форматов (JPG, PNG, GIF), в веб-разработке широко применяют векторный - SVG.</p>
7
<p>SVG (сокращение от Scalable Vector Graphics - "масштабируемая векторная графика") - это вид графики, которую создают с помощью математического описания геометрических примитивов (линий, кругов, эллипсов, прямоугольников, кривых и так далее), которые и образуют все детали будущего изображения.</p>
7
<p>SVG (сокращение от Scalable Vector Graphics - "масштабируемая векторная графика") - это вид графики, которую создают с помощью математического описания геометрических примитивов (линий, кругов, эллипсов, прямоугольников, кривых и так далее), которые и образуют все детали будущего изображения.</p>
8
<p>То есть в этом формате хранится не сама картинка, а инструкции для её построения по точкам и кривым. Они написаны на языке разметки SVG, расширяющем XML.</p>
8
<p>То есть в этом формате хранится не сама картинка, а инструкции для её построения по точкам и кривым. Они написаны на языке разметки SVG, расширяющем XML.</p>
9
<p>Прелесть SVG раскрывает масштабирование. Если увеличить растровое изображение сверх 100%-ного размера - проявляется пикселизация: отдельные точки превращаются в одноцветные блоки пикселей, границы областей становятся ступенчатыми, и в целом картинка выглядит негладко, некрасиво.</p>
9
<p>Прелесть SVG раскрывает масштабирование. Если увеличить растровое изображение сверх 100%-ного размера - проявляется пикселизация: отдельные точки превращаются в одноцветные блоки пикселей, границы областей становятся ступенчатыми, и в целом картинка выглядит негладко, некрасиво.</p>
10
<p>Если же увеличить векторное изображение - все его детали останутся чёткими, то есть их видимое разрешение не уменьшится. Поэтому svg-картинки отображаются на самых больших разрешениях без потери качества - и просто идеальны для адаптивных сайтов.</p>
10
<p>Если же увеличить векторное изображение - все его детали останутся чёткими, то есть их видимое разрешение не уменьшится. Поэтому svg-картинки отображаются на самых больших разрешениях без потери качества - и просто идеальны для адаптивных сайтов.</p>
11
<p>У svg-графики есть ещё одно достоинство. Её можно открывать как HTML или CSS и менять в любом редакторе кода, и даже на лету. Подробнее об этом ниже.</p>
11
<p>У svg-графики есть ещё одно достоинство. Её можно открывать как HTML или CSS и менять в любом редакторе кода, и даже на лету. Подробнее об этом ниже.</p>
12
<p>И наконец, при прочих равных SVG весит намного меньше растровых изображений.</p>
12
<p>И наконец, при прочих равных SVG весит намного меньше растровых изображений.</p>
13
<p>Их мало. Во-первых, SVG не поддерживается очень старыми браузерами, а во-вторых, не используется для фотографий.</p>
13
<p>Их мало. Во-первых, SVG не поддерживается очень старыми браузерами, а во-вторых, не используется для фотографий.</p>
14
<p>Есть три варианта добавления векторной графики. У каждого свои показания к применению.</p>
14
<p>Есть три варианта добавления векторной графики. У каждого свои показания к применению.</p>
15
<p>Здесь всё так же, как и с растровой графикой:</p>
15
<p>Здесь всё так же, как и с растровой графикой:</p>
16
<img src="img/icon.svg" alt="Иконка лупы"><p>Минус этого способа в том, что взаимодействовать с внутренними элементами SVG не получится. Файл будет как за стеклом: смотреть можно, а вот трогать нельзя.</p>
16
<img src="img/icon.svg" alt="Иконка лупы"><p>Минус этого способа в том, что взаимодействовать с внутренними элементами SVG не получится. Файл будет как за стеклом: смотреть можно, а вот трогать нельзя.</p>
17
<p>Такой вариант подключения используется для<strong>контентных</strong>svg-изображений, которые менять внешне не требуется (вроде графиков, схем и логотипов).</p>
17
<p>Такой вариант подключения используется для<strong>контентных</strong>svg-изображений, которые менять внешне не требуется (вроде графиков, схем и логотипов).</p>
18
<p>Как и в случае с растровой графикой, SVG можно подключать через css-свойство background:</p>
18
<p>Как и в случае с растровой графикой, SVG можно подключать через css-свойство background:</p>
19
.icon { background-image: url("../img/icon.svg"); }<p>Минус тут тот же самый, что и у предыдущего способа. Этот случай подходит для<strong>декоративных</strong>изображений (фоны, иконки и прочая мелочь), которые тоже внешне менять не нужно.</p>
19
.icon { background-image: url("../img/icon.svg"); }<p>Минус тут тот же самый, что и у предыдущего способа. Этот случай подходит для<strong>декоративных</strong>изображений (фоны, иконки и прочая мелочь), которые тоже внешне менять не нужно.</p>
20
<p>Вставлять svg-код прямо в html-файл - это третий способ. И для нас самый интересный. Он позволяет не просто отображать готовую графику, но и менять её (толщину элементов, заливку, обводку и так далее).</p>
20
<p>Вставлять svg-код прямо в html-файл - это третий способ. И для нас самый интересный. Он позволяет не просто отображать готовую графику, но и менять её (толщину элементов, заливку, обводку и так далее).</p>
21
<svg> <rect x="10" y="10" width="100" height="100" /> </svg><p>Такая вставка выручает, когда при взаимодействии с картинкой нужно её визуально модифицировать - например, перекрасить svg-иконку при наведении на неё курсора.</p>
21
<svg> <rect x="10" y="10" width="100" height="100" /> </svg><p>Такая вставка выручает, когда при взаимодействии с картинкой нужно её визуально модифицировать - например, перекрасить svg-иконку при наведении на неё курсора.</p>
22
<p>Напрямую на html-страницу (в теге <svg>) вставляют как контентные, так и декоративные изображения, а минус тут в том, что такие картинки не кешируются отдельно от страницы.</p>
22
<p>Напрямую на html-страницу (в теге <svg>) вставляют как контентные, так и декоративные изображения, а минус тут в том, что такие картинки не кешируются отдельно от страницы.</p>
23
<p>Верстальщику часто приходится обыгрывать реакцию иконки при наведении на неё мышки. В случае с svg-картинками можно просто менять их цвет.</p>
23
<p>Верстальщику часто приходится обыгрывать реакцию иконки при наведении на неё мышки. В случае с svg-картинками можно просто менять их цвет.</p>
24
<p>Научимся это делать на примере иконки "ВКонтакте":</p>
24
<p>Научимся это делать на примере иконки "ВКонтакте":</p>
25
<p>Логотип сложный, поэтому svg-код, который его математически описывает, довольно длинный. Посмотрим, как это выглядит в HTML:</p>
25
<p>Логотип сложный, поэтому svg-код, который его математически описывает, довольно длинный. Посмотрим, как это выглядит в HTML:</p>
26
<a href="https://vk.com/" class=”vk”> <svg id="Bold" enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"> <path d="m19.915 13.028c-.388-.49-.277-.708 0-1.146.005-.005 3.208-4.431 3.538-5.932l.002-.001c.164-.547 0-.949-.793-.949h-2.624c-.668 0-.976.345-1.141.731 0 0-1.336 3.198-3.226 5.271-.61.599-.892.791-1.225.791-.164 0-.419-.192-.419-.739v-5.105c0-.656-.187-.949-.74-.949h-4.126c-.419 0-.668.306-.668.591 0 .622.945.765 1.043 2.515v3.797c0 .832-.151.985-.486.985-.892 0-3.057-3.211-4.34-6.886-.259-.713-.512-1.001-1.185-1.001h-2.625c-.749 0-.9.345-.9.731 0 .682.892 4.073 4.148 8.553 2.17 3.058 5.226 4.715 8.006 4.715 1.671 0 1.875-.368 1.875-1.001 0-2.922-.151-3.198.686-3.198.388 0 1.056.192 2.616 1.667 1.783 1.749 2.076 2.532 3.074 2.532h2.624c.748 0 1.127-.368.909-1.094-.499-1.527-3.871-4.668-4.023-4.878z" /> </svg> </a><p>Да, это не ошибка, так в HTML вставляют небольшие svg-картинки. Для больших целесообразнее подключать отдельный файл, который будет кэшироваться браузером. Здесь мы не будем в это углубляться.</p>
26
<a href="https://vk.com/" class=”vk”> <svg id="Bold" enable-background="new 0 0 24 24" height="512" viewBox="0 0 24 24" width="512" xmlns="http://www.w3.org/2000/svg"> <path d="m19.915 13.028c-.388-.49-.277-.708 0-1.146.005-.005 3.208-4.431 3.538-5.932l.002-.001c.164-.547 0-.949-.793-.949h-2.624c-.668 0-.976.345-1.141.731 0 0-1.336 3.198-3.226 5.271-.61.599-.892.791-1.225.791-.164 0-.419-.192-.419-.739v-5.105c0-.656-.187-.949-.74-.949h-4.126c-.419 0-.668.306-.668.591 0 .622.945.765 1.043 2.515v3.797c0 .832-.151.985-.486.985-.892 0-3.057-3.211-4.34-6.886-.259-.713-.512-1.001-1.185-1.001h-2.625c-.749 0-.9.345-.9.731 0 .682.892 4.073 4.148 8.553 2.17 3.058 5.226 4.715 8.006 4.715 1.671 0 1.875-.368 1.875-1.001 0-2.922-.151-3.198.686-3.198.388 0 1.056.192 2.616 1.667 1.783 1.749 2.076 2.532 3.074 2.532h2.624c.748 0 1.127-.368.909-1.094-.499-1.527-3.871-4.668-4.023-4.878z" /> </svg> </a><p>Да, это не ошибка, так в HTML вставляют небольшие svg-картинки. Для больших целесообразнее подключать отдельный файл, который будет кэшироваться браузером. Здесь мы не будем в это углубляться.</p>
27
<p><strong>Обратите внимание</strong>на тег<strong><path></strong>(в переводе с английского "путь"). Он позволяет задать любую фигуру компактной строкой - описанием пути от начальной точки до конечной через промежуточные координаты.</p>
27
<p><strong>Обратите внимание</strong>на тег<strong><path></strong>(в переводе с английского "путь"). Он позволяет задать любую фигуру компактной строкой - описанием пути от начальной точки до конечной через промежуточные координаты.</p>
28
<p>Строка с данными задаётся атрибутом d тега <path>. Она содержит команды, которые закодированы набором букв и чисел. Буква представляет тип команды, а числа - её параметры (чаще всего координаты).</p>
28
<p>Строка с данными задаётся атрибутом d тега <path>. Она содержит команды, которые закодированы набором букв и чисел. Буква представляет тип команды, а числа - её параметры (чаще всего координаты).</p>
29
<p>Теперь мы запросто добавим к ссылочному тегу <a> псевдокласс :hover и зададим через него новый цвет svg-изображения. Это делается в CSS с помощью свойства fill ("заливка").</p>
29
<p>Теперь мы запросто добавим к ссылочному тегу <a> псевдокласс :hover и зададим через него новый цвет svg-изображения. Это делается в CSS с помощью свойства fill ("заливка").</p>
30
.vk:hover svg { fill: red; }<p>Проверьте, как это работает: наведите курсор на иконку - например, в песочнице<a>Codepen</a>.</p>
30
.vk:hover svg { fill: red; }<p>Проверьте, как это работает: наведите курсор на иконку - например, в песочнице<a>Codepen</a>.</p>
31
<p><strong>И ещё один нюанс.</strong>Заливка может быть задана атрибутом у <svg> (fill="#000"). Тогда работать с ней через CSS не получится, так как css-стили не могут перебить правила, заданные атрибутами. В этом случае стоит просто вручную удалить этот атрибут у <svg>.</p>
31
<p><strong>И ещё один нюанс.</strong>Заливка может быть задана атрибутом у <svg> (fill="#000"). Тогда работать с ней через CSS не получится, так как css-стили не могут перебить правила, заданные атрибутами. В этом случае стоит просто вручную удалить этот атрибут у <svg>.</p>
32
<p>Итак, мы научились менять цвет svg-иконки через свойство fill, вставляя её напрямую в HTML. Заметьте, что такое нельзя сделать ни с помощью тега <img>, ни через свойство background.</p>
32
<p>Итак, мы научились менять цвет svg-иконки через свойство fill, вставляя её напрямую в HTML. Заметьте, что такое нельзя сделать ни с помощью тега <img>, ни через свойство background.</p>
33
<p>Рассмотрим более сложную ситуацию - когда иконка состоит из нескольких простых svg-изображений. Например, примитивная лупа из прямоугольника и круга:</p>
33
<p>Рассмотрим более сложную ситуацию - когда иконка состоит из нескольких простых svg-изображений. Например, примитивная лупа из прямоугольника и круга:</p>
34
<p>Код для кнопки с иконкой лупы будет таким:</p>
34
<p>Код для кнопки с иконкой лупы будет таким:</p>
35
<button class="btn-reset search"> <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect x="19.5138" y="18.5495" width="8" height="2" transform="rotate(45 19.5138 18.5495)" /> <circle cx="11.5" cy="11.5" r="10.5" stroke-width="2" /> </svg> </button><p>Проблема здесь в том, что внутри svg-иконки два разных тега:</p>
35
<button class="btn-reset search"> <svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect x="19.5138" y="18.5495" width="8" height="2" transform="rotate(45 19.5138 18.5495)" /> <circle cx="11.5" cy="11.5" r="10.5" stroke-width="2" /> </svg> </button><p>Проблема здесь в том, что внутри svg-иконки два разных тега:</p>
36
<ul><li><rect> (прямоугольник - ручка лупы)</li>
36
<ul><li><rect> (прямоугольник - ручка лупы)</li>
37
<li>и <circle> (круг - ободок лупы).</li>
37
<li>и <circle> (круг - ободок лупы).</li>
38
</ul><p>Сделать как в примере с "ВКонтакте" не получится, потому что прямоугольник в нашем случае имеет заливку (fill), а круг - обводку (stroke).</p>
38
</ul><p>Сделать как в примере с "ВКонтакте" не получится, потому что прямоугольник в нашем случае имеет заливку (fill), а круг - обводку (stroke).</p>
39
<p>Чтобы при наведении менять цвет обоих, используем два селектора. Один будет менять заливку у палочки, второй - обводку у круга:</p>
39
<p>Чтобы при наведении менять цвет обоих, используем два селектора. Один будет менять заливку у палочки, второй - обводку у круга:</p>
40
.search svg rect { fill: #000; } .search svg circle { stroke: #000; } .search:hover svg rect { fill: yellow; } .search:hover svg circle { stroke: yellow; }<p>Как видите, при наведении на кнопку мы сперва нашли rect, потом circle, то есть разделили логику.</p>
40
.search svg rect { fill: #000; } .search svg circle { stroke: #000; } .search:hover svg rect { fill: yellow; } .search:hover svg circle { stroke: yellow; }<p>Как видите, при наведении на кнопку мы сперва нашли rect, потом circle, то есть разделили логику.</p>
41
<p>Делить код таким образом приходится нечасто, но помнить об этой возможности полезно.</p>
41
<p>Делить код таким образом приходится нечасто, но помнить об этой возможности полезно.</p>
42
<p>Например,<a>поучитесь работать</a>с фоновыми картинками через CSS.</p>
42
<p>Например,<a>поучитесь работать</a>с фоновыми картинками через CSS.</p>
43
<a>Курс с трудоустройством: "Веб-разработчик" Узнать о курсе</a>
43
<a>Курс с трудоустройством: "Веб-разработчик" Узнать о курсе</a>