HTML Diff
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 &lt;img src="img/icon.svg" alt="Иконка лупы"&gt;<p>Минус этого способа в том, что взаимодействовать с внутренними элементами SVG не получится. Файл будет как за стеклом: смотреть можно, а вот трогать нельзя.</p>
16 &lt;img src="img/icon.svg" alt="Иконка лупы"&gt;<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 &lt;svg&gt; &lt;rect x="10" y="10" width="100" height="100" /&gt; &lt;/svg&gt;<p>Такая вставка выручает, когда при взаимодействии с картинкой нужно её визуально модифицировать - например, перекрасить svg-иконку при наведении на неё курсора.</p>
21 &lt;svg&gt; &lt;rect x="10" y="10" width="100" height="100" /&gt; &lt;/svg&gt;<p>Такая вставка выручает, когда при взаимодействии с картинкой нужно её визуально модифицировать - например, перекрасить svg-иконку при наведении на неё курсора.</p>
22 <p>Напрямую на html-страницу (в теге &lt;svg&gt;) вставляют как контентные, так и декоративные изображения, а минус тут в том, что такие картинки не кешируются отдельно от страницы.</p>
22 <p>Напрямую на html-страницу (в теге &lt;svg&gt;) вставляют как контентные, так и декоративные изображения, а минус тут в том, что такие картинки не кешируются отдельно от страницы.</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 &lt;a href="https://vk.com/" class=”vk”&gt; &lt;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"&gt; &lt;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" /&gt; &lt;/svg&gt; &lt;/a&gt;<p>Да, это не ошибка, так в HTML вставляют небольшие svg-картинки. Для больших целесообразнее подключать отдельный файл, который будет кэшироваться браузером. Здесь мы не будем в это углубляться.</p>
26 &lt;a href="https://vk.com/" class=”vk”&gt; &lt;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"&gt; &lt;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" /&gt; &lt;/svg&gt; &lt;/a&gt;<p>Да, это не ошибка, так в HTML вставляют небольшие svg-картинки. Для больших целесообразнее подключать отдельный файл, который будет кэшироваться браузером. Здесь мы не будем в это углубляться.</p>
27 <p><strong>Обратите внимание</strong>на тег<strong>&lt;path&gt;</strong>(в переводе с английского "путь"). Он позволяет задать любую фигуру компактной строкой - описанием пути от начальной точки до конечной через промежуточные координаты.</p>
27 <p><strong>Обратите внимание</strong>на тег<strong>&lt;path&gt;</strong>(в переводе с английского "путь"). Он позволяет задать любую фигуру компактной строкой - описанием пути от начальной точки до конечной через промежуточные координаты.</p>
28 <p>Строка с данными задаётся атрибутом d тега &lt;path&gt;. Она содержит команды, которые закодированы набором букв и чисел. Буква представляет тип команды, а числа - её параметры (чаще всего координаты).</p>
28 <p>Строка с данными задаётся атрибутом d тега &lt;path&gt;. Она содержит команды, которые закодированы набором букв и чисел. Буква представляет тип команды, а числа - её параметры (чаще всего координаты).</p>
29 <p>Теперь мы запросто добавим к ссылочному тегу &lt;a&gt; псевдокласс :hover и зададим через него новый цвет svg-изображения. Это делается в CSS с помощью свойства fill ("заливка").</p>
29 <p>Теперь мы запросто добавим к ссылочному тегу &lt;a&gt; псевдокласс :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>Заливка может быть задана атрибутом у &lt;svg&gt; (fill="#000"). Тогда работать с ней через CSS не получится, так как css-стили не могут перебить правила, заданные атрибутами. В этом случае стоит просто вручную удалить этот атрибут у &lt;svg&gt;.</p>
31 <p><strong>И ещё один нюанс.</strong>Заливка может быть задана атрибутом у &lt;svg&gt; (fill="#000"). Тогда работать с ней через CSS не получится, так как css-стили не могут перебить правила, заданные атрибутами. В этом случае стоит просто вручную удалить этот атрибут у &lt;svg&gt;.</p>
32 <p>Итак, мы научились менять цвет svg-иконки через свойство fill, вставляя её напрямую в HTML. Заметьте, что такое нельзя сделать ни с помощью тега &lt;img&gt;, ни через свойство background.</p>
32 <p>Итак, мы научились менять цвет svg-иконки через свойство fill, вставляя её напрямую в HTML. Заметьте, что такое нельзя сделать ни с помощью тега &lt;img&gt;, ни через свойство background.</p>
33 <p>Рассмотрим более сложную ситуацию - когда иконка состоит из нескольких простых svg-изображений. Например, примитивная лупа из прямоугольника и круга:</p>
33 <p>Рассмотрим более сложную ситуацию - когда иконка состоит из нескольких простых svg-изображений. Например, примитивная лупа из прямоугольника и круга:</p>
34 <p>Код для кнопки с иконкой лупы будет таким:</p>
34 <p>Код для кнопки с иконкой лупы будет таким:</p>
35 &lt;button class="btn-reset search"&gt; &lt;svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;rect x="19.5138" y="18.5495" width="8" height="2" transform="rotate(45 19.5138 18.5495)" /&gt; &lt;circle cx="11.5" cy="11.5" r="10.5" stroke-width="2" /&gt; &lt;/svg&gt; &lt;/button&gt;<p>Проблема здесь в том, что внутри svg-иконки два разных тега:</p>
35 &lt;button class="btn-reset search"&gt; &lt;svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;rect x="19.5138" y="18.5495" width="8" height="2" transform="rotate(45 19.5138 18.5495)" /&gt; &lt;circle cx="11.5" cy="11.5" r="10.5" stroke-width="2" /&gt; &lt;/svg&gt; &lt;/button&gt;<p>Проблема здесь в том, что внутри svg-иконки два разных тега:</p>
36 <ul><li>&lt;rect&gt; (прямоугольник - ручка лупы)</li>
36 <ul><li>&lt;rect&gt; (прямоугольник - ручка лупы)</li>
37 <li>и &lt;circle&gt; (круг - ободок лупы).</li>
37 <li>и &lt;circle&gt; (круг - ободок лупы).</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>