<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Кирилл Беляев: заметки с тегом СВГ</title>
<link>https://www.kirillbelyaev.com/ru/blog/?go=tags/svg/</link>
<description>о подаче информации, айдентике, интерфейсах и жизненной среде</description>
<author>Кирилл Беляев</author>
<language>ru</language>
<generator>E2 (v3572; Aegea)</generator>

<itunes:owner>
<itunes:name>Кирилл Беляев</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>о подаче информации, айдентике, интерфейсах и жизненной среде</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Выравнивание подписей с длинами сторон прямоугольника</title>
<guid isPermaLink="false">672</guid>
<link>https://www.kirillbelyaev.com/ru/blog/?go=all/align-rectangle-side-values/</link>
<pubDate>Mon, 10 Sep 2018 13:42:22 +0300</pubDate>
<author>Кирилл Беляев</author>
<comments>https://www.kirillbelyaev.com/ru/blog/?go=all/align-rectangle-side-values/</comments>
<description>
&lt;p&gt;Заметка о вёрстке специфичного блока в вебе. Большинству такое не пригодится. Пишу, потому что надеюсь показать пользу от применения свойств по назначению.&lt;/p&gt;
&lt;p&gt;Верстали блочок с габаритами основания. Будь текст статичен, хватило бы СВГ. Но в английской версии мы помним об американцах и дублируем размеры в футах (и отбиваем дробную часть точкой):&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/rectangle-wz-sides@2x.png" width="432" height="115" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В СВГ всё задаётся строго по координатам, хорошо масштабируется, но не умеет «адаптироваться» под содержание. Поэтому c СВГ не обойтись без двух шаблонов и надежды, что они выдержат подписи любой длины. Можно усилить СВГ скриптом, но для меня это выглядело суперлишним. Казалось, что справятся ХТМЛ с ЦССом.&lt;/p&gt;
&lt;p&gt;Исходный ХТМЛ простейший:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;div&amp;gt;
    &amp;lt;span&amp;gt;22 м&amp;lt;/span&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;span&amp;gt;14 м&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Первое, что решал: как выравнивать подписи по центру стороны. Понятно, что для верхней подписи нужен «text-align: center», но как ограничить длину подписи, чтобы она равнялась длине прямоугольника, а не всего родительского дива? Можно дублировать width для прямоугольника и подписи, но это не &lt;a href="https://ru.wikipedia.org/wiki/Don’t_repeat_yourself"&gt;DRY&lt;/a&gt; и неудобно в поддержке. Выручило свойство &lt;a href="https://www.w3.org/TR/css-sizing-3/#box-sizing"&gt;box-sizing&lt;/a&gt;, которое говорит, как считать ширину и высоту элемента. Добавил родительскому диву «box-sizing: content-box» — указанные размеры элементы не будут включать падинги и обводки.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;.rectangle {
    position: relative;
    box-sizing: content-box;
    padding-top: отступ, подходящий под высоту подписи; 
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь можно наследовать длину родителя и позиционировать подписи вне его:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;.rectangle-width, .rectangle-height {
    display: inline-block;
    position: absolute;
    white-space: nowrap;
}

.rectangle-width {
    width: inherit;
    top: 0;
    text-align: center;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если текст длиннее отведённой длины, то он начинается от левого края и благодаря «white-space: nowrap» не переносится.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;.rectangle-height {
    left: calc(100% + отступ от фигуры);
    top: 60%;
    transform: translateY(-40%);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Transform и top и выравнивают подпись и фигуру по горизонтали. Если родитель без падинга,  сработает «top: 50%; transform: translateY(-50%)». В моём случае разницу в 20% нашёл на глаз.&lt;/p&gt;
&lt;p&gt;В конце разбираюсь с прямоугольником. Ширину и высоту он наследует у родителя, а ровно поместиться в отведённые границы помогает свойство «box-sizing: border-box», которое, наоборот, включает падинги и обводку.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;.rectangle-figure {
    display: inline-block;
    box-sizing: border-box;
    width: inherit;
    height: inherit;
    border: 1px solid цвет;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Итоговый ХТМЛ английской версии (без оформления футов):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;div class=&amp;quot;rectangle&amp;quot; style=&amp;quot;width: длина; height: высота&amp;quot;&amp;gt;
    &amp;lt;span class=&amp;quot;rectangle-width&amp;quot;&amp;gt;22 m 72.2 ft&amp;lt;/span&amp;gt;
    &amp;lt;div class=&amp;quot;rectangle-figure&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;span class=&amp;quot;rectangle-height&amp;quot;&amp;gt;14 m&amp;lt;br&amp;gt;45.9 ft&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/rectangle-wz-sides-layout@2x.png" width="441" height="115" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Кроме редактирования текста, код требует один раз задать размеры прямоугольника инлайн.&lt;/p&gt;
</description>
</item>

<item>
<title>СВГ-иконки на практике</title>
<guid isPermaLink="true">https://www.kirillbelyaev.com/ru/blog/?go=all/svg-icons/</guid>
<link>https://www.kirillbelyaev.com/ru/blog/?go=all/svg-icons/</link>
<pubDate>Tue, 29 Nov 2016 22:42:43 +0300</pubDate>
<author>Кирилл Беляев</author>
<comments>https://www.kirillbelyaev.com/ru/blog/?go=all/svg-icons/</comments>
<description>
&lt;p&gt;Кроме разрешения и веса, СВГ-иконки умеют удобно хранить несколько состояний. Так не в силах ни один растр. Количество состояний — признак, по которому делю иконки на «сплошные» и «слоёные».&lt;/p&gt;
&lt;p&gt;Если иконка работает, как ссылка — целиком меняет цвет при наведении (или посещении), то про себя называю её «сплошной». С ней можно работать вслепую, не заглядывая внутрь. Говорим через ЦСС всему СВГ: «будь при наведении красным», и всё.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/calendar-icon@2x.png" width="86" height="40" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;А если цвет меняют отдельные части, называю иконку «слоёной». Потому что такие игры возможны, только когда внутри СВГ формы лежат в отдельных элементах друг над другом — слоями.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/star-icon@2x.png" width="160" height="40" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Когда появляется такое поведение, первая идея — применить ЦСС-бордер к сплошной иконке. Но лучше не торопиться. Бордер всегда позиционируется по центру. Если контур однопиксельный, браузер нарисует линию в два полупрозрачных пикселя. И иконка станет мыльной на неретиновом экране.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/star-border@2x.png" width="27" height="27" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Даже если контур будет кратным, сглаживание углов бордером или выход за пределы иконки могут мешать. Поэтому лучше положить в СВГ отдельные слои и управлять ими.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/star-layers@2x.png" width="52" height="35" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;При этом слой с формой в виде обводки не сработает. ЦСС покрасит не только внешнюю форму, но и внутреннюю.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/star-bad-layers@2x.png" width="150" height="38" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Если иконка слоёная, обратиться через ЦСС ко всему СВГ не получится. Нужно манипулировать элементами внутри. Это легко с инлайновым СВГ — добавил классы к нужным элементам и готово. Иконка фулскрина &lt;a href="http://datalaboratory.ru/projects/resistomap/"&gt;в карточке на сайте лаборатории&lt;/a&gt;:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/full-screen-icon@2x.png" width="130" height="64" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;svg class=&amp;quot;full-screen&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&amp;gt;
  &amp;lt;g&amp;gt;
    &amp;lt;path d=&amp;quot;M7,7 L7,8 L6.00097656,8 L6.00097656,9 L5,9 L5,8 L0,8
    L0,18 L10,18 L10,13 L9,13 L9,12 L10,12 L10,11 L11,11 L11,10 L12,10
    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&amp;quot;
    fill=&amp;quot;#FFF&amp;quot;/&amp;gt;
			
    &amp;lt;path class=&amp;quot;variable&amp;quot; d=&amp;quot;M9.538,3.077 L13.935,3.077 L9.538,7.475 L9.538,8.462 
    L10.525,8.462 L14.923,4.065 L14.923,8.462 L16,8.462 L16,2 L9.538,2 L9.538,3.077 
    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 
    L8.461,10.527 L8.461,9.54 L7.474,9.54 L3.077,13.938 Z&amp;quot; 
    fill=&amp;quot;#666&amp;quot;/&amp;gt;
  &amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Без инлайна сложнее — обращение будет к типу элемента или к атрибуту. Плей в той же карточке:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://www.kirillbelyaev.com/ru/blog/pictures/play-icon@2x.png" width="250" height="64" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;svg class=&amp;quot;play&amp;quot;  xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot;&amp;gt;
  &amp;lt;g&amp;gt;
    &amp;lt;polygon fill=&amp;quot;#FFF&amp;quot; points=&amp;quot;0 0 0 22 19 11&amp;quot;&amp;gt;&amp;lt;/polygon&amp;gt;
      
    &amp;lt;path class=“play-fill“ d=&amp;quot;M2,3L2 19 15 11z&amp;quot; fill=&amp;quot;#666&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;
      
    &amp;lt;path class=&amp;quot;play-void“ d=&amp;quot;M3,4.99999999L3 17 13 11z&amp;quot; fill=&amp;quot;#666&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;
  &amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Допустим, он не инлайновый. Тогда при наведении будем менять цвет только элементов «path». Нижний полигон всегда белый. Верхнему треугольнику стоит задать по умолчанию заливку «none», чтобы обращаться к нему отдельно и управлять его видимостью.&lt;/p&gt;
&lt;p&gt;Если такая иконка будет сплошной, понадобиться ещё один СВГ с белым фоном под ней. Это замусорит код и может привести к ошибкам при масштабировании.&lt;/p&gt;
&lt;p&gt;И ещё момент. Графические редакторы делают такой плей из трёх полигонов, поэтому переводить их в кривые придётся вручную. Я неэлегантно вставляю код &lt;a href="http://jsfiddle.net/kirillbelyaev/u88m7fa2/"&gt;в фидл&lt;/a&gt; и копирую получившуюся кривую в инспекторе.&lt;/p&gt;
</description>
</item>


</channel>
</rss>