<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SimpleCoding.org &#187; CSS</title>
	<atom:link href="http://www.simplecoding.org/category/cs/feed" rel="self" type="application/rss+xml" />
	<link>http://www.simplecoding.org</link>
	<description>Блог о программировании</description>
	<lastBuildDate>Fri, 27 Jan 2012 18:27:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>CSS: оформление скроллбара в стиле Gmail</title>
		<link>http://www.simplecoding.org/css-oformlenie-skrollbara-v-stile-gmail.html</link>
		<comments>http://www.simplecoding.org/css-oformlenie-skrollbara-v-stile-gmail.html#comments</comments>
		<pubDate>Sat, 14 Jan 2012 19:30:05 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web дизайн]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1252</guid>
		<description><![CDATA[Сегодня мы рассмотрим небольшой пример оформления скроллбара для браузеров на движке WebKit (Chrome, Safari). Сразу хочу сказать, что я не сторонник изменения внешнего вида скролла, всё-таки это стандартный элемент управления и большинство пользователей привыкли к его виду. Злоупотребление возможностью его изменения может усложнить работу с сайтом. Тем не менее, в некоторых случаях создание собственного дизайна [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1253" class="wp-caption alignnone" style="width: 230px"><img src="http://www.simplecoding.org/wp-content/uploads/2012/01/gmail-scroll.png" alt="gmail scrollbar" title="gmail scrollbar" width="220" height="208" class="size-full wp-image-1253" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Сегодня мы рассмотрим небольшой пример <strong>оформления скроллбара для браузеров на движке WebKit</strong> (Chrome, Safari).</p>
<p>Сразу хочу сказать, что я не сторонник изменения внешнего вида скролла, всё-таки это стандартный элемент управления и большинство пользователей привыкли к его виду. Злоупотребление возможностью его изменения может усложнить работу с сайтом.</p>
<p>Тем не менее, в некоторых случаях создание собственного дизайна для скроллбара полностью оправдано. Возьмем в качестве примера структуру страницы Gmail.<br />
<span id="more-1252"></span></p>
<div id="attachment_1254" class="wp-caption alignnone" style="width: 460px"><img src="http://www.simplecoding.org/wp-content/uploads/2012/01/gmail-window.png" alt="gmail-window" title="gmail-window" width="450" height="327" class="size-full wp-image-1254" /><p class="wp-caption-text"> </p></div>
<p>Видите, скроллбар находится внутри страницы, т.е. логично, что его внешний вид должен соответствовать дизайну всей страницы. Ведь во многих случаях в web интерфейсах используется нестандартное оформление кнопок, чекбоксов, ползунков и других элементов управления.</p>
<h2>Теперь рассмотрим, каким образом можно изменить внешний вид скролла</h2>
<p>Движок WebKit поддерживает несколько CSS псевдоклассов, которые определяют оформление различных областей скроллбара. Взгляните на следующий рисунок.</p>
<div id="attachment_1255" class="wp-caption alignnone" style="width: 460px"><img src="http://www.simplecoding.org/wp-content/uploads/2012/01/scroll-default.png" alt="scroll-default" title="scroll-default" width="450" height="204" class="size-full wp-image-1255" /><p class="wp-caption-text"> </p></div>
<p>Как видите, все псевдоклассы имеют префикс <code>-webkit-</code>.<br />
Кроме перечисленных на картинке, есть ещё два псевдокласса:<br />
<code>::-webkit-scrollbar-corner</code> – отвечает за оформление квадрата в месте соприкосновения вертикального и горизонтального скролла;<br />
<code>::-webkit-resizer</code> – используется для скроллбаров текстовой области, размеры которой можно изменять.</p>
<p>Также, вместе с этими классами можно использовать различные псевдоэлементы.</p>
<p>Обычные <code>:enabled</code>, <code>:disabled</code>, <code>:hover</code> и <code>:active</code> и специальные:</p>
<p><code>:horizontal</code> – применяется для частей скроллбара, которые расположены горизонтально;</p>
<p><code>:vertical</code> – применяется для частей скроллбара, которые расположены вертикально;</p>
<p><code>:decrement</code> – применяется к участкам полосы прокрутки и кнопкам при перемещении окна просмотра вверх или влево;</p>
<p><code>:increment</code> – применяется к участкам полосы прокрутки и кнопкам при перемещении окна просмотра вниз или вправо;</p>
<p><code>:start</code> – применяется к кнопкам и участкам полосы прокрутки. Показывает находится ли объект выше (левее) ползунка;</p>
<p><code>:end</code> – применяется к кнопкам и участкам полосы прокрутки. Показывает находится ли объект ниже (правее) ползунка;</p>
<p><code>:double-button</code> – применяется к кнопкам и участкам полосы прокрутки. Используется для того, чтобы определить, является ли кнопка частью двойной кнопки, расположенной на одном из концов полосы прокрутки. Для полосы прокрутки этот псевдокласс показывает граничит ли она с двойной кнопкой;</p>
<p><code>:single-button</code> – применяется к кнопкам и участкам полосы прокрутки. Используется для того, чтобы определить, является ли кнопка одинарной. Для полосы прокрутки этот псевдокласс показывает граничит ли она с одинарной кнопкой;</p>
<p><code>:no-button</code> – применяется к участкам полосы прокрутки и показывает, касается ли она края скроллбара (например, если нет кнопок на краях скроллбара);</p>
<p><code>:corner-present</code> – применяется к участкам полосы прокрутки и показывает, присутствует ли угловая область скроллбара (квадрат на стыке горизонтального и вертикального скроллбаров);</p>
<p><code>:window-inactive</code> – применяется ко всем элементам скроллбара и показывает является ли окно к которому относится данный скроллбар активным.</p>
<h2>Переходим к нашему примеру</h2>
<p>В скроллбаре, который используется в Gmail, нет кнопок вверх-вниз, а ползунок представляет собой обычный прямоугольник серого цвета. При наведении курсора на скроллбар, подсвечивается полоса прокрутки.</p>
<div id="attachment_1256" class="wp-caption alignnone" style="width: 26px"><img src="http://www.simplecoding.org/wp-content/uploads/2012/01/gmail-like-scroll.png" alt="gmail-like-scroll" title="gmail-like-scroll" width="16" height="101" class="size-full wp-image-1256" /><p class="wp-caption-text"> </p></div>
<p><strong>Займёмся оформлением.</strong></p>
<p>Для начала, зададим общую ширину скроллбара:</p>
<pre class="brush: css; gutter: true; first-line: 1; highlight: []; html-script: false">::-webkit-scrollbar{
    width:12px;
}</pre>
<p>Теперь займёмся оформлением полосы прокрутки (светлосерый фон, серая граница, делаем границу чуть толще с левой стороны):</p>
<pre class="brush: css; gutter: true; first-line: 1; highlight: []; html-script: false">::-webkit-scrollbar-thumb{
    border-width:1px 1px 1px 2px;
    border-color: #777;
    background-color: #aaa;
}</pre>
<p>При наведении курсора (<code>:hover</code>) на полосу прокрутки делаем её более тёмной:</p>
<pre class="brush: css; gutter: true; first-line: 1; highlight: []; html-script: false">::-webkit-scrollbar-thumb:hover{
    border-width: 1px 1px 1px 2px;
    border-color: #555;
    background-color: #777;
}</pre>
<p>Ползунок в неактивном состоянии будет выглядеть как сплошной прямоугольник серого цвета (без границы)</p>
<pre class="brush: css; gutter: true; first-line: 1; highlight: []; html-script: false">::-webkit-scrollbar-track{
    border-width:0;
}</pre>
<p>При наведении курсора на ползунок, делаем его темнее и добавляем границу.</p>
<pre class="brush: css; gutter: true; first-line: 1; highlight: []; html-script: false">::-webkit-scrollbar-track:hover{
    border-left: solid 1px #aaa;
    background-color: #eee;
}</pre>
<p>Как видите, используя обычные CSS правила можно изменить скроллбар до неузнаваемости <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Успехов!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/css-oformlenie-skrollbara-v-stile-gmail.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JavaScript виджет: бесконечная загрузка твитов</title>
		<link>http://www.simplecoding.org/javascript-vidzhet-beskonechnaya-zagruzka-tvitov.html</link>
		<comments>http://www.simplecoding.org/javascript-vidzhet-beskonechnaya-zagruzka-tvitov.html#comments</comments>
		<pubDate>Tue, 05 Apr 2011 18:59:36 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1200</guid>
		<description><![CDATA[В последнее время я часто замечаю на различных сайтах виджеты, которые подгружают контент при определённых действиях посетителя. Такой подход позволяет с одной стороны, сократить количество данных на странице, а с другой – при необходимости показывать практически неограниченный объем информации. Рассмотрим небольшой практический пример. Допустим, мы хотим показать в сайдбаре виджет с твитами из какой-нибудь ленты [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1201" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/04/load_on_scroll.png" alt="load on scroll" title="load on scroll" width="300" height="243" style="float:left" class="size-full wp-image-1201" /><p class="wp-caption-text"> </p></div>
<p>В последнее время я часто замечаю на различных сайтах виджеты, которые подгружают контент при определённых действиях посетителя. Такой подход позволяет с одной стороны, сократить количество данных на странице, а с другой – при необходимости показывать практически неограниченный объем информации.</p>
<p>Рассмотрим небольшой практический пример.</p>
<p>Допустим, мы хотим показать в сайдбаре <em>виджет с твитами</em> из какой-нибудь ленты (естественно, существует множество готовых решений, но сейчас не о них речь, кроме того, данное решение можно использовать для загрузки любого контента).</p>
<p>На первый взгляд всё предельно просто, twitter предоставляет <a href="http://dev.twitter.com/doc/get/statuses/user_timeline">API</a>, с помощью которого можно получить твиты любого пользователя (если они открыты). Вставить их сайдбар тоже не проблема.</p>
<p>Но на практике возникает <strong>несколько интересных моментов</strong>.<br />
<span id="more-1200"></span><br />
1) Информация от <strong>twitter</strong> не является основным контентом сайта и не должна влиять на скорость загрузки страницы. Кроме того, доступность сервиса также не должна влиять на работу сайта.</p>
<p>2) Твиты могут появляться довольно быстро, поэтому чтобы информация в виджете была всегда актуальной от кеширования придётся отказаться.</p>
<p>3) Т.к. твиты не являются основным содержимым страницы, то посетитель скорее всего не заметит если они появятся через некоторое время после загрузки основной части страницы.</p>
<p>4) Не ясно, сколько именно твитов нужно выводить. Части посетителей эта информация будет не интересна вообще, но пользователи этого сервиса, возможно, захотят прочитать несколько десятков сообщений.</p>
<p>5) Количество места, выделенного под виджет, обычно ограничено. И необходимо чтобы загрузка новых твитов не «ломала» дизайн.</p>
<p>Таким образом, нам нужно загружать твиты после загрузки страницы и желательно, чтобы от посетителя требовался минимум действий для загрузки новых твитов.</p>
<p><strong>Теперь рассмотрим сам виджет.</strong></p>
<p>Начнём с алгоритма.</p>
<p>1) Создаём на странице область с фиксированной высотой и вертикальным полосой прокрутки.</p>
<p>2) После загрузки страницы подгружаем в эту область твиты с помощью JavaScript.</p>
<p>3) Если пользователь переместит ползунок скролла в крайнее нижнее положение – загружаем следующую «порцию» твитов.</p>
<p>Посмотреть как работает такой виджет можно на демонстрационной страничке. И сразу же даю ссылку на архив с этим примером.</p>
<p><a href="http://demosites.simplecoding.org/infinite-scroll/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a> <a href='http://www.simplecoding.org/wp-content/uploads/2011/04/infinite_scroll.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Разметка виджета с твитами может выглядеть следующим образом.</p>
<pre class="brush: html">&lt;div id="tweets"&gt;
    &lt;div class="loader hidden"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p>Как видите, после первоначальной загрузки внутри виджета будет находится только один элемент – картинка с изображением загрузчика. Стили для неё мы установим таким образом, чтобы она всегда находилась в центре виджета.</p>
<pre class="brush: css">.loader {
    background-image: url('ajax-loader.gif');
    width: 400px;
    height: 300px;
    background-repeat: no-repeat;
    background-position: center center;
    position: fixed;
}</pre>
<p>Значения <code>width</code> и <code>height</code> должны совпадать с соответствующими значениями, установленными для виджета (div#tweets).</p>
<pre class="brush: css">#tweets {
    height: 300px;
    width: 400px;
    overflow: auto;
    position: relative;
    border: solid 1px #999;
    margin: 3em auto 0 auto;
}</pre>
<p><strong>Переходим к загрузке твитов</strong></p>
<p>Основная сложность заключается в том, что нам нужно с помощью JavaScript выполнить кросс-доменный запрос к серверу twitter’а. Такие запросы запрещены политикой безопасности браузеров, поэтому использовать обычный AJAX запрос не получится.</p>
<p>Тем не менее, благодаря тому, что <strong>Twitter API</strong> поддерживает <strong>JSONP</strong> задача решается достаточно просто.</p>
<pre class="brush: javascript">$(function() {
    //параметры для получения твитов
    var user_id = '24147920';
    var tweets_url = 'http://api.twitter.com/1/statuses/user_timeline.json';
    var page = 1;
    var tweets_num = 10;

    //список твитов и картинка загрузчика
    var container = $('#tweets');
    var loader = $('.loader');

    //шаблон для поиска ссылок в твитах (упрощенный)
    var pattern = /(http\S+)/gi;

    //загружаем первую страницу твитов
    get_tweets(page);

    //обработчик события scroll
    container.scroll(function() {
        //это условие выполняется когда ползунок находится в крайнем нижнем положении
        if  (container[0].scrollTop == container[0].scrollHeight - container[0].clientHeight){
            //показываем загрузчик
            loader.removeClass('hidden');
            //загружаем очередную страницу твитов
            page = page + 1;
            get_tweets(page);
        }
    });

    //эта функция загружает твиты, ищет ссылки и ставит для них
    //соответствующий тег &lt;a href="..."&gt;, вставляет твиты в список
    function get_tweets(page) {
        $.getJSON(
            //формируем запрос на получение твитов (используется JSONP)
            tweets_url + '?user_id=' + user_id + '&#038;page=' + page + '&#038;count=' + tweets_num + '&#038;callback=?',
            function(data) {
                $(data).each(function(i, tweet) {
                    //формируем ссылки
                    var text = tweet.text.replace(pattern, '&lt;a href="$1" target="_blank"&gt;$1&lt;/a&gt;');
                    //вставляем твит в список
                    container.append('&lt;div class="tweet"&gt;' + text + '&lt;/div&gt;');
                });
                //прячем загрузчик
                loader.addClass('hidden');
            }
        );
    }
});</pre>
<p>Прежде всего, мы подготавливаем данные, которые нужны для работы с Twitter API (строки 3-6). Для данного примера я использовал свою собственную ленту твитов, но вы можете вывести любую другую. Также не принципиально сколько твитов загружать за раз, главное, чтобы после первоначальной загрузки появилась полоса прокрутки.</p>
<p>Для получения твитов используем метод <code>getJSON</code> (строки 33-46, библиотека jQuery).</p>
<p>В первом её параметре передаём запрос на получение твитов. В него мы включаем:<br />
- id пользователя (<code>'?user_id=' + user_id</code>);<br />
- номер страницы (<code>'&#038;page=' + page</code>);<br />
- количество твитов на странице (<code>'&#038;count=' + tweets_num</code>);<br />
- имя функции, которая будет вызвана после получения данных (<code>'&#038;callback=?'</code>) – его jQuery формирует автоматически и подставляет вместо знака вопроса.</p>
<p>После получения твитов нам остается только добавить их в список (строки 36-42). При этом, мы ищем ссылки в тексте твитов и обрамляем их тегом <code>&lt;a&gt;</code>.</p>
<p>Завершающий этап – установка обработчика для события <code>scroll</code> (строки 19-28).</p>
<p>Здесь нужно только проверить достигнут конец списка или нет. Если достигнут, показываем загрузчик (убираем класс <code>hidden</code>) и вызываем функцию <code>get_tweets</code>, которой передаём номер нужно страницы. В противном случае, не делаем ничего.</p>
<p>Всё. Можно считать, что виджет в рабочем состоянии. Конечно, перед размещением на рабочем сайте нужно будет его немного доработать, например, добавить вывод сообщение об ошибке при отсутствии доступа к twitter&#039;у. Но, думаю, с этой задачей вы легко справитесь сами <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Успехов!</strong></p>
<p><em>Интересное</em></p>
<p>Глянцевая и матовая <a href="http://imagebook.ru/">печать фотокниг</a> и свадебных фотоальбомов</p>
<p>Любителям страйкбола будет интересно почитать про <a href="http://battleteam.ru/viewtopic.php?t=74">камуфляж Горка</a> его расцветки и разновидности.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/javascript-vidzhet-beskonechnaya-zagruzka-tvitov.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Небольшой эксперимент с использованием data: URL</title>
		<link>http://www.simplecoding.org/nebolshoj-eksperiment-s-ispolzovaniem-data-url.html</link>
		<comments>http://www.simplecoding.org/nebolshoj-eksperiment-s-ispolzovaniem-data-url.html#comments</comments>
		<pubDate>Mon, 21 Mar 2011 08:52:15 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1196</guid>
		<description><![CDATA[В последнее время всё больше внимания уделяется клиентской оптимизации сайтов. Я не могу сказать, что раньше ею никто не занимался, скорее, наоборот, с появлением широкополосного доступа к Internet часть проблем решилась сама собой. Но появление новых технологий, предоставляет новые возможности, которыми имеет смысл пользоваться. К сожалению, не всегда есть возможность проигнорировать устаревшие браузеры (главным образом [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1197" class="wp-caption alignnone" style="width: 300px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/03/data_uri.png" alt="data uri" title="data uri" width="290" height="255" class="size-full wp-image-1197" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>В последнее время всё больше внимания уделяется <strong>клиентской оптимизации сайтов</strong>. Я не могу сказать, что раньше ею никто не занимался, скорее, наоборот, с появлением широкополосного доступа к Internet часть проблем решилась сама собой. Но появление новых технологий, предоставляет новые возможности, которыми имеет смысл пользоваться.</p>
<p>К сожалению, не всегда есть возможность проигнорировать устаревшие браузеры (главным образом речь идет о IE6 и 7). И это сильно замедляет использование новых стандартов.</p>
<p>Ситуация довольно сложная. Большинство владельцев ресурсов не согласятся потерять часть аудитории (пусть даже небольшую) только потому, что разработчик решил внедрить новую технологию. Но не все понимают, что использование устаревших технологий делает менее комфортной работу посетителей с нормальными браузерами. В частности, время загрузки страницы для них окажется больше, чем могло бы быть.</p>
<p>Поэтому оптимальным решением было бы автоматическое переключение технологий в зависимости от возможностей браузера.</p>
<p>Об одной из таких технологий и пойдёт речь в этой статье. Называется она <strong>data: URL</strong>.<br />
<span id="more-1196"></span></p>
<p><a href="http://ru.wikipedia.org/wiki/Data:_URL">data:URL</a> представляет собой схему, позволяющую включать произвольные данные непосредственно в строку URL. Т.е. можно разместить небольшие картинки, которые используются для оформления страницы, прямо в файл стилей и, тем самым, уменьшить количество запросов к серверу.</p>
<p>Для себя задачу я ставил достаточно просто. Проверить, насколько сложно будет обеспечить одинаковый вид страницы во всех браузерах, начиная с IE6.</p>
<p>Сразу выкладываю ссылку на архив с примером, который я использовал для экспериментов.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2011/03/data_url.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<h2>Рассмотрим тестовую страницу</h2>
<pre class="brush: html">&lt;!DOCTYPE html&gt;

&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;CSS clip&lt;/title&gt;
    &lt;meta charset="utf-8" /&gt;
&lt;/head&gt;

&lt;body&gt;

&lt;div id="social_icons"&gt;
    &lt;a href="#" class="twitter icon"&gt;&lt;/a&gt;
    &lt;a href="#" class="facebook icon"&gt;&lt;/a&gt;
    &lt;a href="#" class="bobrdobr icon"&gt;&lt;/a&gt;
    &lt;a href="#" class="memori icon"&gt;&lt;/a&gt;
    &lt;a href="#" class="delicious icon"&gt;&lt;/a&gt;
    &lt;a href="#" class="stumbleupon icon"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Она содержит шесть ссылок, которые нужно показать в виде иконок на социальные сервисы.</p>
<p>Делается это достаточно просто. Для каждой ссылки задаётся ширина, высота и фоновое изображение (иконка).</p>
<p>При этом браузер загрузит каждый файл, который будет указан в свойстве <code>background-image</code>. Т.е. если у нас шесть иконок, то будет отправлено шесть запросов серверу. Учитывая, что размеры иконок редко превышают несколько кБ, загружать их по одной не выгодно.</p>
<p>Наиболее распространённым методом оптимизации в таких случаях является использование <strong>CSS спрайтов</strong>. При этом все картинки объединяются в одну, а нужный фрагмент показывают с помощью свойства <code>background-position</code>.</p>
<p>Именно этот вариант я решил использовать для браузеров IE6 и 7, а для новых – передать иконки с помощью <code>data: URL</code>.</p>
<h2>Подготовка данных для использования в data: URL</h2>
<p>Тут всё достаточно просто. Нужно закодировать содержимое файла с картинкой с помощью base64 и вставить полученную строку в CSS файл.</p>
<p>В моем случае, исходное изображение выглядит следующим образом.</p>
<div id="attachment_1198" class="wp-caption alignnone" style="width: 74px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/03/icons_sprites.png" alt="icons sprites" title="icons sprites" width="64" height="384" class="size-full wp-image-1198" /><p class="wp-caption-text"> </p></div>
<p><em>Примечание</em>. Я использовал коллекцию бесплатных иконок от <a href="http://www.wpzoom.com/wpzoom/500-free-icons-wpzoom-social-networking-icon-set/">wpzoom</a>.</p>
<p>На практике можно воспользоваться одним из сервисов, выполняющих эту операцию. Например, <a href="http://duris.ru/">duris.ru</a> или <a href="http://www.dopiaza.org/tools/datauri/">dopiaza.org</a>.</p>
<p>В результате у меня получилась такая таблица стилей.</p>
<pre class="brush: css">@charset 'utf-8';

.icon {
	width: 64px;
	height: 64px;
	display: block;
	float: left;
	margin: 10px;
}

div#social_icons a {
	background-image: url("data:image/png;base64,iVBORw......");
	background-repeat:no-repeat;
}
.twitter {
	background-position: 0 0;
}
.facebook {
	background-position: 0 -64px;
}
.bobrdobr {
	background-position: 0 -128px;
}
.memori {
	background-position: 0 -192px;
}
.delicious {
	background-position: 0 -256px;
}
.stumbleupon {
	background-position: 0 -322px;
}</pre>
<p><em>Обратите внимание</em>. Здесь не важно кодируете вы один файл со всеми иконками или каждую отдельно. Все данные будут переданы внутри CSS файла.</p>
<p><em>Рассмотрим стили подробнее</em>.</p>
<p>Для каждой ссылки мы указываем высоту (<code>width</code>) и ширину (<code>height</code>). При этом, нужно сделать ссылку блоковым элементом (<code>display: block</code>), иначе длина и высота применятся не будут. Чтобы расположить иконки в один ряд, используем обтекание (<code>float: left</code>).</p>
<p>Далее каждой ссылке устанавливаем фоновое изображение (<code>background-image</code>). В качестве значения <code>url</code> вставляем результат преобразования картинки. Я его сократил, т.к. он занимает около 19 кБ.</p>
<p>Затем с помощью <code>background-position</code> показываем нужный фрагмент картинки. В данном случае все иконки имеют размер 64х64 px и расположены вертикально, поэтому просто изменяем вертикальную координату на 64 px.</p>
<p>Остаётся подключить файл стилей к странице.</p>
<pre class="brush: html">&lt;link rel="stylesheet" type="text/css" href="styles.css" /&gt;</pre>
<p>Всё. В современных браузерах иконки отображаются правильно.</p>
<p>Для формирования страницы браузер выполняет <strong>два</strong> запроса к серверу. Первый – получение самой страницы, второй – получения файла стилей. При этом, файл стилей занимает 19,1 кБ (если его сжать, получится 14,4 кБ).</p>
<h2>Поддержка IE6 и 7</h2>
<p>Есть несколько вариантов решения этой задачи. Подробно они рассмотрены в статье <a href="http://webo.in/articles/habrahabr/46-cross-browser-data-url/">Кроссбраузерное использование data:URL</a>.</p>
<p>Я покажу один из самых простых вариантов, с заменой файла стилей.</p>
<p>Идея предельно простая. С помощью условных комментариев, браузерам IE6 и 7 указываем свой собственный CSS файл.</p>
<p>Выглядит это следующим образом.</p>
<pre class="brush: html">&lt;!--[if lt IE 8]&gt;&lt;link rel="stylesheet" type="text/css" href="ie_6_7_styles.css" /&gt;&lt;![endif]--&gt;
&lt;!--[if gte IE 8]&gt;&lt;link rel="stylesheet" type="text/css" href="styles.css" /&gt;&lt;![endif]--&gt;
&lt;!--[if !IE]&gt;--&gt;&lt;link rel="stylesheet" type="text/css" href="styles.css" /&gt;&lt;!--&lt;![endif]--&gt;</pre>
<p>В результате, современные браузеры загрузят файл <code>styles.css</code>, а шестая и седьмая версии IE – <code>ie_6_7_styles.css</code>.</p>
<p>В этих стилях отличается только свойство <code>background-image</code>. Вместо <code>data:URL</code> указываем файл с иконками.</p>
<pre class="brush: css">div#social_icons a {
    background-image: url("icons/icons_sprites.png");
    background-repeat:no-repeat;
}</pre>
<p>Теперь во всех браузерах иконки отображаются одинаково.</p>
<h2>Результаты</h2>
<p>Должен отметить, что в данном случае, результаты получились не очень впечатляющие.</p>
<p>Безусловно, при использовании <code>data: URL</code> количество запросов уменьшилось (на один), но объём передаваемых данных увеличился практически на 5 кБ (исходный файл <code>icons_sprites.png</code> «весит» 13,9 кБ, а после base64 преобразования он занимает около 19 кБ).</p>
<p>Т.е. получается, что если фоновые изображения хорошо укладываются в CSS спрайты, то эффект от применения <code>data: URL</code> будет минимальным. Точнее, в некоторых случаях можно получить полностью противоположный эффект, т.к. время загрузки файла со стилями увеличится, и посетитель будет какое-то время смотреть на страницу без стилей вообще.</p>
<p>Кроме того, усложняется процесс обновления картинок, т.к. они будут кешироваться вместе с CSS файлом. (Эта проблема решаемая, но выходит за рамки данной статьи).</p>
<p>С другой стороны, в этой статье рассмотрен очень простой пример. Для сложного сайта файлов со спрайтами может получиться довольно много и в этом случае эффект от использования data: URL будет выше за счёт уменьшения количества запросов.</p>
<p>К тому же, если бы не нужна была поддержка IE6, 7, то можно было бы вообще не заниматься созданием файла со спрайтами и установкой <code>background-position</code>, а просто передавать изображения в <code>background-image</code> для соответствующих элементов.</p>
<p>В целом, я не уверен, что в ближайшее время начнется массовое использование <code>data: URL</code>. Тем не менее, технология очень интересная.</p>
<p><strong>Успехов!</strong></p>
<p><strong>Интересно почитать</strong></p>
<p>Хотите сделать карьеру в IT? <a href="http://it-centre.net">Курсы программистов</a> будут хорошей стартовой точкой.</p>
<p>Нужна декларация <a href="http://online-nalogi.ru/3_ndfl_prodazha_kvartiry"> 3-ндфл «продажа квартиры»</a>? Заполним за сутки и вышлем на емейл.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/nebolshoj-eksperiment-s-ispolzovaniem-data-url.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Galleria &#8211; плагин для создания галерей с картинками</title>
		<link>http://www.simplecoding.org/galleria-plagin-dlya-sozdaniya-galerej-s-kartinkami.html</link>
		<comments>http://www.simplecoding.org/galleria-plagin-dlya-sozdaniya-galerej-s-kartinkami.html#comments</comments>
		<pubDate>Mon, 07 Mar 2011 21:09:17 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1188</guid>
		<description><![CDATA[Количество различных JavaScript плагинов для просмотра картинок на сегодняшний день просто огромно. И если вы начнете читать их обзоры, то на выбор подходящего решения может уйти гораздо больше времени чем на подключение и настройку самого плагина. Кроме того, несмотря на все разнообразие, часто не удаётся найти идеально подходящего варианта. В каких-то случаях ограничены возможности оформления [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1189" class="wp-caption alignnone" style="width: 245px"><img src="http://www.simplecoding.org/wp-content/uploads/2011/03/galleria.jpg" alt="galleria" title="galleria" width="235" height="149" class="size-full wp-image-1189" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Количество различных <strong>JavaScript плагинов для просмотра картинок</strong> на сегодняшний день просто огромно. И если вы начнете читать их обзоры, то на выбор подходящего решения может уйти гораздо больше времени чем на подключение и настройку самого плагина.</p>
<p>Кроме того, несмотря на все разнообразие, часто не удаётся найти <em>идеально</em> подходящего варианта. В каких-то случаях ограничены возможности оформления (нельзя изменить разметку), в каких-то нет подходящих опций или нет возможности вывести вместе с рисунком дополнительную информацию. В общем, подогнать галерею под конкретный сайт бывает непросто.</p>
<p>Можно, конечно, написать собственную реализацию такого плагина, но это процесс трудоемкий (если делать качественно) и, скорее всего, код процентов на 90 будет повторять то, что есть в других плагинах.</p>
<p>В таких случаях гораздо предпочтительнее использовать фреймворки. Об одном из них и пойдет речь в этой статье.<br />
<span id="more-1188"></span><br />
Фреймворк называется <a href="http://galleria.aino.se/">Galleria</a> и представляет собой плагин для библиотеки <strong>jQuery</strong>.</p>
<p>Его основными преимуществами являются <strong>поддержка тем оформления</strong>, <strong>собственный API</strong> и <strong>большое количество настроек</strong>.</p>
<p>Подключить <strong>Galleria</strong> не сложнее чем любой другой плагин, но внешний вид галереи будет зависеть от используемой темы.</p>
<p>Чтобы получить более полное представление о фреймворке рассмотрим небольшой пример, который включает создание собственной темы и использование нескольких очень полезных возможностей Galleria.</p>
<p><em>Примечание</em>. Эта статья ни в коем случае не заменяет <a href="http://galleria.aino.se/docs/1.2/">официальную документацию</a> и не содержит описание всех возможностей фреймворка. С другой стороны, некоторые вопросы интеграции фреймворка со страницей здесь рассмотрены более подробно.</p>
<h2>Постановка задачи</h2>
<p>Допустим, у нас есть сайт на котором мы хотим показывать галерею. При этом, в галерее необходимо показать рисунки для которых нет миниатюр на страницах (возможно, мы хотим разместить ссылку на галерею в сайдбаре и показывать какую-то заранее определенную группу картинок). Кроме того, для каждого рисунка есть несколько блоков дополнительной информации, которую необходимо показать рядом с рисунком.</p>
<p>Т.е. должно получиться примерно следующий результат.</p>
<p><a href="http://demosites.simplecoding.org/galleria/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a></p>
<p>Если интересно, можете скачать архив с этим примером.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2011/03/galleria.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Теперь рассмотрим как решается эта задача с помощью Galleria.</p>
<h2>Подключаем фреймворк.</h2>
<p>На страницу добавляем блок для галереи и ссылку с помощью которой будем эту галерею открывать.</p>
<pre class="brush: html">&lt;div id="content"&gt;
    &lt;a href="#" id="openGallery"&gt;Открыть галерею&lt;/a&gt;
    &lt;div id="gallery"&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p>После этого распаковываем архив с фреймворком в папку galleria и подключаем 3 JS-файла.</p>
<pre class="brush: html">&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"&gt;&lt;/script&gt;
&lt;script src="galleria/galleria-1.2.2.min.js"&gt;&lt;/script&gt;
&lt;script src="init.js"&gt;&lt;/script&gt;</pre>
<p>Здесь все как обычно. Сначала загружаем jQuery, затем плагин Galleria и скрипт init.js (он выполняет подключение и настройку галереи).</p>
<h2>Подготовка данных для галереи</h2>
<p>В нашем случае миниатюр картинок на странице нет, поэтому фреймворку необходимо каким-то образом передать информацию о них. Для этого создадим JS объект с их данными.</p>
<pre class="brush: javascript">
    var images = [
        {
            image: 'images/spring_1.jpg',
            thumb: 'images/spring_1t.jpg',
            title: 'Первая картинка',
            description: 'Описание первой картинки',
            size: '450x338',
            link: 'images/spring_1.jpg'
        },
        {
            image: 'images/spring_2.jpg',
            thumb: 'images/spring_2t.jpg',
            title: 'Вторая картинка',
            description: 'Описание второй картинки',
            size: '450x360',
            link: 'images/spring_2.jpg'
        },
...
    ];
</pre>
<p>Думаю, несложно догадаться почему разработчиками выбран именно такой вариант передачи данных. Если вы получаете данные от сервера в <strong>JSON</strong> формате, то получить такой объект можно с помощью одного вызова функции <code>eval</code>.</p>
<p><em>Обратите внимание!</em> Не все поля в этой структуре обязательные, вы можете добавлять сколько угодно своих собственных полей с данными. В минимальном варианте для работы плагина необходимо поле <code>image</code> и, если вы хотите показать слайдер с миниатюрами картинок – <code>thumb</code>.</p>
<p>Теперь подключаем галерею</p>
<pre class="brush: javascript">
    var gallery = $("#gallery");

    Galleria.loadTheme('galleria/themes/simplecoding/galleria.simplecoding.js');

    $('#openGallery').click(function() {
        $("#gallery").galleria({
            data_source: images,
            width: 800,
            height: 500,
            clicknext: true
        });
        return false;
    });
</pre>
<p>Перед подключением галереи необходимо загрузить тему. Её создание мы рассмотрим чуть ниже, сейчас только отметим, что для загрузки необходимо указать основной JS-файл темы.</p>
<p>Т.к. нам нужно чтобы галерея открывалась по клику на ссылке, устанавливаем соответствующий обработчик, и в нём вызываем метод <code>galleria</code> для блока в котором будет находится галерея (строка 6).</p>
<p>В параметрах этого метода передаём настройки галереи. Здесь:</p>
<p><code>data_source</code> – имя переменной в которой находятся данные рисунков;<br />
<code>width</code> и <code>height</code> – длина и ширина галереи;<br />
<code>clicknext</code> – если этот параметр равен <code>true</code>, то клик по картинке будет показывать следующую картинку (дублирует кнопку Next).</p>
<p>Вообще параметров довольно много, их полный список можно посмотреть <a href="http://galleria.aino.se/docs/1.2/options/">здесь</a>.</p>
<h2>Оформление галереи (создание собственной темы)</h2>
<p>Создать тему не сложно. В папке <code>galleria/themes/</code> создаёте папку с названием вашей темы (в данном случае &#8211; <code>simplecoding</code>). В этой папке должен находится основной файл темы &#8211; <code>galleria.simplecoding.js</code>.</p>
<p>Практически наверняка вы захотите добавить файл стилей и различные картинки и иконки для оформления галереи.</p>
<p>В качестве основы для данного примера я взял код из <a href="http://galleria.aino.se/docs/1.2/themes/creating_a_theme/">официальной документации</a>, а также картинки и стили из темы <code>classic</code>, которая поставляется вместе с плагином (стили, естественно, пришлось немного изменить и дополнить).</p>
<p>Рассмотрим основной скрипт &#8211; galleria.simplecoding.js</p>
<pre class="brush: javascript">(function($) {
Galleria.addTheme({
    name: 'simplecoding',
    author: 'Statsenko Vladimir, http://www.simplecoding.org',
    version: 1,
    css: 'galleria.simplecoding.css',
    defaults: {
        transition: 'fade',
        imagecrop: true,
        _my_color: 'black'
    },
    init: function(options) {

        //добавляем заголовок
		this.addElement('title');
		this.prependChild('container', 'title');

		//добавляем кнопку "Закрыть"
		this.addElement('close');
		this.prependChild('container', 'close');
		this.$('close').html('&lt;a href="#"&gt;&nbsp;&lt;/a&gt;');

        //добавляем поле для описания и размера картинки
		this.addElement('desc');
		this.appendChild('stage', 'desc');

        var overlay = $('&lt;div id="overlay"&gt;&lt;/div&gt;');
        overlay.add('.galleria-close').click(this.proxy(function(e) {
            this.$('container').toggleClass('hidden');
            overlay.toggleClass('hidden');
            e.stopPropagation();
            return false;
        }));

        this.$('container')
            .css('background-color', options._my_color)
            .parent().parent().append(overlay);

        // bind a loader animation:
        this.bind(Galleria.LOADSTART, function(e) {
            if (!e.cached) {
                this.$('loader').show();
            }
        });
        this.bind(Galleria.LOADFINISH, function(e) {
            this.$('loader').hide();
            var imageData = this.getData();
			this.$('title').html(imageData.title);
			this.$('desc').html(imageData.description + ' ' + imageData.size);
        });
    }
});
}(jQuery));</pre>
<p>Как видите, для создание темы используется метод <code>addTheme</code> (строка 2) в параметрах которого мы указываем её название, имя автора, имя файла стилей (строка 6), различные параметры и метод инициализации (параметр <code>init</code>, строка 12).</p>
<p>Именно в этом методе выполняется изменение разметки галереи, назначаются обработчики событий и т.п.</p>
<p>Рассмотрим этот метод подробнее.</p>
<p>Прежде всего, взгляните на <a href="http://galleria.aino.se/docs/1.2/references/dom/">разметку галереи</a>, которая создаётся по-умолчанию.</p>
<p>В нашем случае необходимо добавить название картинки и кнопку «Закрыть» над картинкой и текст с подробным описанием – под ней.</p>
<p>Поэтому мы добавляем 3 поля – <code>title</code>, <code>close</code> и <code>desc</code> (строки 14-25). При этом используются методы <code>addElement</code> (создает новый элемент), <code>prependChild</code> (вставляет новый элемент перед указанным элементом) и <code>appendChild</code> (вставляет новый элемент после указанного объекта).</p>
<p>В первом параметре методов <code>prependChild</code> и <code>appendChild</code> необходимо указать имя блока перед (после) которого нужно вставить новый элемент. При этом учтите, что плагин добавляет ко всем названиям блоков приставку <code>galleria-</code> . Т.е. если вы посмотрите на разметку с помощью firebug, то блоки будут выглядеть примерно так.</p>
<pre class="brush: html">&lt;div class="galleria-title"&gt;Пятая картинка&lt;/div&gt;</pre>
<p>Теперь рассмотрим код, позволяющий <strong>закрыть галерею</strong> (строки 27-38).</p>
<p>В данном случае мы используем немного нестандартное решение. У нас есть кнопка «Закрыть», которую мы поместили в правый верхний угол галереи. В дополнение к этой кнопке создадим полупрозрачный слой (<code>overlay</code>), который с одной стороны будет затенять страницу, а с другой – закрывать галерею при клике по нему.</p>
<p>Для создания слоя используем функцию <code>$</code> библиотеки <strong>jQuery</strong>. Затем назначаем ему и кнопке «Закрыть» обработчик события <code>click</code>.</p>
<p>Обратите внимание, при создании этого обработчика мы используем метод <code>proxy</code> объекта <code>Galleria</code> (строка 28). Этот метод позволяет обращаться к текущему экземпляру объекта <code>Galleria</code> внутри обработчика клика с помощью <code>this</code>. Если не использовать <code>proxy</code>, то <code>this</code> внутри обработчика клика будет указывать либо на кнопку «Закрыть», либо на <code>overlay</code>.</p>
<p>Также отметьте, как выполняется обращение к элементам галереи. Например, переключение класса hidden у контейнера.</p>
<pre class="brush: javascript">this.$('container').toggleClass('hidden');</pre>
<p>Здесь вызывается метод <code>$</code> плагина, а не функция <code>$</code> библиотеки <strong>jQuery</strong>. Но, также как и стандартная функция, этот метод возвращает объект <code>jQuery</code>, т.е. вы сможете использовать весь функционал этой библиотеки.</p>
<p><strong>Теперь добавляем обработчики ещё для двух событий.</strong></p>
<p>При возникновении события <code>Galleria.LOADSTART</code> (начало загрузки изображения) показываем анимированный загрузчик (строки 40-44).</p>
<p>А после загрузки изображения (событие <code>Galleria.LOADFINISH</code>) устанавливаем заголовок и описание текущей картинки (строки 45-50).</p>
<p>Информацию, связанную с текущей картинкой (мы её указали при в файле <code>init.js</code>), можно получить с помощью метода <code>this.getData()</code>. После этого можно обращаться к любым полям структуры, например, так <code>imageData.title</code>.</p>
<h2>CSS стили</h2>
<p>Я не буду подробно описывать все стили, которые здесь используются. Большинство из них взято из темы classic. Приведу те, которые использовались для оформления новых элементов.</p>
<pre class="brush: css">#overlay {
    width: 100%;
    height: 100%;
    z-index: 9;
    background-color: #000;
    opacity: 0.3;
    position: absolute;
    top: 0;
    left: 0;
}

.hidden {
    display: none;
}

.galleria-close {
	background-image: url(classic-map.png);
	background-position: -753px -11px;
	width: 9px;
	height: 9px;
	margin: 0.5em;
	float: right;
}

.galleria-close a {
	display: block;
	text-decoration: none;
}

.galleria-title, .galleria-desc {
	color: #fff;
	font-family: Verdana, sans-serif;
	text-align: center;
	padding: 3px;
}</pre>
<p>Как видите, никаких особых хитростей здесь нет.</p>
<p>Для полупрозрачного слоя используем абсолютное позиционирование и 100% длину и ширину, чтобы он закрыл всё окно. С помощью <code>z-index</code> размещаем его под галереей.</p>
<p>Блок с галереей делаем невидимым с помощью класса <code>hidden</code>.</p>
<p>Для кнопки «Закрыть» указываем фоновое изображение и соответствующий размер.</p>
<p>А для дополнительных надписей устанавливаем параметры шрифтов и отступы.</p>
<h2>Заключение</h2>
<p>Возможно, после прочтения этой статьи у вас возник вопрос: «Зачем так заморачиваться?». Действительно, большинство плагинов для создания галерей можно просто подключить и они будут работать. При этом никаких тем создавать не нужно.</p>
<p>Но это простота кажущаяся. Как только вы захотите что-нибудь изменить в таком «простом» плагине, сразу столкнетесь с необходимостью править его исходники, а это занятие гораздо более трудоёмкое чем создание темы для Galleria.</p>
<p>К тому же, у вас появляется возможность создать действительно оригинальное решение для работы с картинками и сделать ваш ресурс действительно запоминающимся!</p>
<p><strong>Всех читательниц поздравляю с Праздником весны!<br />
Удачи и хорошего настроения!</strong></p>
<p><em>Интересно почитать</em></p>
<p><a href="http://it-centre.net">Обучение программированию</a> поможет стать настоящим IT специалистом.</p>
<p>Заполнение <a href="http://online-nalogi.ru/3_ndfl_prodazha_avtomobilja"> 3-ндфл 2011 на продажу автомобиля</a> плюс инструкции «Как отчитаться в налоговой»</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/galleria-plagin-dlya-sozdaniya-galerej-s-kartinkami.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>jQuery и плагины: решения для просмотра больших изображений</title>
		<link>http://www.simplecoding.org/jquery-i-plaginy-resheniya-dlya-prosmotra-bolshix-izobrazhenij.html</link>
		<comments>http://www.simplecoding.org/jquery-i-plaginy-resheniya-dlya-prosmotra-bolshix-izobrazhenij.html#comments</comments>
		<pubDate>Sat, 25 Dec 2010 18:41:21 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web дизайн]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1161</guid>
		<description><![CDATA[Приветствую всех! В этот раз речь пойдет о нескольких плагинах для jQuery, которые помогают организовать просмотр больших изображений на сайте. Думаю, с этой проблемой в какой-то момент сталкиваются все веб мастера. Представьте, у вас есть высококачественные изображения с высоким разрешением (фотографии, скриншоты и т.п.) и их нужно показать на сайте. Понятно, что вставить их, не [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1162" class="wp-caption alignnone" style="width: 277px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/12/jquery_img_zoom.jpg" alt="jquery img zoom" title="jquery img zoom" width="267" height="185" class="size-full wp-image-1162" style="float:left" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong></p>
<p>В этот раз речь пойдет о нескольких плагинах для <strong>jQuery</strong>, которые помогают организовать просмотр больших изображений на сайте.</p>
<p>Думаю, с этой проблемой в какой-то момент сталкиваются все веб мастера.</p>
<p>Представьте, у вас есть высококачественные изображения с высоким разрешением (фотографии, скриншоты и т.п.) и их нужно показать на сайте. Понятно, что вставить их, не меняя размеры, не получится. Картинки просто «порвут» дизайн. Поэтому предварительно нужно их уменьшить, но и возможность просмотра полноразмерного изображения необходимо обеспечить.</p>
<p><strong>Классическое решение этой задачи</strong> – сделать каждую миниатюру ссылкой на полноразмерное изображение. Т.е. использовать разметку вида.</p>
<pre class="brush: html">&lt;a href="1.jpg"&gt;&lt;img src="1_thumb.jpg" /&gt;&lt;/a&gt;</pre>
<p>где <code>1_thumb.jpg</code> – уменьшенное изображение <code>1.jpg</code>.</p>
<p>Главный <em>недостаток</em> такого подхода – посетитель покидает страницу, а затем должен на неё вернуться с помощью кнопки «Назад».</p>
<p>На данный момент существует множество решений, которые позволяют получить более красивое решение этой задачи.</p>
<p>Для этого примера я решил остановиться на плагинах к библиотеке jQuery. Т.к. на данный момент она одна из самых популярных и, кроме того, аналоги можно найти для всех распространённых JS библиотек.</p>
<p>Хочу сразу отметить, что плагинов для работы с изображениями – сотни, и многие дублируют друг друга.</p>
<p>Я же хочу показать основные подходы с примерами для решения задачи и обсудить их достоинства и недостатки, а какой именно плагин использовать – решать вам.<br />
<span id="more-1161"></span><br />
Чтобы было нагляднее, все описанные здесь примеры я разместил на демонстрационной страничке</p>
<p><a href="http://demosites.simplecoding.org/img_zoom/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a></p>
<h2>Вариант 1. Предпросмотр при наведении мышки на изображение.</h2>
<p>Есть несколько разновидностей таких плагинов, которые различаются в основном визуальными эффектами. В простейшем случае, для реализации подойдет любой плагин создания подсказок (tooltips). Например, <a href="http://cssglobe.com/post/1695/easiest-tooltip-and-image-preview-using-jquery">Image Preview</a>.</p>
<p>Использовать его не сложно. Размещаете на странице миниатюры со ссылками на полноразмерные изображения, подключаете jQuery и плагин, добавляете несколько CSS стилей и всё, можно пользоваться.</p>
<p>Рассмотрим пример.</p>
<p>Разметка страницы</p>
<pre class="brush: html">&lt;a href="images/1.jpg" class="preview"&gt;&lt;img src="images/1t.jpg" alt="image 1" /&gt;&lt;/a&gt;
&lt;a href="images/2.jpg" class="preview"&gt;&lt;img src="images/2t.jpg" alt="image 2" /&gt;&lt;/a&gt;
&lt;a href="images/3.jpg" class="preview"&gt;&lt;img src="images/3t.jpg" alt="image 3" /&gt;&lt;/a&gt;</pre>
<p>Здесь ссылкам добавлен класс <code>preview</code>, чтобы плагин мог выбрать только те изображения, которые нужно увеличить.</p>
<p>Подключение JS файлов:</p>
<pre class="brush: html">&lt;script type="text/javascript" src="jquery-1.4.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="tooltip.js"&gt;&lt;/script&gt;</pre>
<p>И CSS стили:</p>
<pre class="brush: css">a img {
    border: none;
}

#preview {
    background: none repeat scroll 0 0 #333333;
    border: 1px solid #CCCCCC;
    color: #FFFFFF;
    display: none;
    padding: 5px;
    position: absolute;
}</pre>
<p>Их вы можете поменять. Главное – сохраните абсолютное позиционирование для блока предпросмотра (position: absolute). Иначе полноразмерная картинка будет вставлена внутрь страницы и испортит дизайн.</p>
<p>Теперь <em>о достоинствах и недостатках</em>.</p>
<p>Взгляните на <a href="http://demosites.simplecoding.org/img_zoom/">демонстрационную страничку</a> (первый ряд изображений).</p>
<p>Я специально выбрал картинки с большим разрешением, чтобы был виден главный недостаток. Полноразмерное изображение не всегда полностью помещается на экране и его положение зависит от положения миниатюры на странице.</p>
<p>Второй недостаток в том, что посетитель не всегда ожидает такого поведения и может случайно навести мышку на миниатюру, в результате часть текста окажется закрытой картинкой, а это раздражает.</p>
<p>Достоинством такого подхода является <em>минимум действий со стороны пользователя</em>. Если миниатюр много, то удобно просматривать их просто перемещая мышку.</p>
<p>В общем, я не советую использовать этот подход, если размер оригинала отличается от размера миниатюры более чем в два раза (цифра, конечно, приблизительная, но, думаю, идея ясна).</p>
<h2>Вариант 2. Увеличение картинки на весь экран.</h2>
<p>Реализовать можно с помощью плагинов для создания галерей. Пример для этой статьи я сделал с помощью плагина <a href="http://www.dfc-e.com/metiers/multimedia/opensource/jquery-fancyzoom/">Fancy Zoom</a>.</p>
<p>В данном случае, при клике по миниатюре она увеличивается до размеров окна браузера (плагин контролирует эту величину), а остальная часть страницы затеняется.</p>
<p>Подключение и настройка плагина достаточно простые.</p>
<p>Разметка страницы должна позволять выбрать нужные изображения с помощью jQuery селекторов. Например, так:</p>
<pre class="brush: html">&lt;div id="fancy"&gt;
    &lt;a href="images/1.jpg"&gt;&lt;img src="images/1t.jpg" alt="image 1" /&gt;&lt;/a&gt;
    &lt;a href="images/2.jpg"&gt;&lt;img src="images/2t.jpg" alt="image 2" /&gt;&lt;/a&gt;
    &lt;a href="images/3.jpg"&gt;&lt;img src="images/3t.jpg" alt="image 3" /&gt;&lt;/a&gt;
&lt;/div&gt;</pre>
<p>После этого, нужно подключить JS скрипты и передать плагину ссылки на полноразмерные изображения.</p>
<pre class="brush: html">&lt;script type="text/javascript" src="jquery-1.4.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.shadow.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.ifixpng.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.fancyzoom.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
	$(function() {
		$('#fancy a').fancyzoom();
	});
&lt;/script&gt;</pre>
<p>Плагины <code>shadow</code> и <code>ifixpng</code> используются для создания тени вокруг полноразмерного изображения и исправления проблем IE при работе с png изображениями, соответственно.</p>
<p>Fancy Zoom имеет несколько полезных настроек, на которых я останавливаться не хочу, т.к. они достаточно подробно описаны в документации.</p>
<p>Теперь о достоинствах и недостатках.</p>
<p>Кликните по любому изображению во втором ряду на <a href="http://demosites.simplecoding.org/img_zoom/">демонстрационной страничке</a>. Картинка плавно увеличится и в правом верхнем углу появится кнопка «Закрыть».</p>
<p>Безусловным преимуществом тут является то, что можно удобно просматривать довольно большие изображения <em>без использования скролла</em>.</p>
<p>Кроме того, ни о каких случайных срабатываниях тут речь не идёт. Картинка будет увеличена только в ответ на явное действие пользователя – клик мышкой.</p>
<p>Но читать текст на странице уже не получится. Т.е. посетитель может смотреть либо на картинку, либо – на содержимое страницы.</p>
<h2>Вариант 3. Увеличение картинки в отдельном блоке.</h2>
<p>Для демонстрации этого решения я выбрал плагин <a href="http://www.mind-projects.it/projects/jqzoom/">jqZoom</a>.</p>
<p>Посмотреть как он работает можно на <a href="http://demosites.simplecoding.org/img_zoom/">демонстрационной страничке</a> (последний ряд). Когда вы наводите указатель мыши на изображение на нём появляется полупрозрачный прямоугольник, показывающий какая именно область картинки сейчас увеличена. Справа появится блок с увеличенным фрагментом изображения. Естественно, плагин не растягивает миниатюру, а просто показывает фрагмент полноразмерной картинки.</p>
<p>Разметка страницы для использования этого плагина не отличается от предыдущих вариантов.</p>
<pre class="brush: html">&lt;a href="images/2.jpg" class="jqzoom" title="image 2"&gt;
	&lt;img src="images/2t.jpg" alt="image 2" /&gt;
&lt;/a&gt;</pre>
<p>Для использования плагина нужно подлкючить библиотеку jQuery, сам плагин, найти нужные изображения и вызвать для них метод <code>jqzoom()</code>.</p>
<pre class="brush: html">&lt;script type="text/javascript" src="jquery-1.4.4.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jqzoom.pack.1.0.1.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
	$(function() {
		$(".jqzoom").jqzoom();
	});
&lt;/script&gt;</pre>
<p>С помощью дополнительных параметров можно указать размеры области предпросмотра, её положение, масштаб и другие параметры. Подробнее читайте на официальном сайте.</p>
<p>Теперь подумаем, <em>что даёт использование такого плагина</em>.</p>
<p>На мой взгляд, его можно воспринимать как компромиссное решение между двумя первыми вариантами.</p>
<p>Возможность просмотра полноразмерного изображения сохраняется, требуется минимум действий от пользователя, и при этом не будет закрыт ни один элемент на странице.</p>
<p>Недостатком можно считать просмотр картинки по частям. Но, с другой стороны, если оригинал действительно большой, то просмотреть его в натуральную величину без скролла всё равно не получится.</p>
<p>И, конечно, использование этого плагина потребует изменения дизайна страницы. В нём должна быть предусмотрена область для просмотра увеличенной картинки. Предыдущие плагины можно просто подключить к любой странице, и они никак не повлияют на её дизайн.</p>
<p><strong>Обратите внимание</strong>. Все три решения используют стандартную разметку (картинка внутри ссылки). Такой подход гарантирует, что при отключённом JavaScript посетитель сможет просмотреть полноразмерное изображение.</p>
<p>В заключение, хочу отметить, что в этой статье рассмотрены далеко не все варианты решения задачи. Я выбрал те, которые считаю наиболее универсальными (подходят для большинства сайтов) и простые в использовании.</p>
<p>Если вам приходилось решать подобные задачи, и вы хотите о нём рассказать, пишите, буду рад обсудить <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Интересно почитать</strong></p>
<p><a href="http://nippondom.com/kak_privlech_klientov_v_kafe">Как привлечь клиентов в кафе</a> и убедить их заказать больше чем обычно?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/jquery-i-plaginy-resheniya-dlya-prosmotra-bolshix-izobrazhenij.html/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Плавающий виджет. Поддержка IE6.</title>
		<link>http://www.simplecoding.org/plavayushhij-vidzhet-podderzhka-ie6.html</link>
		<comments>http://www.simplecoding.org/plavayushhij-vidzhet-podderzhka-ie6.html#comments</comments>
		<pubDate>Thu, 29 Apr 2010 10:16:29 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1051</guid>
		<description><![CDATA[Приветствую всех! Некоторое время назад я опубликовал пост, в котором рассказывал о плагине для jQuery, позволяющем создать плавающий виджет. Но, благодаря читателям этого блога, выяснилось, что протестировал я работу плагина не очень хорошо. За это всем ещё раз огромное спасибо! Очень приятно, что кто-то пользуется моим кодом и помогает делать его лучше. Но вернёмся к [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1032" class="wp-caption alignnone" style="width: 240px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/04/floating_panel_logo.png" alt="floating panel logo" title="floating panel logo" width="230" height="136" class="size-full wp-image-1032" style="float:left" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong></p>
<p>Некоторое время назад я опубликовал <a href="http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html">пост</a>, в котором рассказывал о <strong>плагине для jQuery</strong>, позволяющем создать <strong>плавающий виджет</strong>.</p>
<p>Но, благодаря читателям этого блога, выяснилось, что протестировал я работу плагина не очень хорошо. За это всем ещё раз огромное спасибо! Очень приятно, что кто-то пользуется моим кодом и помогает делать его лучше.</p>
<p>Но вернёмся к плагину. Проблема возникла в широко известном браузере под названием IE6, о котором уже давно хочется забыть <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  … но есть люди, которые им пользуются <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
<span id="more-1051"></span><br />
Хуже оказалось то, что не удалось найти хорошего решения. Т.е. виджет в IE6 теперь работает, но хуже, чем в остальных браузерах.</p>
<p><strong>Проблема</strong> заключается в следующем. IE6 не поддерживает CSS свойство <code>position: fixed</code>. Это свойство указывает, что элемент должен фиксироваться при прокрутке страницы относительно окна браузера.</p>
<p>Существует несколько способов решения этой проблемы. В частности, хочу посоветовать очень хорошую статью <a href="http://www.artlebedev.ru/tools/technogrette/html/fixed_in_msie/">Полноценный fixed в MSIE</a>.</p>
<p>Но, все приведённые в ней решения, требуют использования выражений (<code>expression</code>) в <strong>CSS</strong> свойствах, и, по-с сути, означают динамическую установку свойства <code>top</code> с помощью JS кода.</p>
<p>Недостаток такого решения в том, что при прокрутке элемент начинает мерцать и «дёргаться». Правда, в той статье предложено решение этой проблемы, но оно предполагает использование фонового изображения для тега <code>body</code>. А если плагин, начнет менять эти стили, то возможны проблемы с дизайном страницы. Т.е. вебмастер сам должен решить как использовать этот приём.</p>
<p>Теперь рассмотрим изменения, которые я внёс в плагин.</p>
<pre class="brush: javascript">curWindow.scroll(function() {
	updateElement();
});

function updateElement() {
	//расстояние от начала страницы до верха её видимой части
	var windowTop = curWindow.scrollTop();
	if (windowTop + config.fromTop &lt; config.minTop) {
		//виджет нужно позиционировать абсолютно
		if ('absolute' != element.css('position')) {
			element.css('position', 'absolute');
			element.css({'top':config.minTop});
		}
	} else {
		//позиционируем виджет фиксированно
		//ie6 не поддерживает фиксированное позиционирование
		if ($.browser.msie &#038;&#038; $.browser.version.substr(0,1)&lt;7) {
			element.css({'top': windowTop + config.fromTop + &quot;px&quot;});
		}
		else {
			if ('fixed' != element.css('position')) {
				element.css('position', 'fixed');
				element.css({'top':config.fromTop});
			}
		}
	}
}</pre>
<p>Как видите, их не много (начинаются со строки 17).</p>
<p>Во время работы, плагин изменяет позиционирование виджета с абсолютного на фиксированное. Это сделано для того, чтобы виджет не «наезжал» на шапку страницы (подробнее в <a href="http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html">предыдущей статье</a>). Но теперь, перед изменением позиционирования на фиксированное, выполняется <strong>проверка версии браузера</strong>.</p>
<p>Если мы имеем дело с IE6, то позиционирование остаётся абсолютным, а фиксация виджета осуществляется за счет изменения свойства <code>top</code>. Функция <code>updateElement</code> выполняется в обработчике события <code>scroll</code>, т.о. пересчёт свойства <code>top</code> при прокрутке страницы выполняется постоянно, что и приводит к мерцаниям.</p>
<p>Во всех остальных браузерах используется свойство <code>fixed</code>.</p>
<p>Ссылка на архив с обновлённым плагином.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/04/floating_panel.jquery.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Решение, как я и говорил, не идеальное, но всё-таки хороший момент в нём есть. Возможно кто-то из пользователей IE6 увидит, что сайты в новых браузерах смотрятся лучше, и решит, что пора что-то менять <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Удачи!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/plavayushhij-vidzhet-podderzhka-ie6.html/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Плавающий виджет. Версия 2.</title>
		<link>http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html</link>
		<comments>http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html#comments</comments>
		<pubDate>Thu, 08 Apr 2010 14:13:29 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1031</guid>
		<description><![CDATA[Как и обещал, сегодня выкладываю новую версию плагина для jQuery, позволяющего создать плавающий виджет с кнопками. Но, прежде всего, хочу поблагодарить всех, кто принял участие в обсуждении плагина. Вы очень помогли мне замечаниями и советами! Сразу приведу ссылку на архив с новой версией. Изменения и новые возможности 1) Плагин теперь называется floating_panel. 2) Исправлен баг [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1032" class="wp-caption alignnone" style="width: 240px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/04/floating_panel_logo.png" alt="floating panel logo" title="floating panel logo" width="230" height="136" class="size-full wp-image-1032" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Как и обещал, сегодня выкладываю новую версию <strong>плагина для jQuery</strong>, позволяющего создать плавающий виджет с кнопками. Но, прежде всего, хочу поблагодарить всех, кто принял участие в <a href="http://www.simplecoding.org/jquery-plagin-plavayushhij-vidzhet-s-knopkami.html">обсуждении плагина</a>. Вы очень помогли мне замечаниями и советами!</p>
<p>Сразу приведу ссылку на архив с новой версией.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/04/floating_panel.jquery.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Изменения и новые возможности<br />
<span id="more-1031"></span><br />
<strong>1) Плагин теперь называется floating_panel</strong>.</p>
<p><strong>2) Исправлен баг с мерцанием виджета.</strong></p>
<p>Тут отдельное спасибо хочу сказать Александру за подсказку о динамическом изменении свойства position. Подробное описание решения чуть ниже.</p>
<p><strong>3) Добавлена возможность размещать виджет как слева, так и справа от контента страницы.</strong></p>
<p>Для этого используется параметр &#039;<code>location</code>&#039;, которое может принимать значения &#039;<code>left</code>&#039; или &#039;<code>right</code>&#039;.</p>
<p><strong>4) Параметр &#039;fromCenter&#039; теперь указывает расстояние от центра страницы до левого края виджета, а не до его середины.</strong></p>
<p>В некоторых случаях ширина виджета может не совпадать с шириной кнопок, размещённых в нём. Т.е. плагин не может определить видимую ширину виджета. Поэтому, ориентироваться лучше на левый край.</p>
<p><strong>Пример использования</strong></p>
<p>Создаём div, который будет содержать код кнопок виджета.</p>
<pre class="brush: html">&lt;div id=&quot;twitter_widget&quot;&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://tweetmeme.com/i/scripts/button.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</pre>
<p>Подключаем библиотеку jQuery и плагин.</p>
<pre class="brush: javascript">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.4.2.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/floating_panel.jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function() {
  $('#twitter_widget').floating_panel({
		'fromCenter': 520,
		'fromTop': 50,
		'minTop': 200,
		'location': 'left'
	});
});
&lt;/script&gt;</pre>
<p>В этом примере указаны все параметры, но вам не обязательно их использовать. Т.е. если вас устраивают значения по-умолчанию, вы можете подключить плагин так:</p>
<pre class="brush: javascript">$('#twitter_widget').floating_panel();</pre>
<p>Параметры имеют следующее значение.</p>
<p><code>fromCenter</code> &#8211; расстояние от середины страницы до левого края виджета<br />
<code>fromTop</code> &#8211; расстояние от виджета до верхней границы видимой части страницы<br />
<code>minTop</code> &#8211; расстояние от виджета до начала страницы<br />
<code>location</code> &#8211; размещение виджета (left или right)</p>
<p>На рисунке показано их влияние на размещение виджета.</p>
<div id="attachment_1035" class="wp-caption alignnone" style="width: 460px"><a href="http://www.simplecoding.org/wp-content/uploads/2010/04/floating_panel.png" target="_blank"><img src="http://www.simplecoding.org/wp-content/uploads/2010/04/floating_panel_thumb.png" alt="floating panel" title="floating panel" width="450" height="281" class="size-full wp-image-1035" /></a><p class="wp-caption-text"> </p></div>
<p>Теперь рассмотрим <strong>код плагина</strong></p>
<pre class="brush: javascript">(function($) {
    $.fn.floating_panel = function(settings) {
    	//значения по-умолчанию
    	var config = {
    		'fromCenter': 580,
    		'fromTop': 50,
    		'minTop': 200,
    		'location': 'left'
    	};
    	//если пользователь указал свои параметры, то используем их
        if (settings) $.extend(config, settings);

    	var element = $(this);

    	var curWindow = $(window);
    	//рассчитываем смещение от левого края окна браузера
    	if ('left' == config.location) {
    		var elementLeft = curWindow.width() / 2 - config.fromCenter;
    	}
    	else {
    		var elementLeft = curWindow.width() / 2 + config.fromCenter;
    	}
		element.css({'left':elementLeft});
    	updateElement();

    	//изменяем положения виджета при прокрутке страницы
    	curWindow.scroll(function() {
   			updateElement();
    	});

    	function updateElement() {
    		//расстояние от начала страницы до верха её видимой части
    		var windowTop = curWindow.scrollTop();
    		if (windowTop + config.fromTop &lt; config.minTop) {
    			//виджет нужно позиционировать абсолютно
    			if ('absolute' != element.css('position')) {
    				element.css('position', 'absolute');
    				element.css({'top':config.minTop});
    			}
    		} else {
    			//позиционируем виджет фиксированно
    			if ('fixed' != element.css('position')) {
    				element.css('position', 'fixed');
    				element.css({'top':config.fromTop});
    			}
    		}
    	}
    };
})(jQuery);</pre>
<p>По сравнению с <a href="http://www.simplecoding.org/jquery-plagin-plavayushhij-vidzhet-s-knopkami.html">предыдущей версией</a> немного изменился принцип работы. Раньше для перемещения виджета плагин постоянно изменял его свойство <code>top</code>, что и приводило к мерцаниям при прокрутке страницы.</p>
<p>Теперь используется два режима позиционирования. Если расстояние от виджета до начала страницы меньше значения, указанного в параметре <code>minTop</code>, то виджет позиционируется абсолютно (<code>position: absolute</code>), а значение свойства <code>top</code> выствляется равным <code>minTop</code>.</p>
<p>В противном случае виджет позиционируется фиксировано (<code>position: fixed</code>), а свойству top присваивается значение <code>fromTop</code>.</p>
<p>Идея заключается в том, чтобы как можно реже изменять CSS свойства с помощью JS кода. Поэтому перед изменением свойства <code>position</code> проверяется его значение (строки 36 и 42) и изменение происходит только если текущее значение не соответствует новому. Т.е. при прокрутке страницы это свойство будет изменяться только один раз.</p>
<p>Как видите, изменений не очень много, но, надеюсь, они окажутся полезными. И, как всегда, буду рад услышать ваши отзывы и пожелания по развитию плагина!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html/feed</wfw:commentRss>
		<slash:comments>85</slash:comments>
		</item>
		<item>
		<title>jQuery плагин: плавающий виджет с кнопками</title>
		<link>http://www.simplecoding.org/jquery-plagin-plavayushhij-vidzhet-s-knopkami.html</link>
		<comments>http://www.simplecoding.org/jquery-plagin-plavayushhij-vidzhet-s-knopkami.html#comments</comments>
		<pubDate>Tue, 06 Apr 2010 07:52:05 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=1026</guid>
		<description><![CDATA[Приветствую всех! Сегодня хочу поделиться небольшим плагином для jQuery, который я разработал специально для этого блога. UPD. Эта информация устарела, т.к. появилась новая версия плагина. Идею плагина я позаимствовал на очень популярном блоге Mashable. Если вы откроете любую их статью, то слева от текста увидите небольшую панель с кнопками социальных сетей. Самое главное в том, [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1027" class="wp-caption alignnone" style="width: 240px"><img src="http://www.simplecoding.org/wp-content/uploads/2010/04/twitter_button.png" alt="twitter button" title="twitter button" width="230" height="136" class="size-full wp-image-1027" style="float:left" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong></p>
<p>Сегодня хочу поделиться небольшим <strong>плагином для jQuery</strong>, который я разработал специально для этого блога.</p>
<p><strong>UPD</strong>. Эта информация устарела, т.к. появилась <a href="http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html">новая версия плагина</a>.</p>
<p>Идею плагина я позаимствовал на очень популярном блоге <a href="http://mashable.com/">Mashable</a>. Если вы откроете любую их статью, то слева от текста увидите небольшую панель с кнопками социальных сетей. Самое главное в том, что при прокрутке страницы, эта панель смещается вниз и кнопки видны постоянно.</p>
<p>Мне такое решение показалось очень удачным. Ведь, скорее всего, посетитель захочет отправить ссылку в твиттер после того, как прочтёт часть статьи. Поэтому будет неплохо, если соответствующая кнопка в нужный момент окажется перед глазами.</p>
<p><strong>Возвращаемся к плагину</strong>.<br />
<span id="more-1026"></span><br />
Демонстрацию его работы вы можете увидеть слева от этого текста. В данном случае я использовал кнопку твиттера, которую создаёт сервис <a href="http://tweetmeme.com/about/retweet_button">Tweetmeme</a>, но вы можете использовать любую другую кнопку в том числе и обычную картинку.</p>
<p><strong>Принцип использования.</strong></p>
<p>1) Подключаете библиотеу jQuery и плагин.</p>
<pre class="brush: html">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.4.2.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/left_floating_button.jquery.js&quot;&gt;&lt;/script&gt;</pre>
<p>2) Создаёте тег div с кодом кнопки</p>
<pre class="brush: html">&lt;div id=&quot;twitter_widget&quot;&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://tweetmeme.com/i/scripts/button.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</pre>
<p>3) Подключаете плагин</p>
<pre class="brush: javascript">$('#twitter_widget').left_floating_button();</pre>
<p>4) Если есть необходимость, указываете параметры. Тут нужны некоторые пояснения. Всего можно задать четыре параметра:</p>
<p><code>fromCenter</code> &#8211; расстояние от середины страницы до середины виджета<br />
<code>fromTop</code> &#8211; расстояние от виджета до верхней границы видимой части страницы<br />
<code>minTop</code> &#8211; расстояние от виджета до начала страницы</p>
<p>Я сделал небольшой рисунок, чтобы было понятнее о каких расстояниях идёт речь.</p>
<div id="attachment_1029" class="wp-caption alignnone" style="width: 460px"><a href="http://www.simplecoding.org/wp-content/uploads/2010/04/left_twitter_button.png" target="_blank"><img src="http://www.simplecoding.org/wp-content/uploads/2010/04/left_twitter_button_thumb.png" alt="left_twitter_button_thumb" title="left_twitter_button_thumb" width="450" height="281" class="size-full wp-image-1029" /></a><p class="wp-caption-text"> </p></div>
<p>Кстати, обратите внимание, что использовать плагин имеет смысл только для страниц с <strong>фиксированной шириной</strong>. По этой же причине расстояние устанавливается от центра страницы, а не от левого края.</p>
<p>Установить свои значения можно с помощью метода <code>left_floating_button</code>. Например, так</p>
<pre class="brush: javascript">$('#twitter_widget').left_floating_button({
		'fromCenter': 520,
		'fromTop': 50,
		'minTop': 200
	});</pre>
<p>Рассмотрим код плагина.</p>
<pre class="brush: javascript">(function($) {
    $.fn.left_floating_button = function(settings) {
    	//значения по-умолчанию
    	var config = {
    		'fromCenter': 520,
    		'fromTop': 50,
    		'minTop': 200
    	};
    	//если пользователь указал свои параметры, то используем их
        if (settings) $.extend(config, settings);

    	var element = this;

    	//абсолютно позиционируем виджет
    	element.css('position', 'absolute');
    	var curWindow = $(window);
    	updateElement();

    	//изменяем положения виджета при прокрутке страницы
    	curWindow.scroll(function() {
   			updateElement();
    	});

    	function updateElement() {
    		//определяем размеры окна
    		var windowWidth = curWindow.width();
    		var windowTop = curWindow.scrollTop();
    		//рассчитываем положение виджета
    		var elementLeft = windowWidth / 2 - config.fromCenter - element.width() / 2;
    		var elementTop = windowTop + config.fromTop;
    		if (elementTop &lt; config.minTop) {
    			elementTop = config.minTop;
    		}

    		//изменяем CSS свойства left и top,
    		//в результате виджет будет перемещаеться
			element.css({'left':elementLeft, 'top':elementTop});
    	}
    };
})(jQuery);</pre>
<p>Как видите, он совсем небольшой. Пояснять каждую строчку кода я не буду, думаю, в этом нет необходимости, лучше поясню <strong>общий принцип работы</strong>.</p>
<p>Как только вы вызываете метод <code>left_floating_button</code> для какого-нибудь элемента страницы, плагин делает его абсолютно позиционированным (с помощью CSS свойства <code>position: absolute</code>). После этого, положение элемента можно изменять с помощью свойств <code>top</code> и <code>left</code>. Т.е. нужно пересчитывать значения этих свойств при каждой прокрутке страницы.</p>
<p>Для того, чтобы отслеживать прокрутку страницы нужно назначить обработчик события <code>scroll</code>, а рассчитать положение элемента несложно, зная ширину окна и расстояние до начала страницы. Последние можно получить с помощью методов <code>$(window).width()</code> и <code>$(window).scrollTop()</code>.</p>
<p>Запуск перемещения выполняется присваиванием новых значений свойствам <code>top</code> и <code>left</code>.</p>
<p>Вот и всё. Но хочу предупредить, это только бета версия плагина в будущем он может измениться, и, кстати, эти изменения могут зависеть от ваших идей <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Так что, если вам кажется, что плагин можно улучшить или вы нашли баг, не стесняйтесь, пишите в комментариях к этой статье!</p>
<p><strong>Исходники плагина</strong></p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2010/04/left_floating_button.jquery.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Удачи!</p>
<p><strong>Интересное</strong></p>
<p>Мой дом &#8211; моя крепость. Но кто сказал, что крепость не должна быть красивой? В этом вам поможет <a href='http://www.lubakov.ru/'>отделка фасада загородного дома</a>. Ваш дом действительно будет выделяться.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/jquery-plagin-plavayushhij-vidzhet-s-knopkami.html/feed</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>960 Grid System: зачем нужны CSS фреймворки</title>
		<link>http://www.simplecoding.org/960-grid-system-zachem-nuzhny-css-frejmvorki.html</link>
		<comments>http://www.simplecoding.org/960-grid-system-zachem-nuzhny-css-frejmvorki.html#comments</comments>
		<pubDate>Fri, 30 Oct 2009 20:14:42 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=932</guid>
		<description><![CDATA[Что-то давно я ничего не писал о CSS, а ведь использовать эту технологию приходится практически постоянно. Кроме того, последнее время я начинаю замечать, что все чаще использую CSS фреймворки. Поэтому сегодня речь пойдет именно о них. А точнее, об одном из них, под названием 960 Grid System. Почему именно о нем? Тут все очень просто. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_933" class="wp-caption alignnone" style="width: 296px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/10/960grid_logo.png" alt="960grid logo" title="960grid logo" width="286" height="190" class="size-full wp-image-933" style="float:left; padding: 0 10px 10px 0" /><p class="wp-caption-text"> </p></div>
<p>Что-то давно я ничего не писал о <strong>CSS</strong>, а ведь использовать эту технологию приходится практически постоянно.</p>
<p>Кроме того, последнее время я начинаю замечать, что все чаще использую <strong>CSS фреймворки</strong>. Поэтому сегодня речь пойдет именно о них. А точнее, об одном из них, под названием <a href="http://960.gs/">960 Grid System</a>.</p>
<p>Почему именно о нем? Тут все очень просто. Я более-менее плотно работал с двумя фреймворками: Blueprint и 960 grid. При этом, на мой взгляд, разработчикам <strong>960 grid system</strong> удалось добиться очень хорошего отношения возможности/размер фреймворка.</p>
<p>Рассмотрим его подробнее.</p>
<p><strong>Начнем с недостатков.</strong></p>
<p>Если вы хоть немного интересовались темой, то, конечно, знаете, что есть много возражений против применении CSS фреймворков как таковых.</p>
<p><strong>Основные возражения</strong> такие.<br />
<span id="more-932"></span><br />
1) Фреймворки увеличивают размер страницы.</p>
<p>2) Загоняют разработчика в определенные рамки. Например, 960 grid предназначен для верстки страниц с шириной 960рх.</p>
<p>3) Многим не нравятся имена классов вроде «grid-16».</p>
<p>4) Кто-то считает, что нужно самому создавать фреймворк «под себя».</p>
<p>Но давайте посмотрим насколько существенны эти недостатки.</p>
<p>1) Объем файлов действительно увеличивается. Но 960 Grid System состоит из трех файлов, суммарный размер которых &#8211; 8 кБ (сжатая версия). Если использовать архивацию размер уменьшается до 1,6кБ.</p>
<p>Вы, конечно, сможете обойтись меньшим количеством кода для <strong>конкретной</strong> страницы, но разница вряд ли будет больше 1 кБ, т.е. если на вашей страничке есть хотя бы парочка картинок, выигрыш в общем объеме окажется менее 1%.</p>
<p>2) По поводу ограничений. Фреймворк, как и любую библиотеку, имеет смысл использовать <strong>в случаях, для которых он разрабатывался</strong>. Т.е. если нужна «резиновая» верстка, 960 Grid – не подходящее решение (хотя есть проект <a href="http://www.designinfluences.com/fluid960gs/">Fluid 960 Grid System</a>). Но если в тех. задании сказано, что страница должна иметь фиксированную ширину 960px, то ситуация меняется.</p>
<p>3) Имена классов. На мой взгляд – это вопрос привычки. Цифры в имени означают ширину блока и по ним достаточно просто ориентироваться. Кроме того, никто не запрещает использовать одновременно несколько классов, например,</p>
<pre class="brush: html">&lt;div class=”grid_4 sidebar”&gt;…&lt;/div&gt;</pre>
<p>Класс <code>grid_4</code> будет использовать фреймворк, <code>sidebar</code> – вашими стилями.</p>
<p>4) Свой фреймворк – это хорошо… если у вас есть время на его разработку и вы уверены, что он получится лучше существующих решений.</p>
<p><strong>Теперь о преимуществах.</strong></p>
<p>1) Время разработки. Оно сокращается и значительно, особенно если у вас есть минимальный опыт работы с фреймворком и вы используете его в подходящей ситуации. Т.е. нужно потратить какое-то время на изучение, но окупается оно очень быстро.</p>
<p>2) Фреймворки содержат «хаки» для наиболее распространенных браузеров. Каждый раз решать одни и те же проблемы с позиционированием элементов в IE очень быстро надоедает <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>3) Упрощается поддержка. Вам будет легче прочитать свой же код, написанный полгода назад, если вы все время используете одинаковые имена классов.</p>
<p><em>Примечание</em>. Кстати, если вы интересуетесь темой, очень советую почитать статью &#034;<a href="http://maxsite.org/page/grid">Верстка с помощью Grid</a>&#034;.</p>
<p>А теперь <strong>небольшой пример</strong>.</p>
<p>Допустим, нам нужно сверстать страницу с таким размещением блоков.</p>
<div id="attachment_934" class="wp-caption alignnone" style="width: 460px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/10/layout.png" alt="layout" title="layout" width="450" height="230" class="size-full wp-image-934" /><p class="wp-caption-text"> </p></div>
<p>Я сразу покажу решение.</p>
<pre class="brush: html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;title&gt;Test 960 Grid System&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;css/reset.css&quot; /&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;css/text.css&quot; /&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;css/960.css&quot; /&gt;
    &lt;style type=&quot;text/css&quot;&gt;
    p {
        border: solid 1px #eee;
    }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class=&quot;container_12&quot;&gt;
    &lt;div class=&quot;grid_12&quot;&gt;&lt;p&gt;Заголовок&lt;/p&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;

    &lt;div class=&quot;grid_4&quot;&gt;
        &lt;div class=&quot;grid_4 alpha&quot;&gt;&lt;p&gt;Левый блок №1&lt;/p&gt;&lt;/div&gt;
        &lt;div class=&quot;grid_4 alpha&quot;&gt;&lt;p&gt;Левый блок №2&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;grid_4&quot;&gt;
        &lt;div class=&quot;grid_4 alpha&quot;&gt;&lt;p&gt;Центральный блок №1&lt;/p&gt;&lt;/div&gt;
        &lt;div class=&quot;grid_2 alpha&quot;&gt;&lt;p&gt;Центральный блок №2&lt;/p&gt;&lt;/div&gt;
        &lt;div class=&quot;grid_2 omega&quot;&gt;&lt;p&gt;Центральный блок №3&lt;/p&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class=&quot;grid_4&quot;&gt;&lt;p&gt;Правый блок.&lt;br /&gt;&lt;br /&gt; Может быть любой высоты.&lt;/p&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;

    &lt;div class=&quot;grid_12&quot;&gt;&lt;p&gt;Хвостовик&lt;/p&gt;&lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Как видите, мы обошлись практически минимальным количество тегов <code>div</code>. Вложенные дивы использовались только для левой и центральной колонок, т.к. они содержат несколько блоков.</p>
<p>Теперь о номерах классов.</p>
<p>Общая ширина макета 960px. Фреймворк позволяет разбить ее на 12, 16 и 24 равных части. В данном случае нам достаточно разбиения на 12 частей. Т.е. класс <code>grid_12</code> имеет ширину 940px плюс отступы по 10px справа и слева.</p>
<p>Точно также класс <code>grid_4</code> имеет ширину <code>960 * 4 / 12 = 320px</code> из которых 20px приходится на отступы.</p>
<p>Если мы поместим подряд три блока с классами <code>grid_1</code>, <code>grid_7</code> и <code>grid_4</code>, то они займут всю ширину страницы.</p>
<p>Кроме того, есть несколько специальных классов, например, <code>alpha</code> и <code>omega</code>. Они позволяют убрать отступы слева (<code>alpha</code>) и справа (<code>omega</code>) у блока. В данном примере эта возможность используется для того, чтобы убрать отступы у вложенных блоков. Иначе они будут прибавлены к отступам контейнера и, например, расстояние между левой колонкой и центральной будет не 20, а 40px.</p>
<p>Также вы можете использовать класс <code>clear</code> для завершения строки с блоками, а также классы <code>prefix_X</code>, <code>suffix_X</code>, <code>push_X</code> и <code>pull_X</code> для создания различных отступов (вместо <code>X</code> нужно подставить число).</p>
<p><em>Примечание</em>. Если вы планируете использовать этот (или любой другой CSS фреймворк) я очень советую вам взглянуть на исходные файлы со стилями. Как я уже писал, они совсем небольшие и при наличии минимальных познаний в CSS вы быстро разберетесь что к чему.</p>
<p>Как видите, использовать фреймворк не сложно и его изучение вряд ли отнимет у вас много времени.</p>
<p><strong>В заключение хочу провести небольшой опрос.</strong></p>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
<p>(форма для голосования не видна в RSS ридере, поэтому заходите на сайт <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Удачи!</p>
<p><strong>Постовой</strong></p>
<p>Для малого бизнеса <a href="http://busins.ru/buhgalterskie_uslugi_v_moskve">бухгалтерские услуги: Москва</a> и область</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/960-grid-system-zachem-nuzhny-css-frejmvorki.html/feed</wfw:commentRss>
		<slash:comments>62</slash:comments>
		</item>
		<item>
		<title>Исправляем недостатки IE6</title>
		<link>http://www.simplecoding.org/ispravlyaem-nedostatki-ie6.html</link>
		<comments>http://www.simplecoding.org/ispravlyaem-nedostatki-ie6.html#comments</comments>
		<pubDate>Mon, 07 Sep 2009 07:11:27 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web дизайн]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=898</guid>
		<description><![CDATA[Думаю, все кто когда-нибудь занимался версткой сайтов, знает о том насколько хорошо IE6 поддерживает разные полезные возможности Призывы перейти на нормальные браузеры или хотя бы обновить IE6, можно встретить на каждом шагу. Тем не менее ситуация меняется очень медленно. И на сегодняшний день игнорировать людей, которые используют устаревшую версию Internet Explorer нельзя. К тому же [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_899" class="wp-caption alignnone" style="width: 160px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/09/ie6-bugs-logo.png" alt="ie6-bugs-logo" title="ie6-bugs-logo" width="150" height="100" style="float:left; padding: 0 10px 10px 0" class="size-full wp-image-899" /><p class="wp-caption-text"> </p></div>
<p>Думаю, все кто когда-нибудь занимался <strong>версткой сайтов</strong>, знает о том насколько хорошо <strong>IE6</strong> поддерживает разные полезные возможности <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Призывы перейти на нормальные браузеры или хотя бы обновить IE6, можно встретить на каждом шагу. Тем не менее ситуация меняется очень медленно.</p>
<p>И на сегодняшний день игнорировать людей, которые используют устаревшую версию Internet Explorer нельзя.</p>
<p>К тому же для того чтобы обеспечить поддержку IE6 <strong>не обязательно отказываться от новых возможностей</strong>.</p>
<p>Сегодня я расскажу о двух проблемах, которые можно решить практически без усилий с вашей стороны. Это поддержка :hover селекторов и прозрачных png изображений.<br />
<span id="more-898"></span><br />
<strong>Поддержка :hover селекторов</strong></p>
<p>Вообще-то в IE6 есть поддержка этих селекторов, но только для тега <code>a</code>, т.е. ссылки. В тоже время в современных браузерах их можно использовать для любых элементов страницы.</p>
<p>Напомню, правила, определенные с помощью этого селектора, применяются, когда курсор мыши находится над элементом. При грамотном использовании можно получить очень красивые визуальные эффекты.</p>
<p>Решить проблему можно с помощью небольшого скрипта под названием <a href="http://www.xs4all.nl/~peterned/csshover.html">Whatever:hover</a>.</p>
<p>От вас требуется добавить только одно CSS правило</p>
<pre class="brush: css">body {
	behavior: url("csshover3.htc");
}</pre>
<p>Естественно нужно указать правильное размещение скрипта.</p>
<p>Скрипт сам найдет нужные элементы на странице и, если курсор мыши окажется над ними, применит соответствующие CSS правила.</p>
<p><strong>Поддержка альфа-канала в PNG файлах.</strong></p>
<p><em>Примечание</em>. В альфа-канале хранятся данные о прозрачности рисунка.</p>
<p>Рассмотрим небольшой пример. Допустим, у вас есть логотип с названием компании, который должен находиться над фоновой картинкой.</p>
<p>При этом для картинки установлено правило</p>
<pre class="brush: css">background-attachment: fixed;</pre>
<p>Т.е. при прокрутке страницы фон остается неподвижным, а логотип должен перемещаться.</p>
<p>Получается, что нужно делать отдельную картинку с логотипом и отдельную с фоном, а затем накладывать их друг на друга. При этом в Photoshop и современных браузерах все получается отлично, но не в устаревших версиях IE.</p>
<p>Чтобы проиллюстрировать проблему я сделал 2 скриншота.</p>
<img src="http://www.simplecoding.org/wp-content/uploads/2009/09/alpha-normal.png" alt="alpha-normal" title="alpha-normal" width="134" height="83" class="size-full wp-image-900" />
<p></p>
<div id="attachment_901" class="wp-caption alignnone" style="width: 159px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/09/alpha-bug.png" alt="alpha-bug" title="alpha-bug" width="149" height="97" class="size-full wp-image-901" /><p class="wp-caption-text"> </p></div>
<p>Угадайте, какой из них сделан в IE6? <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>IE закрасил прозрачные пиксели серым цветом. Кстати, использование gif изображений не поможет, т.к. по краю букв идут частично прозрачные пиксели.</p>
<p>Решается эта проблема с помощью скрипта <a href="http://www.twinhelix.com/css/iepngfix/">IE PNG Fix</a>.</p>
<p>Вам нужно подключить его для тех элементов на странице, которые содержат прозрачные png изображения. Например, так.</p>
<pre class="brush: css">img {
    behavior: url("iepngfix.htc");
}</pre>
<p>После этого, изображения будут выглядеть правильно.</p>
<p><strong>Небольшое заключение для пользователей IE6.</strong></p>
<p>То, что web разработчик может как-то обойти обойти ограничения браузера не означает, что вам не нужно его апгрейдить <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Даже если вас не интересует собственная безопасность, нужно понимать, что такие решения используют <strong>JavaScript</strong> и работают обычно значительно медленнее, чем встроенные функции современных браузеров.</p>
<p>Так что не удивляйтесь, если после загрузки пары страничек у вас начнет «тормозить» компьютер <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Удачного обновления!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/ispravlyaem-nedostatki-ie6.html/feed</wfw:commentRss>
		<slash:comments>69</slash:comments>
		</item>
	</channel>
</rss>

