{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Кирилл Беляев: заметки с тегом СВГ",
    "_rss_description": "о подаче информации, айдентике, интерфейсах и жизненной среде",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/kirillbelyaev.com\/ru\/blog\/?go=tags\/svg\/",
    "feed_url": "https:\/\/kirillbelyaev.com\/ru\/blog\/?go=tags%2Fsvg%2Fjson%2F",
    "icon": "https:\/\/kirillbelyaev.com\/ru\/blog\/user\/userpic@2x.jpg?1662385101",
    "author": {
        "name": "Кирилл Беляев",
        "url": "https:\/\/kirillbelyaev.com\/ru\/blog\/",
        "avatar": "https:\/\/kirillbelyaev.com\/ru\/blog\/user\/userpic@2x.jpg?1662385101"
    },
    "items": [
        {
            "id": "672",
            "url": "https:\/\/kirillbelyaev.com\/ru\/blog\/?go=all\/align-rectangle-side-values\/",
            "title": "Выравнивание подписей с длинами сторон прямоугольника",
            "content_html": "<p>Заметка о вёрстке специфичного блока в вебе. Большинству такое не пригодится. Пишу, потому что надеюсь показать пользу от применения свойств по назначению.<\/p>\n<p>Верстали блочок с габаритами основания. Будь текст статичен, хватило бы СВГ. Но в английской версии мы помним об американцах и дублируем размеры в футах (и отбиваем дробную часть точкой):<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/rectangle-wz-sides@2x.png\" width=\"432\" height=\"115\" alt=\"\" \/>\n<\/div>\n<p>В СВГ всё задаётся строго по координатам, хорошо масштабируется, но не умеет «адаптироваться» под содержание. Поэтому c СВГ не обойтись без двух шаблонов и надежды, что они выдержат подписи любой длины. Можно усилить СВГ скриптом, но для меня это выглядело суперлишним. Казалось, что справятся ХТМЛ с ЦССом.<\/p>\n<p>Исходный ХТМЛ простейший:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;div&gt;\r\n    &lt;span&gt;22 м&lt;\/span&gt;\r\n    &lt;div&gt;&lt;\/div&gt;\r\n    &lt;span&gt;14 м&lt;\/span&gt;\r\n&lt;\/div&gt;<\/code><\/pre><p>Первое, что решал: как выравнивать подписи по центру стороны. Понятно, что для верхней подписи нужен «text-align: center», но как ограничить длину подписи, чтобы она равнялась длине прямоугольника, а не всего родительского дива? Можно дублировать width для прямоугольника и подписи, но это не <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Don’t_repeat_yourself\">DRY<\/a> и неудобно в поддержке. Выручило свойство <a href=\"https:\/\/www.w3.org\/TR\/css-sizing-3\/#box-sizing\">box-sizing<\/a>, которое говорит, как считать ширину и высоту элемента. Добавил родительскому диву «box-sizing: content-box» — указанные размеры элементы не будут включать падинги и обводки.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.rectangle {\r\n    position: relative;\r\n    box-sizing: content-box;\r\n    padding-top: отступ, подходящий под высоту подписи; \r\n}<\/code><\/pre><p>Теперь можно наследовать длину родителя и позиционировать подписи вне его:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.rectangle-width, .rectangle-height {\r\n    display: inline-block;\r\n    position: absolute;\r\n    white-space: nowrap;\r\n}\r\n\r\n.rectangle-width {\r\n    width: inherit;\r\n    top: 0;\r\n    text-align: center;\r\n}<\/code><\/pre><p>Если текст длиннее отведённой длины, то он начинается от левого края и благодаря «white-space: nowrap» не переносится.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.rectangle-height {\r\n    left: calc(100% + отступ от фигуры);\r\n    top: 60%;\r\n    transform: translateY(-40%);\r\n}<\/code><\/pre><p>Transform и top и выравнивают подпись и фигуру по горизонтали. Если родитель без падинга,  сработает «top: 50%; transform: translateY(-50%)». В моём случае разницу в 20% нашёл на глаз.<\/p>\n<p>В конце разбираюсь с прямоугольником. Ширину и высоту он наследует у родителя, а ровно поместиться в отведённые границы помогает свойство «box-sizing: border-box», которое, наоборот, включает падинги и обводку.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">.rectangle-figure {\r\n    display: inline-block;\r\n    box-sizing: border-box;\r\n    width: inherit;\r\n    height: inherit;\r\n    border: 1px solid цвет;\r\n}<\/code><\/pre><p>Итоговый ХТМЛ английской версии (без оформления футов):<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;div class=&quot;rectangle&quot; style=&quot;width: длина; height: высота&quot;&gt;\r\n    &lt;span class=&quot;rectangle-width&quot;&gt;22 m 72.2 ft&lt;\/span&gt;\r\n    &lt;div class=&quot;rectangle-figure&quot;&gt;&lt;\/div&gt;\r\n    &lt;span class=&quot;rectangle-height&quot;&gt;14 m&lt;br&gt;45.9 ft&lt;\/span&gt;\r\n&lt;\/div&gt;<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/rectangle-wz-sides-layout@2x.png\" width=\"441\" height=\"115\" alt=\"\" \/>\n<\/div>\n<p>Кроме редактирования текста, код требует один раз задать размеры прямоугольника инлайн.<\/p>\n",
            "date_published": "2018-09-10T13:42:22+03:00",
            "date_modified": "2018-09-10T13:41:44+03:00",
            "image": "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/rectangle-wz-sides@2x.png",
            "_date_published_rfc2822": "Mon, 10 Sep 2018 13:42:22 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "672",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/rectangle-wz-sides@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/rectangle-wz-sides-layout@2x.png"
                ]
            }
        },
        {
            "id": "477",
            "url": "https:\/\/kirillbelyaev.com\/ru\/blog\/?go=all\/svg-icons\/",
            "title": "СВГ-иконки на практике",
            "content_html": "<p>Кроме разрешения и веса, СВГ-иконки умеют удобно хранить несколько состояний. Так не в силах ни один растр. Количество состояний — признак, по которому делю иконки на «сплошные» и «слоёные».<\/p>\n<p>Если иконка работает, как ссылка — целиком меняет цвет при наведении (или посещении), то про себя называю её «сплошной». С ней можно работать вслепую, не заглядывая внутрь. Говорим через ЦСС всему СВГ: «будь при наведении красным», и всё.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/calendar-icon@2x.png\" width=\"86\" height=\"40\" alt=\"\" \/>\n<\/div>\n<p>А если цвет меняют отдельные части, называю иконку «слоёной». Потому что такие игры возможны, только когда внутри СВГ формы лежат в отдельных элементах друг над другом — слоями.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-icon@2x.png\" width=\"160\" height=\"40\" alt=\"\" \/>\n<\/div>\n<p>Когда появляется такое поведение, первая идея — применить ЦСС-бордер к сплошной иконке. Но лучше не торопиться. Бордер всегда позиционируется по центру. Если контур однопиксельный, браузер нарисует линию в два полупрозрачных пикселя. И иконка станет мыльной на неретиновом экране.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-border@2x.png\" width=\"27\" height=\"27\" alt=\"\" \/>\n<\/div>\n<p>Даже если контур будет кратным, сглаживание углов бордером или выход за пределы иконки могут мешать. Поэтому лучше положить в СВГ отдельные слои и управлять ими.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-layers@2x.png\" width=\"52\" height=\"35\" alt=\"\" \/>\n<\/div>\n<p>При этом слой с формой в виде обводки не сработает. ЦСС покрасит не только внешнюю форму, но и внутреннюю.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-bad-layers@2x.png\" width=\"150\" height=\"38\" alt=\"\" \/>\n<\/div>\n<p>Если иконка слоёная, обратиться через ЦСС ко всему СВГ не получится. Нужно манипулировать элементами внутри. Это легко с инлайновым СВГ — добавил классы к нужным элементам и готово. Иконка фулскрина <a href=\"http:\/\/datalaboratory.ru\/projects\/resistomap\/\">в карточке на сайте лаборатории<\/a>:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/full-screen-icon@2x.png\" width=\"130\" height=\"64\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;svg class=&quot;full-screen&quot; xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;&gt;\r\n  &lt;g&gt;\r\n    &lt;path d=&quot;M7,7 L7,8 L6.00097656,8 L6.00097656,9 L5,9 L5,8 L0,8\r\n    L0,18 L10,18 L10,13 L9,13 L9,12 L10,12 L10,11 L11,11 L11,10 L12,10\r\n    L12,9 L13,9 L13,10 L18,10 L18,0 L8,0 L8,5 L9,5 L9,6 L8,6 L8,7 L7,7 Z&quot;\r\n    fill=&quot;#FFF&quot;\/&gt;\r\n\t\t\t\r\n    &lt;path class=&quot;variable&quot; d=&quot;M9.538,3.077 L13.935,3.077 L9.538,7.475 L9.538,8.462 \r\n    L10.525,8.462 L14.923,4.065 L14.923,8.462 L16,8.462 L16,2 L9.538,2 L9.538,3.077 \r\n    Z M3.077,13.938 L3.077,9.54 L2,9.54 L2,16 L8.461,16 L8.461,14.924 L4.063,14.924 \r\n    L8.461,10.527 L8.461,9.54 L7.474,9.54 L3.077,13.938 Z&quot; \r\n    fill=&quot;#666&quot;\/&gt;\r\n  &lt;\/g&gt;\r\n&lt;\/svg&gt;<\/code><\/pre><p>Без инлайна сложнее — обращение будет к типу элемента или к атрибуту. Плей в той же карточке:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/play-icon@2x.png\" width=\"250\" height=\"64\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;svg class=&quot;play&quot;  xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;&gt;\r\n  &lt;g&gt;\r\n    &lt;polygon fill=&quot;#FFF&quot; points=&quot;0 0 0 22 19 11&quot;&gt;&lt;\/polygon&gt;\r\n      \r\n    &lt;path class=“play-fill“ d=&quot;M2,3L2 19 15 11z&quot; fill=&quot;#666&quot;&gt;&lt;\/path&gt;\r\n      \r\n    &lt;path class=&quot;play-void“ d=&quot;M3,4.99999999L3 17 13 11z&quot; fill=&quot;#666&quot;&gt;&lt;\/path&gt;\r\n  &lt;\/g&gt;\r\n&lt;\/svg&gt;<\/code><\/pre><p>Допустим, он не инлайновый. Тогда при наведении будем менять цвет только элементов «path». Нижний полигон всегда белый. Верхнему треугольнику стоит задать по умолчанию заливку «none», чтобы обращаться к нему отдельно и управлять его видимостью.<\/p>\n<p>Если такая иконка будет сплошной, понадобиться ещё один СВГ с белым фоном под ней. Это замусорит код и может привести к ошибкам при масштабировании.<\/p>\n<p>И ещё момент. Графические редакторы делают такой плей из трёх полигонов, поэтому переводить их в кривые придётся вручную. Я неэлегантно вставляю код <a href=\"http:\/\/jsfiddle.net\/kirillbelyaev\/u88m7fa2\/\">в фидл<\/a> и копирую получившуюся кривую в инспекторе.<\/p>\n",
            "date_published": "2016-11-29T22:42:43+03:00",
            "date_modified": "2016-11-29T22:41:09+03:00",
            "image": "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/calendar-icon@2x.png",
            "_date_published_rfc2822": "Tue, 29 Nov 2016 22:42:43 +0300",
            "_rss_guid_is_permalink": "true",
            "_rss_guid": "https:\/\/kirillbelyaev.com\/ru\/blog\/?go=all\/svg-icons\/",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/calendar-icon@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-icon@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-border@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-layers@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/star-bad-layers@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/full-screen-icon@2x.png",
                    "https:\/\/kirillbelyaev.com\/ru\/blog\/pictures\/play-icon@2x.png"
                ]
            }
        }
    ],
    "_e2_version": 3572,
    "_e2_ua_string": "E2 (v3572; Aegea)"
}