<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Техноблог</title>
<link>https://blog.toliklunev.ru/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Применение Optional в Java</title>
<guid isPermaLink="false">53</guid>
<link>https://blog.toliklunev.ru/all/primenenie-optional-v-java/</link>
<comments>https://blog.toliklunev.ru/all/primenenie-optional-v-java/</comments>
<description>&lt;p&gt;&lt;i&gt;Техноблог возвращается из стазиса. Теперь я верчусь в мире Java и заметки тоже будут про этот мир. Буду писать про всякие интересные штуки, которые обнаруживаю. Возможно, они миллион раз были где-то описаны, но мне это не важно, так как заметки скорее для себя, но может быть они ещё кому-то будут интересны.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Представим, что вам по цепочке вызовов нужно достать какое-то значение:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;final Any thing = holder.getValue().getData().getObject().getAnythingElse();&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При этом, в любом звене этой цепочки может вернуться null и случится &lt;s&gt;аппокалипсис&lt;/s&gt; NullPointerException. Но он нам не нужен, а если вернулся null, нужно просто вернуть какое-нибудь дефолтное значение.&lt;/p&gt;
&lt;p&gt;Можно обернуть всё это горой if-ов:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;if(null != holder ) {
    if(null != holder.getValue()) {
        if(null != holder.getValue().getData()) {
            ...
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Можно попробовать завернуть в try-catch (никогда так не делайте):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;try {
    final Any thing = holder.getValue().getData().getObject().getAnythingElse();
} catch (NullPointerException e) {
    final Any thing = &amp;quot;Default Value&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Но красивым, и, на мой взгляд, лучшим решением будет использовать Optional:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;final Any thing =
    Optional.ofNullable(holder)
        .map(Valuer::getValue)
        .map(Wrapper::getData)
        .map(Some::getObject)
        &amp;lt;...&amp;gt;
    .orElse(&amp;quot;Default Value&amp;quot;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Каждый map проверит значение, возвращённое методом, на null и вернётся или нужное нам значение или заданное в блоке orElse.&lt;/p&gt;
</description>
<pubDate>Wed, 14 Mar 2018 00:29:56 +0400</pubDate>
</item>

<item>
<title>Псевдопротокол tel:</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/psevdoprotokol-tel/</guid>
<link>https://blog.toliklunev.ru/all/psevdoprotokol-tel/</link>
<comments>https://blog.toliklunev.ru/all/psevdoprotokol-tel/</comments>
<description>&lt;p&gt;Мобильные браузеры определяют телефон по тапу на нём и предлагают совершить звонок — это удобно. Но это работает, только если  в вёрстке телефон сделан единым текстом. Однако часто дизайнеры оформляют телефон так:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/tel1.png" width="215" height="42" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/tel2.png" width="204" height="42" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/tel3.png" width="203" height="36" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В данном случае случае телефон придётся разбить на два блока, и единого текста, как не пытайся, не выйдет. Мобильный браузер, скорее всего, не определит телефон.&lt;/p&gt;
&lt;p&gt;На помощь приходит псевдопротокол tel. Оборачиваем телефон в ссылку с этим протоколом:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;a href=&amp;quot;tel:+7 (123) 456-78-90&amp;quot;&amp;gt;
	&amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;+7 123&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;number&amp;quot;&amp;gt;456-78-90&amp;lt;/span&amp;gt;
&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь по тапу на ссылку браузер определит телефон.&lt;/p&gt;
</description>
<pubDate>Mon, 29 Dec 2014 21:14:02 +0400</pubDate>
</item>

<item>
<title>Быстрый способ получить svg из векторного слоя в фотошопе</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/bystry-sposob-poluchit-svg-iz-vektornogo-sloya-v-fotoshope/</guid>
<link>https://blog.toliklunev.ru/all/bystry-sposob-poluchit-svg-iz-vektornogo-sloya-v-fotoshope/</link>
<comments>https://blog.toliklunev.ru/all/bystry-sposob-poluchit-svg-iz-vektornogo-sloya-v-fotoshope/</comments>
<description>&lt;p&gt;&lt;strong&gt;Данный способ работает только в Photoshop CC.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Первым делом создаём в домашней папке пользователя файл generator.json, со следующим содержимым:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{
  &amp;quot;generator-assets&amp;quot;:  { 
    &amp;quot;svg-enabled&amp;quot;: true
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Файл можно скачать (&lt;a href="http://blog.toliklunev.ru/download/generator.json" download="generator.json"&gt;generator.json&lt;/a&gt;), для ускорения процесса.&lt;/p&gt;
&lt;p&gt;Ставим галку в меню File → Generate → Image Assets.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/image-assets.png" width="451" height="657" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Затем переименовываем нужный слой, даём ему любое имя, заканчивающиеся на .svg (например pic.svg).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/pic.svg.png" width="280" height="225" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;И вуаля. Рядом с psd файлом получаем папку, в которой будет лежать готовый svg.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/svg-in-folder.png" width="677" height="108" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Можно переименовывать даже группу слоёв.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/group.svg.png" width="387" height="355" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Фотошоп довольно умно сгенерирует единый svg файл, учитывая все эффекты слоёв.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/svg-code.png" width="745" height="875" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Tue, 04 Nov 2014 02:23:17 +0400</pubDate>
</item>

<item>
<title>Фишка инпута для файлов, о которой не все знают</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/fishka-inputa-dlya-faylov-o-kotoroy-ne-vse-znayut/</guid>
<link>https://blog.toliklunev.ru/all/fishka-inputa-dlya-faylov-o-kotoroy-ne-vse-znayut/</link>
<comments>https://blog.toliklunev.ru/all/fishka-inputa-dlya-faylov-o-kotoroy-ne-vse-znayut/</comments>
<description>&lt;p&gt;Оказывается, при указании файла в браузере совсем необязательно мучится со стандартным диалоговым окном выбора файлов.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/filedialog.png" width="768" height="434" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Достаточно всего лишь перетащить нужный файл прямо на инпут.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/dropfile.png" width="436" height="424" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;К сожалению, это волшебство никак не распространяется на лейб для инпута. Поэтому, если вы каким-либо образом пытаетесь оформить стандартный инпут, растяните его по размерам блока и скройте с помощью прозрачности.&lt;/p&gt;
</description>
<pubDate>Sun, 12 Oct 2014 06:11:55 +0400</pubDate>
</item>

<item>
<title>CSS Шрифт</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/cssfont/</guid>
<link>https://blog.toliklunev.ru/all/cssfont/</link>
<comments>https://blog.toliklunev.ru/all/cssfont/</comments>
<description>&lt;p&gt;Большинство веб-сервисов для подготовки кастомных шрифтов к вёрстке конвертируют шрифт в 4-5 разных форматов, при том что конвертировать имеет смысл только в один формат, в woff. Woff лёгок, и поддерживается всеми современными браузерами. При этом woff имеет смысл кодировать в base64 и вставить непосредственно в css файл с помощью data:uri.&lt;/p&gt;
&lt;p&gt;Об этом ещё в 2012 году &lt;a href="http://artgorbunov.ru/bb/soviet/20121129/" target="_blank"&gt;писал&lt;/a&gt; Артём Поликарпов. С тех пор, как я прочитал совет Артёма, я подготавливал все шрифты вручную, т. е. конвертировал файл сначала в woff, затем кодировал в base64, затем создавал css-файл и вставлял в него всё полученное. И мечтал о сервисе, который делал бы за меня всё это автоматически. Но, к сожалению, так и не нашёл такого, и поэтому сделал сам. Собственно вот:&lt;/p&gt;
&lt;div style="overflow: hidden;"&gt;&lt;iframe src="https://cssfont.toliklunev.ru/" frameborder="0" width="340px" height="450px" style="margin-top: -87px;"&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;p&gt;&lt;a href="https://cssfont.toliklunev.ru/" target="_blank"&gt;Открыть в новой вкладке&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Плюсы шрифта в css:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;нужно подключить всего один файл;&lt;/li&gt;
&lt;li&gt;меньше запросов к серверу;&lt;/li&gt;
&lt;li&gt;текст не прыгает при загрузке шрифта.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Минусы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;не поддерживается ИЕ ниже 9-го.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;От поддержки 8-го ИЕ я отказался (рекомендую и вам), по нескольким причинам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;шрифт в формате eot (специальный формат для ИЕ), у меня не работал практически никогда, и как сделать, чтоб заработал, я понятия не имел;&lt;/li&gt;
&lt;li&gt;человеку с ИЕ 8 будет не до вашего кастомного шрифта, из-за которого этот браузер начнёт ещё больше тормозить, да ещё и сайт из-за него грузится дольше будет, поэтому имеет смысл подобрать стандартный шрифт.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ссылки по теме:&lt;br /&gt;
&lt;a href="http://habrahabr.ru/post/180615/" target="_blank"&gt;Ещё один способ устранить ВОШ&lt;/a&gt;&lt;/p&gt;
</description>
<pubDate>Tue, 26 Aug 2014 00:19:32 +0400</pubDate>
</item>

<item>
<title>О скриншотах веб-страниц</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/o-skrinshotah-veb-stranic/</guid>
<link>https://blog.toliklunev.ru/all/o-skrinshotah-veb-stranic/</link>
<comments>https://blog.toliklunev.ru/all/o-skrinshotah-veb-stranic/</comments>
<description>&lt;p&gt;Есть вещь, которая мне совершенно непонятна в современных браузерах. А именно отсутствие человеческой возможности сделать скриншот страницы в полный рост.&lt;/p&gt;
&lt;p&gt;Сейчас эта задача решается какими-то сторонними расширениями и плагинами, которые работают ужасно абсолютно все. Лично я пользуюсь вот &lt;a href="https://chrome.google.com/webstore/detail/webpage-screenshot/ckibcdccnfeookdmbahgiakhnjcddpki"&gt;этим&lt;/a&gt; для хрома и плачу каждый раз, когда использую его.&lt;/p&gt;
&lt;p&gt;Самое интересное то, что браузер итак уже отрендерил страницу, на которой я нахожусь. Значит её изображение уже есть где-то у него в памяти. Неужели разработчикам так сложно добавить где-нибудь в настройках браузера незаметную кнопку «Сохранить изображение страницы»? Загадка.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; Нашёл расширение получше: &lt;a href="https://chrome.google.com/webstore/detail/joxi-screenshot-capture/jhcdlkgjiehgpnpolkbnmpffjodigbkb" target="_blank"&gt;Joxi&lt;/a&gt;. И сервис, который вообще всё за тебя делает: &lt;a href="http://www.s-shot.ru/" target="_blank"&gt;S-shot&lt;/a&gt;.&lt;/p&gt;
</description>
<pubDate>Sat, 23 Aug 2014 06:46:10 +0400</pubDate>
</item>

<item>
<title>Швейцарский нож jQuery-разработчика — jQuery Helpers</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/jqueryhelpers/</guid>
<link>https://blog.toliklunev.ru/all/jqueryhelpers/</link>
<comments>https://blog.toliklunev.ru/all/jqueryhelpers/</comments>
<description>&lt;p&gt;Каждый веб-разработчик, работающий с jQuery, со временем начинает собирать удачные решения и ходы, для того, чтобы применять их в будущих проектах. Со временем таких решений накапливается много, некоторые из них перерастают в плагины, а некоторые небольшие, но полезные куски кода копируются из проекта в проект. Похожим образом получилось и у меня. И сейчас я хочу поделиться с вами своими наработками. Надеюсь, для кого-то из вас они тоже окажутся полезными :-)&lt;/p&gt;
&lt;p&gt;Можно &lt;a href="https://github.com/codefucker/jQueryHeplers" target="_blank"&gt;посмотреть на Гитхабе&lt;/a&gt; или сразу &lt;a href="https://github.com/codefucker/jQueryHeplers/archive/master.zip"&gt;скачать&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="#makeActive"&gt;makeActive&lt;/a&gt;&lt;br /&gt;
&lt;a href="#cycle"&gt;cycle&lt;/a&gt;&lt;br /&gt;
&lt;a href="#genHtml"&gt;genHtml&lt;/a&gt;&lt;br /&gt;
&lt;a href="#insertCount"&gt;appendCount, prependCount&lt;/a&gt;&lt;br /&gt;
&lt;a href="#onlyDigits"&gt;onlyDigits&lt;/a&gt;&lt;br /&gt;
&lt;a href="#parseInt"&gt;parseInt, parseFloat&lt;/a&gt;&lt;br /&gt;
&lt;a href="#breakdown"&gt;breakdown&lt;/a&gt;&lt;br /&gt;
&lt;a href="#cleaner"&gt;cleaner&lt;/a&gt;&lt;br /&gt;
&lt;a href="#dataObject"&gt;dataObject&lt;/a&gt;&lt;br /&gt;
&lt;a href="#popup"&gt;popup&lt;/a&gt;&lt;br /&gt;
&lt;a href="#transmit"&gt;transmit&lt;/a&gt;&lt;br /&gt;
&lt;a href="#attr"&gt;src, href&lt;/a&gt;&lt;br /&gt;
&lt;a href="#disable"&gt;disable, enable&lt;/a&gt;&lt;br /&gt;
&lt;a href="#hash"&gt;hash, pathname&lt;/a&gt;&lt;br /&gt;
&lt;a href="#run"&gt;run&lt;/a&gt;&lt;br /&gt;
&lt;a href="#removeSpaces"&gt;removeSpaces&lt;/a&gt;&lt;br /&gt;
&lt;a href="#reverse"&gt;reverse&lt;/a&gt;&lt;br /&gt;
&lt;a href="#ending"&gt;ending&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;h2 id="makeActive"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/makeActive.js" target="_blank"&gt;makeActive&lt;/a&gt; (’classname’ || object{classname, selector})&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Часто возникает ситуация, когда нужно назначить класс таким образом, чтобы элемент был единственным его обладателем в ряду соседних элементов. Эту проблему помогает решить makeActive. По умолчанию назначается класс active. Нужный класс можно передать строкой :&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(this).makeActive('my_class_name');&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Или передать объект, заключающий в себе название класса и селектор соседних элементов:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(this).makeActive({
	className: 'my_class_name',
	selector: 'div'
});&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Пример:&lt;/p&gt;
&lt;iframe height="170" width="600" src="http://fiddle.jshell.net/codefucker/28DB8/1/show/light/" frameborder="0"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$('div').click(function(){
    $(this).makeActive();
});&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;h2 id="cycle"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/cycle.js" target="_blank"&gt;cycle&lt;/a&gt; (’next’ || ’prev’)&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Не знаю как вам, а мне иногда катастрофически не хватает циклических next / prev в jQuery. Эту проблему я решил, написав хелпер cycle, который принимает next или prev в качестве строки.&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$('#prev').click(function(){
    $('.wrap div.active').cycle('prev').makeActive();
});

$('#next').click(function(){
    $('.wrap div.active').cycle('next').makeActive();
});&lt;/code&gt;&lt;/pre&gt;&lt;iframe  height="200" width="600" src="http://fiddle.jshell.net/codefucker/28DB8/4/show/light/" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;h2 id="genHtml"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/gen.js" target="_blank"&gt;genHtml&lt;/a&gt; (code, count)&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Иногда бывает задача создать определённое количество html элементов, например для пагинации слайдера.&lt;/p&gt;
&lt;p&gt;Конструкции вроде:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$('.slide').each(function(i){
	var $li = $('&amp;lt;li&amp;gt;').append('&amp;lt;a&amp;gt;&amp;lt;span&amp;gt;'+ (i+1) +'&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;');
	$pagination.append($li);
});&lt;/code&gt;&lt;/pre&gt;&lt;!-- или что хуже:
&lt;code&gt;$('ul').append('&lt;li&gt;&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;&lt;/li&gt;');&lt;/code&gt;&gt; --&gt;&lt;p&gt;меня всегда бесили. Поэтому был написан хелпер genHtml, который принимает тег строкой и количество.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="insertCount"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/gen.js" target="_blank"&gt;appendCount, prependCount&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Вставляют нужное количество html элементов на страницу, используя genHtml. Синтаксис такой же как у genHtml.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="onlyDigits"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/onlyDigits.js" target="_blank"&gt;onlyDigits&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Иногда требуется текстовый инпут, в который физически можно ввести только цифры. К великому сожалению, стандартные средства html не предлагают такого функционала (даже &lt;mark&gt;&amp;lt;input type=&amp;quot;number&amp;quot; /&amp;gt;&lt;/mark&gt; в котором это было бы логично). Для этого существует хелпер onlyDigits.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$('input').onlyDigits();&lt;/code&gt;&lt;/pre&gt;&lt;iframe height="87" src="http://fiddle.jshell.net/codefucker/28DB8/9/show/light/" frameborder="0"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;h2 id="parseInt"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/parse.js" target="_blank"&gt;parseInt, parseFloat&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Вызываются у блока с числом или инпута и возвращают число сразу с типом number.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="breakdown"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/breakdown.js" target="_blank"&gt;breakdown&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;С помощью этого хелпера, можно разбить число пробелами по разрядам.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$('#num').breakdown();&lt;/code&gt;&lt;/pre&gt;&lt;iframe height="92" src="http://fiddle.jshell.net/codefucker/28DB8/14/show/light/" frameborder="0" &gt;&lt;/iframe&gt;
&lt;p&gt;&lt;h2 id="cleaner"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/cleaner.js" target="_blank"&gt;cleaner&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;В современных приложениях реализована такая удобная, особенно на мобильных устройствах, штука, как крестик для очистки инпута от введённых в него данных. В браузеры, к сожалению, перекочёвывать она не сильно спешит. Насколько я знаю, такой крестик есть только в интернет экплорере, но последний не предоставляет возможностей для оформления этого элемента.&lt;/p&gt;
&lt;p&gt;Для этих целей был написан хелпер cleaner. Он добавляет рядом с инпутом &lt;mark&gt;&amp;lt;a class=&amp;quot;clean&amp;quot; /&amp;gt&lt;/mark&gt;, который можно оформить с помощью css как душе угодно.&lt;br /&gt;
Желательно перед использованием обернуть инпут в какой-нибудь див, а крестик прижать вправо абсолютным позиционированием. А после этого добавить инпуту паддинг справа, чтобы текст не заезжал на крестик. Да, к сожалению всё это не так удобно, как мне хотелось бы, но работаю над упрощением. Для стандартного использования написан &lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/cleaner.scss" target="_blank"&gt;css-код&lt;/a&gt;, который желательно просто копировать в основной файл стилей своего проекта и изменять.&lt;/p&gt;
&lt;iframe height="87" src="http://fiddle.jshell.net/codefucker/28DB8/13/show/light/" frameborder="0" style="margin-left: -5px;"&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;h2 id="dataObject"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/dataObject.js" target="_blank"&gt;dataObject&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Данный хелпер позволяет доставать javascript-объекты из атрибутов data-*. Используется также, как и стандартный метод .data() в jQuery, только вместо строки возвращает объект.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="popup"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/popup.js" target="_blank"&gt;popup&lt;/a&gt; ([object{close, link}])&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Иногда нужен простой попап, который бы закрывался при клике за его пределами. Для этого был написан хелпер popup. При вызове он добавляет элементу класс shown, и удаляет при закрытии (я использую добавление класса, а не show/hide, чтобы управлять анимацией появления при помощи css). Метод может принимать объект, с атрибутами link и close. link — ссылка, при клике на которую будет показан попап. close — элемент внутри попапа (крестик), при клике на который попап будет закрыт.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="transmit"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/transmit.js" target="_blank"&gt;transmit&lt;/a&gt; (’method’, [options array])&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Все мы постоянно пишем колбеки для разных событий, и почти всегда используем анонимные функции для этого. Но конструкции вроде этой:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(window).load(function(){
	$('#object').click();
});&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;мне кажутся нелогичными и трудночитаемыми, когда намного логичней было бы так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(window).load($('#object').click);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Но jQuery перезаписывает контекст у колбеков. И конечно в 99% случаев это удобно, но не в данном.&lt;br /&gt;
Хелпер transmit частично решает эту проблему, позволяя писать так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$(window).load($('#object').transmit('click'));&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;h2 id="attr"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/attr.js" target="_blank"&gt;src, href&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Возвращают/изменяют значение атрибутов src и href у элементов на странице. Мне не хватало таких методов как val() у инпутов, только для ссылок.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="disable"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/disable.js" target="_blank"&gt;disable, enable&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;disable — добавляет атрибут &lt;mark&gt;disabled&lt;/mark&gt; у элементов, enable — убирает.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="hash"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/attr.js" target="_blank"&gt;hash, pathname&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Возвращают/изменяют соответствующие части href у ссылок на странице.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="run"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/run.js" target="_blank"&gt;run&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Запускает функцию в контексте текущей выборки, а не для каждого элемента отдельно, в отличии от &lt;a href="http://api.jquery.com/each/" target="_blank"&gt;each&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="removeSpaces"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/removeSpaces.js" target="_blank"&gt;removeSpaces&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Удаляет пробелы между элементами. Служит, в основном, для решения проблем с инлайн-блоками.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="reverse"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/reverse.js" target="_blank"&gt;reverse()&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Разворачивает порядок следования jQuery объектов.&lt;/p&gt;
&lt;p&gt;&lt;h2 id="ending"&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/helpers/ending.js" target="_blank"&gt;ending&lt;/a&gt; (end1, end2, end3, count)&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Хелпер для формирования окончаний у слов во множественном числе.&lt;/p&gt;
&lt;iframe height="87" src="http://fiddle.jshell.net/codefucker/28DB8/11/show/light/" frameborder="0" style="margin-left: -5px;"&gt;&lt;/iframe&gt;
&lt;p&gt;Для определения возможностей браузера я рекомендую использовать &lt;a href="http://modernizr.com/" target="_blank"&gt;Modernizr&lt;/a&gt;. Но в своей работе я сталкивался с тем, что не все нужные мне тесты были реализованы в нём. Поэтому я написал парочку своих, расширив jQuery.support, и оформив всё в файл jquery.support.js.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/support/calc.js" target="_blank"&gt;jQuery.support.calc&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Определяет, поддерживает  ли браузер css-функцию calc. Актуально для старых версий оперы и 8-го экслорера.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/support/flash.js" target="_blank"&gt;jQuery.support.flash&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Определяет, установлен ли Flash на компьютере пользователя.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/support/mobile.js" target="_blank"&gt;jQuery.support.mobile&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Детектит мобильные браузеры.&lt;/p&gt;
&lt;p&gt;&lt;h2&gt;&lt;a href="https://github.com/codefucker/jQueryHeplers/blob/master/src/support/preserve3d.js" target="_blank"&gt;jQuery.support.preserve3d&lt;/a&gt;&lt;/h2&gt;&lt;/p&gt;
&lt;p&gt;Проверяет, поддерживается ли браузером 3D представления. Актуально, если вы хотите использовать в своём проекте &lt;mark&gt;transform-style: preserve-3d;&lt;/mark&gt;.&lt;/p&gt;
&lt;p&gt;Хелперы собираются в один файл с помощью &lt;a href="http://gruntjs.com/" target="_blank"&gt;Гранта&lt;/a&gt;. Если проект получит развитие, в дальнейшем будет добавлена страница онлайн-сборки, где вы сможете собрать jQuery Helpers, выбрав только  необходимые вашему проекту хелперы.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; Произошла какая-то фигня, и я не заметил, как публикнул недописанный черновик. Но это даже хорошо, т. к. я бы ещё месяц его мусолил. Так что кто увидел — тссс.&lt;/p&gt;
</description>
<pubDate>Thu, 07 Aug 2014 17:47:06 +0400</pubDate>
</item>

<item>
<title>finalReject — наипростейшая заглушка для старых версий IE</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/finalreject/</guid>
<link>https://blog.toliklunev.ru/all/finalreject/</link>
<comments>https://blog.toliklunev.ru/all/finalreject/</comments>
<description>&lt;p&gt;finalReject — Плагин, отображающий, в устаревших версиях Internet Explorer, заглушку с предложением обновить браузер. Заглушка накладывается поверх сайта в виде попапа, и в случае чего может быть закрыта пользователем. При этом, после закрытия, она не исчезает навсегда, а прикрепляется к верхней части окна браузера, и продолжает отображаться в минимизированном виде.&lt;/p&gt;
&lt;p&gt;Полная заглушка выглядит вот так:&lt;/p&gt;
&lt;iframe width="806" height="378" frameborder="0" src="https://fiddle.jshell.net/codefucker/c5uey/2/show/light/"&gt;&lt;/iframe&gt;
&lt;p&gt;Установка плагина предельно проста. Достаточно скачать архив по &lt;a href="https://github.com/codefucker/finalReject/archive/master.zip" onclick="yaCounter25967218.reachGoal('finalReject_download');"&gt;ссылке&lt;/a&gt; и распаковать папку reject в корень сайта. Или в любое другое место на сайте.&lt;/p&gt;
&lt;p&gt;Подключается плагин самым нативным способом: с помощью условных комментариев. Например для отображения заглушки во всех версиях IE ниже 9, достаточно добавить в блок &amp;lt;head&amp;gt; следующий код:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="xml"&gt;&amp;lt;!--[if lt IE 9]&amp;gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/reject/reject.css&amp;quot; media=&amp;quot;all&amp;quot; /&amp;gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/reject/reject.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;![endif]--&amp;gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;В 7-9 версиях Internet Explorer плагин отображается и работает так, как задумано. В 6-й не совсем, но тоже адекватно.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/codefucker/finalReject/"&gt;Страница плагина на Гитхабе&lt;/a&gt;. Буду рад вашим старам, и пулл реквестам :-)&lt;/p&gt;
&lt;p&gt;&lt;i&gt;На какое-то время, эта заметка в блоге будет являться официальной страницей плагина, пока я не придумаю что-нибудь поинтересней.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;UPD: Теперь finalReject можно установить с помощью bower:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$ bower install final-reject --save&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;UPD2: Можно ничего не скачивать и не устанавливать, а просто добавить в &amp;lt;head&amp;gt; код:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="xml"&gt;&amp;lt;!--[if lt IE 9]&amp;gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://rawgit.com/codefucker/finalReject/master/reject/reject.css&amp;quot; media=&amp;quot;all&amp;quot; /&amp;gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://rawgit.com/codefucker/finalReject/master/reject/reject.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;![endif]--&amp;gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;UPD3: Текст заглушки можно изменить с помощью аттрибута data-text:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;!--[if lt IE 9]&amp;gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://rawgit.com/codefucker/finalReject/master/reject/reject.css&amp;quot; media=&amp;quot;all&amp;quot; /&amp;gt;
	&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://rawgit.com/codefucker/finalReject/master/reject/reject.min.js&amp;quot; data-text=&amp;quot;Unfortunately, the browser you use, outdated and can not properly display the site. Please download any of the following browsers:&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;![endif]--&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Sun, 04 May 2014 23:22:55 +0400</pubDate>
</item>

<item>
<title>Как подружить Sublime Text 2 и SASS на Windows</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/kak-podruzhit-sublime-text-i-sass-na-windows/</guid>
<link>https://blog.toliklunev.ru/all/kak-podruzhit-sublime-text-i-sass-na-windows/</link>
<comments>https://blog.toliklunev.ru/all/kak-podruzhit-sublime-text-i-sass-na-windows/</comments>
<description>&lt;p&gt;Если ты не знаешь что такое SASS, можешь почитать &lt;a href="http://habrahabr.ru/post/140612/"&gt;тут&lt;/a&gt;. Вкратце: очень крутая штука.&lt;/p&gt;
&lt;p&gt;Для начала, для того, чтобы получить возможность компилировать &lt;a href="http://sass-lang.com/"&gt;sass/scss&lt;/a&gt; файлы необходимо установить &lt;a href="http://rubyinstaller.org/downloads/"&gt;Ruby&lt;/a&gt;. Во время установки обязательно проследи чтобы стояла галочка, добавляющая Ruby в Path.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/sass/ruby.png" width="513" height="398" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;После установки запусти командную строку (cmd). Это можно сделать нажав Win + R и набрав cmd. В командной строке набери «gem install sass». Должно появится что-то вроде этого:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/sass/gem.png" width="677" height="342" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;SASS установлен. Теперь ты можешь компилировать sass/scss файлы, используя командную строку:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/sass/compile.png" width="677" height="342" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Но гораздо удобней делать это через текстовый редактор, например &lt;a href="http://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Для начала в Sublime должен быть установлен Package Control. Если он у тебя ещё не установлен, нажми &lt;b&gt;ctrl+ё&lt;/b&gt;, вставь в открывшуюся консоль следующие строки:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;После установки перезапусти Sublime.&lt;/p&gt;
&lt;p&gt;Теперь Package Control доступен из вкладки Preferences.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/sass/package_control.png" width="207" height="291" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Нажми на него или используй хоткей &lt;b&gt;ctrl+shift+P&lt;/b&gt; и набери &lt;b&gt;Install Package&lt;/b&gt;, затем &lt;b&gt;SASS Build&lt;/b&gt; и установи плагин.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/sass/insatall.png" width="408" height="69" alt="" /&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.toliklunev.ru/pictures/sass/sass_build.png" width="414" height="399" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Перезапусти Sublime.&lt;/p&gt;
&lt;p&gt;Всё, теперь ты можешь компилировать sass/scss файлы нажав &lt;b&gt;ctrl+B&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Скомпилированный файл появится рядом, с таким же именем и расширением css.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Важно!&lt;/b&gt; В пути до компилируемого файла не должно быть русских символов. Да, в 21-м веке это звучит странно, но у Sublime возникают с этим проблемы. Если ты знаешь как это победить, поделись в комментариях.&lt;/p&gt;
&lt;p&gt;Если файл не компилируется, а в консоли выводится что-то вроде этого:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;Traceback (most recent call last):
  File &amp;quot;.\sublime_plugin.py&amp;quot;, line 337, in run_
  File &amp;quot;.\exec.py&amp;quot;, line 154, in run
  File &amp;quot;.\exec.py&amp;quot;, line 45, in __init__
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 6: ordinal not in range(128)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;то есть одно магическое действие, которое может решить проблему.&lt;/p&gt;
&lt;p&gt;Кликни в меню Preferences → Browse Packages...&lt;/p&gt;
&lt;p&gt;открой файл /Default/exec.py и замени строку&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;proc_env[k] = os.path.expandvars(v).encode(sys.getfilesystemencoding())&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;на&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;proc_env[k] = os.path.expandvars(v.decode(sys.getfilesystemencoding())).encode(sys.getfilesystemencoding())&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Это должно помочь.&lt;/p&gt;
&lt;p&gt;Чтобы сэкономить время, можешь установить плагин SublimeOnSaveBuild, и тогда компиляция будет происходить сразу после сохранения (по нажатию ctrl+S).&lt;/p&gt;
&lt;p&gt;Для подсветки синтаксиса sass/scss файлов установи плагины в Sublime, которые так и называются SASS и SCSS, или другие, в названии которых содержится highlight.&lt;/p&gt;
&lt;p&gt;Если тебе когда-нибудь понадобится обновить SASS, просто набери в командной строке «gem update sass».&lt;/p&gt;
</description>
<pubDate>Tue, 29 Apr 2014 18:58:52 +0400</pubDate>
</item>

<item>
<title>Как сверстать стрелку без картинок</title>
<guid isPermaLink="true">https://blog.toliklunev.ru/all/kak-sverstat-strelku-bez-kartinok/</guid>
<link>https://blog.toliklunev.ru/all/kak-sverstat-strelku-bez-kartinok/</link>
<comments>https://blog.toliklunev.ru/all/kak-sverstat-strelku-bez-kartinok/</comments>
<description>&lt;p&gt;Прочитав эту заметку, вы узнайте как сверстать вот такую симпатичную стрелочку:&lt;/p&gt;
&lt;iframe width="400" height="160" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/0/show/light/"&gt;&lt;/iframe&gt;
&lt;h2&gt;«Рисуем» треугольники&lt;/h2&gt;
&lt;p&gt;Возьмём обычный бокс с бордером, для наглядности раскрасив стороны в разные цвета:&lt;/p&gt;
&lt;iframe width="215" height="260" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/1/show/"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;.box{
	border-style: solid;
	border-top-color: blue;
	border-right-color: green;
	border-bottom-color: yellow;
	border-left-color: red;
}&lt;/code&gt;&lt;/pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;box&amp;quot; style=&amp;quot;width: 200px; height: 200px; border-width: 2px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;А теперь увеличим размер бордеров, одновременно уменьшив бокс:&lt;/p&gt;
&lt;iframe width="215" height="260" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/3/show/"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;box&amp;quot; style=&amp;quot;width: 100px; height: 100px; border-width: 52px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Убёрем высоту и ширину совсем:&lt;/p&gt;
&lt;iframe width="215" height="260" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/4/show/"&gt;&lt;/iframe&gt;
&lt;pre class="code"&gt;&lt;code data-language="html"&gt;&lt;div class="box" style="width: 0; height: 0; border-width: 102px"&gt;&lt;/div&gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Треугольники готовы.&lt;/p&gt;
&lt;h2&gt;«Рисуем» стрелку&lt;/h2&gt;
&lt;p&gt;Заготовка:&lt;/p&gt;
&lt;iframe width="215" height="80" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/5/show/"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;.arrow{
	position: relative;
	background: #09F;
	display: inline-block;
	width: 200px;
	padding: 5px;
	color: #FFF;
}&lt;/code&gt;&lt;/pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;arrow&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Добавим знакомые нам треугольники, с помощью псевдоэлемента :after, раскрасив все в один цвет, и сделав прозрачным левый бордер:&lt;/p&gt;
&lt;iframe width="210" height="260" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/6/show/"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;.arrow:after{
	width: 0;
	height: 0;
	position: absolute;
	top: 0;
	right: 0;
	border: 100px solid red;
	border-left-color: transparent;
	z-index: 10;
	content: &amp;quot;&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Хитрым образом спозиционируем псевдоэлемент:&lt;/p&gt;
&lt;iframe width="315" height="265" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/7/show/"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;/* добавляем */
.arrow:after{
	top: 50%;
	right: -100px;
	margin-top: -100px;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Скроем выступы и покрасим бордеры в цвет фона:&lt;/p&gt;
&lt;iframe width="210" height="85" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/8/show/"&gt;&lt;/iframe&gt;
&lt;iframe width="210" height="85" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/9/show/"&gt;&lt;/iframe&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;/* добавляем */
.arrow{
	overflow: hidden;
}

.arrow:after{
	border-color: #FFF;
	border-left-color: transparent;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Стрелка готова, для крутости можно добавить градиент:&lt;/p&gt;
&lt;iframe width="210" height="85" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/10/show/"&gt;&lt;/iframe&gt;
&lt;p&gt;У метода есть 2 недостатка:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;фон должен быть однородным,&lt;/li&gt;
&lt;li&gt;по-настоящему многострочную стрелку сделать не получиться, потому-что&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe width="210" height="140" frameborder="0" src="https://fiddle.jshell.net/codefucker/5J6t3/11/show/"&gt;&lt;/iframe&gt;
&lt;p&gt;но вполне возможно подобрать значение правого паддинга для 2-3 строк&lt;/p&gt;
</description>
<pubDate>Sun, 16 Sep 2012 23:37:27 +0400</pubDate>
</item>


</channel>
</rss>