<?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>Sun, 25 Jul 2010 20:00:16 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<link rel="http://api.friendfeed.com/2008/03#sup" xmlns="http://www.w3.org/2005/Atom" type="application/json" href="http://friendfeed.com/api/public-sup.json#d217526a2c"/>		<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>Но вернёмся к плагину. Проблема возникла в широко известном браузере под названием <acronym title="Internet Explorer 6">IE6</acronym>, о котором уже давно хочется забыть <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 />
Хуже оказалось то, что не удалось найти хорошего решения. Т.е. виджет в <acronym title="Internet Explorer 6">IE6</acronym> теперь работает, но хуже, чем в остальных браузерах.</p>
<p><strong>Проблема</strong> заключается в следующем. <acronym title="Internet Explorer 6">IE6</acronym> не поддерживает <acronym title="Cascading Style Sheets">CSS</acronym> свойство <code>position: fixed</code>. Это свойство указывает, что элемент должен фиксироваться при прокрутке страницы относительно окна браузера.</p>
<p>Существует несколько способов решения этой проблемы. В частности, хочу посоветовать очень хорошую статью <a href="http://www.artlebedev.ru/tools/technogrette/html/fixed_in_msie/">Полноценный fixed в <acronym title="Microsoft Internet Explorer">MSIE</acronym></a>.</p>
<p>Но, все приведённые в ней решения, требуют использования выражений (<code>expression</code>) в <strong><acronym title="Cascading Style Sheets">CSS</acronym></strong> свойствах, и, по-с сути, означают динамическую установку свойства <code>top</code> с помощью <acronym title="JavaScript">JS</acronym> кода.</p>
<p>Недостаток такого решения в том, что при прокрутке элемент начинает мерцать и «дёргаться». Правда, в той статье предложено решение этой проблемы, но оно предполагает использование фонового изображения для тега <code>body</code>. А если плагин, начнет менять эти стили, то возможны проблемы с дизайном страницы. Т.е. вебмастер сам должен решить как использовать этот приём.</p>
<p>Теперь рассмотрим изменения, которые я внёс в плагин.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">curWindow.<span class="kw3">scroll</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">function</span> updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//расстояние от начала страницы до верха её видимой части</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> windowTop = curWindow.<span class="me1">scrollTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>windowTop + config.<span class="me1">fromTop</span> &lt; config.<span class="me1">minTop</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//виджет нужно позиционировать абсолютно</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&#039;absolute&#039;</span> != element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span>, <span class="st0">&#039;absolute&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;top&#039;</span>:config.<span class="me1">minTop</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//позиционируем виджет фиксированно</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//ie6 не поддерживает фиксированное позиционирование</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$.<span class="me1">browser</span>.<span class="me1">msie</span> &amp;&amp; $.<span class="me1">browser</span>.<span class="me1">version</span>.<span class="me1">substr</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">1</span><span class="br0">&#41;</span>&lt;<span class="nu0">7</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;top&#039;</span>: windowTop + config.<span class="me1">fromTop</span> + <span class="st0">&quot;px&quot;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&#039;fixed&#039;</span> != element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span>, <span class="st0">&#039;fixed&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;top&#039;</span>:config.<span class="me1">fromTop</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Как видите, их не много (начинаются со строки 17).</p>
<p>Во время работы, плагин изменяет позиционирование виджета с абсолютного на фиксированное. Это сделано для того, чтобы виджет не «наезжал» на шапку страницы (подробнее в <a href="http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html">предыдущей статье</a>). Но теперь, перед изменением позиционирования на фиксированное, выполняется <strong>проверка версии браузера</strong>.</p>
<p>Если мы имеем дело с <acronym title="Internet Explorer 6">IE6</acronym>, то позиционирование остаётся абсолютным, а фиксация виджета осуществляется за счет изменения свойства <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>Решение, как я и говорил, не идеальное, но всё-таки хороший момент в нём есть. Возможно кто-то из пользователей <acronym title="Internet Explorer 6">IE6</acronym> увидит, что сайты в новых браузерах смотрятся лучше, и решит, что пора что-то менять <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Удачи!</strong></p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1051&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/plavayushhij-vidzhet-podderzhka-ie6.html/feed</wfw:commentRss>
		<slash:comments>15</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>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;twitter_widget&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;http://tweetmeme.com/i/scripts/button.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
</ol>
</div>
<p>Подключаем библиотеку jQuery и плагин.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span> src=<span class="st0">&quot;js/jquery-1.4.2.min.js&quot;</span>&gt;&lt;/script&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span> src=<span class="st0">&quot;js/floating_panel.jquery.js&quot;</span>&gt;&lt;/script&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">* $<span class="br0">&#40;</span><span class="st0">&#039;#twitter_widget&#039;</span><span class="br0">&#41;</span>.<span class="me1">floating_panel</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromCenter&#039;</span>: <span class="nu0">520</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromTop&#039;</span>: <span class="nu0">50</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;minTop&#039;</span>: <span class="nu0">200</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;location&#039;</span>: <span class="st0">&#039;left&#039;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&lt;/script&gt;</div>
</li>
</ol>
</div>
<p>В этом примере указаны все параметры, но вам не обязательно их использовать. Т.е. если вас устраивают значения по-умолчанию, вы можете подключить плагин так:</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&#039;#twitter_widget&#039;</span><span class="br0">&#41;</span>.<span class="me1">floating_panel</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<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>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>$<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">fn</span>.<span class="me1">floating_panel</span> = <span class="kw2">function</span><span class="br0">&#40;</span>settings<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//значения по-умолчанию</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> config = <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromCenter&#039;</span>: <span class="nu0">580</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromTop&#039;</span>: <span class="nu0">50</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;minTop&#039;</span>: <span class="nu0">200</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;location&#039;</span>: <span class="st0">&#039;left&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//если пользователь указал свои параметры, то используем их</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>settings<span class="br0">&#41;</span> $.<span class="me1">extend</span><span class="br0">&#40;</span>config, settings<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> element = $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curWindow = $<span class="br0">&#40;</span>window<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//рассчитываем смещение от левого края окна браузера</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&#039;left&#039;</span> == config.<span class="me1">location</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> elementLeft = curWindow.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> / <span class="nu0">2</span> &#8211; config.<span class="me1">fromCenter</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> elementLeft = curWindow.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> / <span class="nu0">2</span> + config.<span class="me1">fromCenter</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;left&#039;</span>:elementLeft<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//изменяем положения виджета при прокрутке страницы </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; curWindow.<span class="kw3">scroll</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//расстояние от начала страницы до верха её видимой части</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> windowTop = curWindow.<span class="me1">scrollTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>windowTop + config.<span class="me1">fromTop</span> &lt; config.<span class="me1">minTop</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//виджет нужно позиционировать абсолютно</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&#039;absolute&#039;</span> != element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span>, <span class="st0">&#039;absolute&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;top&#039;</span>:config.<span class="me1">minTop</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//позиционируем виджет фиксированно</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&#039;fixed&#039;</span> != element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span>, <span class="st0">&#039;fixed&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;top&#039;</span>:config.<span class="me1">fromTop</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>jQuery<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<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>Идея заключается в том, чтобы как можно реже изменять <acronym title="Cascading Style Sheets">CSS</acronym> свойства с помощью <acronym title="JavaScript">JS</acronym> кода. Поэтому перед изменением свойства <code>position</code> проверяется его значение (строки 36 и 42) и изменение происходит только если текущее значение не соответствует новому. Т.е. при прокрутке страницы это свойство будет изменяться только один раз.</p>
<p>Как видите, изменений не очень много, но, надеюсь, они окажутся полезными. И, как всегда, буду рад услышать ваши отзывы и пожелания по развитию плагина!</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1031&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/plavayushhij-vidzhet-versiya-2.html/feed</wfw:commentRss>
		<slash:comments>31</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>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-1.4.2.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/left_floating_button.jquery.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
</ol>
</div>
<p>2) Создаёте тег div с кодом кнопки</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;twitter_widget&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;http://tweetmeme.com/i/scripts/button.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
</ol>
</div>
<p>3) Подключаете плагин</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&#039;#twitter_widget&#039;</span><span class="br0">&#41;</span>.<span class="me1">left_floating_button</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<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>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&#039;#twitter_widget&#039;</span><span class="br0">&#41;</span>.<span class="me1">left_floating_button</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromCenter&#039;</span>: <span class="nu0">520</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromTop&#039;</span>: <span class="nu0">50</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;minTop&#039;</span>: <span class="nu0">200</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Рассмотрим код плагина.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>$<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">fn</span>.<span class="me1">left_floating_button</span> = <span class="kw2">function</span><span class="br0">&#40;</span>settings<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//значения по-умолчанию</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> config = <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromCenter&#039;</span>: <span class="nu0">520</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;fromTop&#039;</span>: <span class="nu0">50</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#039;minTop&#039;</span>: <span class="nu0">200</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//если пользователь указал свои параметры, то используем их</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>settings<span class="br0">&#41;</span> $.<span class="me1">extend</span><span class="br0">&#40;</span>config, settings<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> element = <span class="kw1">this</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//абсолютно позиционируем виджет</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="st0">&#039;position&#039;</span>, <span class="st0">&#039;absolute&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curWindow = $<span class="br0">&#40;</span>window<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//изменяем положения виджета при прокрутке страницы </span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; curWindow.<span class="kw3">scroll</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> updateElement<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//определяем размеры окна</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> windowWidth = curWindow.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> windowTop = curWindow.<span class="me1">scrollTop</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//рассчитываем положение виджета</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> elementLeft = windowWidth <span class="re0">/ <span class="nu0">2</span> &#8211; config.<span class="me1">fromCenter</span> &#8211; element.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> /</span> <span class="nu0">2</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> elementTop = windowTop + config.<span class="me1">fromTop</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>elementTop &lt; config.<span class="me1">minTop</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elementTop = config.<span class="me1">minTop</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//изменяем <acronym title="Cascading Style Sheets">CSS</acronym> свойства left и top,</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//в результате виджет будет перемещаеться</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">css</span><span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#039;left&#039;</span>:elementLeft, <span class="st0">&#039;top&#039;</span>:elementTop<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>jQuery<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Как видите, он совсем небольшой. Пояснять каждую строчку кода я не буду, думаю, в этом нет необходимости, лучше поясню <strong>общий принцип работы</strong>.</p>
<p>Как только вы вызываете метод <code>left_floating_button</code> для какого-нибудь элемента страницы, плагин делает его абсолютно позиционированным (с помощью <acronym title="Cascading Style Sheets">CSS</acronym> свойства <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><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=1026&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/jquery-plagin-plavayushhij-vidzhet-s-knopkami.html/feed</wfw:commentRss>
		<slash:comments>18</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><acronym title="Cascading Style Sheets">CSS</acronym></strong>, а ведь использовать эту технологию приходится практически постоянно.</p>
<p>Кроме того, последнее время я начинаю замечать, что все чаще использую <strong><acronym title="Cascading Style Sheets">CSS</acronym> фреймворки</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>Если вы хоть немного интересовались темой, то, конечно, знаете, что есть много возражений против применении <acronym title="Cascading Style Sheets">CSS</acronym> фреймворков как таковых.</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>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=”grid_4 sidebar”<span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
</ol>
</div>
<p>Класс <code>grid_4</code> будет использовать фреймворк, <code>sidebar</code> – вашими стилями.</p>
<p>4) Свой фреймворк – это хорошо… если у вас есть время на его разработку и вы уверены, что он получится лучше существующих решений.</p>
<p><strong>Теперь о преимуществах.</strong></p>
<p>1) Время разработки. Оно сокращается и значительно, особенно если у вас есть минимальный опыт работы с фреймворком и вы используете его в подходящей ситуации. Т.е. нужно потратить какое-то время на изучение, но окупается оно очень быстро.</p>
<p>2) Фреймворки содержат «хаки» для наиболее распространенных браузеров. Каждый раз решать одни и те же проблемы с позиционированием элементов в <acronym title="Internet Explorer">IE</acronym> очень быстро надоедает <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>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//<acronym title="World Wide Web Consortium">W3C</acronym>//<acronym title="Document Type Definition">DTD</acronym> <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/<acronym title="Document Type Definition">DTD</acronym>/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>Test 960 Grid System<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;css/reset.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;css/text.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;css/960.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;style</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; p {</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; border: solid 1px #eee;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; }</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/style&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2"><span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;container_12&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_12&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Заголовок<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;clear&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_4&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_4 alpha&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Левый блок №1<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_4 alpha&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Левый блок №1<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_4&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_4 alpha&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Центральный блок №1<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_2 alpha&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Центральный блок №2<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_2 omega&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Центральный блок №3<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_4&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Правый блок.<span class="sc2"><span class="kw2">&lt;br</span> /<span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;br</span> /<span class="kw2">&gt;</span></span> Может быть любой высоты.<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;clear&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;grid_12&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;p&gt;</span></span>Хвостовик<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">class</span>=<span class="st0">&quot;clear&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2"><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<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>. Если вы планируете использовать этот (или любой другой <acronym title="Cascading Style Sheets">CSS</acronym> фреймворк) я очень советую вам взглянуть на исходные файлы со стилями. Как я уже писал, они совсем небольшие и при наличии минимальных познаний в <acronym title="Cascading Style Sheets">CSS</acronym> вы быстро разберетесь что к чему.</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>(форма для голосования не видна в <acronym title="Really Simple Syndication">RSS</acronym> ридере, поэтому заходите на сайт <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><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=932&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/960-grid-system-zachem-nuzhny-css-frejmvorki.html/feed</wfw:commentRss>
		<slash:comments>28</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><acronym title="Internet Explorer 6">IE6</acronym></strong> поддерживает разные полезные возможности <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Призывы перейти на нормальные браузеры или хотя бы обновить <acronym title="Internet Explorer 6">IE6</acronym>, можно встретить на каждом шагу. Тем не менее ситуация меняется очень медленно.</p>
<p>И на сегодняшний день игнорировать людей, которые используют устаревшую версию Internet Explorer нельзя.</p>
<p>К тому же для того чтобы обеспечить поддержку <acronym title="Internet Explorer 6">IE6</acronym> <strong>не обязательно отказываться от новых возможностей</strong>.</p>
<p>Сегодня я расскажу о двух проблемах, которые можно решить практически без усилий с вашей стороны. Это поддержка :hover селекторов и прозрачных png изображений.<br />
<span id="more-898"></span><br />
<strong>Поддержка :hover селекторов</strong></p>
<p>Вообще-то в <acronym title="Internet Explorer 6">IE6</acronym> есть поддержка этих селекторов, но только для тега <code>a</code>, т.е. ссылки. В тоже время в современных браузерах их можно использовать для любых элементов страницы.</p>
<p>Напомню, правила, определенные с помощью этого селектора, применяются, когда курсор мыши находится над элементом. При грамотном использовании можно получить очень красивые визуальные эффекты.</p>
<p>Решить проблему можно с помощью небольшого скрипта под названием <a href="http://www.xs4all.nl/~peterned/csshover.html">Whatever:hover</a>.</p>
<p>От вас требуется добавить только одно <acronym title="Cascading Style Sheets">CSS</acronym> правило</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">body <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; behavior: <span class="kw2">url</span><span class="br0">&#40;</span><span class="st0">&quot;csshover3.htc&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Естественно нужно указать правильное размещение скрипта.</p>
<p>Скрипт сам найдет нужные элементы на странице и, если курсор мыши окажется над ними, применит соответствующие <acronym title="Cascading Style Sheets">CSS</acronym> правила.</p>
<p><strong>Поддержка альфа-канала в <acronym title="Portable Network Graphics">PNG</acronym> файлах.</strong></p>
<p><em>Примечание</em>. В альфа-канале хранятся данные о прозрачности рисунка.</p>
<p>Рассмотрим небольшой пример. Допустим, у вас есть логотип с названием компании, который должен находиться над фоновой картинкой.</p>
<p>При этом для картинки установлено правило</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">background-attachment</span>: <span class="kw2">fixed</span>;</div>
</li>
</ol>
</div>
<p>Т.е. при прокрутке страницы фон остается неподвижным, а логотип должен перемещаться.</p>
<p>Получается, что нужно делать отдельную картинку с логотипом и отдельную с фоном, а затем накладывать их друг на друга. При этом в Photoshop и современных браузерах все получается отлично, но не в устаревших версиях <acronym title="Internet Explorer">IE</acronym>.</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>Угадайте, какой из них сделан в <acronym title="Internet Explorer 6">IE6</acronym>? <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><acronym title="Internet Explorer">IE</acronym> закрасил прозрачные пиксели серым цветом. Кстати, использование gif изображений не поможет, т.к. по краю букв идут частично прозрачные пиксели.</p>
<p>Решается эта проблема с помощью скрипта <a href="http://www.twinhelix.com/css/iepngfix/"><acronym title="Internet Explorer">IE</acronym> <acronym title="Portable Network Graphics">PNG</acronym> Fix</a>.</p>
<p>Вам нужно подключить его для тех элементов на странице, которые содержат прозрачные png изображения. Например, так.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">img <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; behavior: <span class="kw2">url</span><span class="br0">&#40;</span><span class="st0">&quot;iepngfix.htc&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>После этого, изображения будут выглядеть правильно.</p>
<p><strong>Небольшое заключение для пользователей <acronym title="Internet Explorer 6">IE6</acronym>.</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><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=898&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/ispravlyaem-nedostatki-ie6.html/feed</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>PHP скрипт: ToDo с картинками</title>
		<link>http://www.simplecoding.org/php-skript-todo-s-kartinkami.html</link>
		<comments>http://www.simplecoding.org/php-skript-todo-s-kartinkami.html#comments</comments>
		<pubDate>Thu, 13 Aug 2009 19:01:21 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=885</guid>
		<description><![CDATA[Уделяете ли вы внимание организации своей работы?
Много ли у вас &#034;мелких&#034; дел, о которых вы регулярно забываете?
Вроде бы простые вопросы, но для многих людей (и я не исключение) организация работы – это актуальная проблема.
Хуже всего, когда нужно сделать много «мелких» дел, которые не занимают много времени, но обязательно должны быть выполнены вовремя&#8230; и держать в [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_886" class="wp-caption alignnone" style="width: 320px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/08/simple_tasks.png" alt="simple tasks" title="simple tasks" width="310" height="129" class="size-full wp-image-886" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Уделяете ли вы внимание организации своей работы?<br />
Много ли у вас &#034;мелких&#034; дел, о которых вы регулярно забываете?</p>
<p>Вроде бы простые вопросы, но для многих людей (и я не исключение) <strong>организация работы</strong> – это актуальная проблема.</p>
<p>Хуже всего, когда нужно сделать много «мелких» дел, которые не занимают много времени, но обязательно должны быть выполнены вовремя&#8230; и держать в голове их все просто невозможно.</p>
<p>Естественно, разработчики реагируют на потребности рынка, и на сегодняшний день создано множество программ-органайзеров, различных напоминалок и т.п.<br />
Примеры создания ToDo списков часто приводят в учебниках по программированию.</p>
<p>Я решил не оставаться в стороне и сделал <strong>собственный вариант такого ToDo списка, естественно, с некоторыми дополнительными возможностями</strong>.</p>
<p>Кстати, скрипт называется <strong>SimpleTasks</strong>.</p>
<p>Главная особенность – <strong>возможность указывать состояние выполнения задач</strong>. При этом используется специальная система обозначений.<br />
<span id="more-885"></span></p>
<div id="attachment_887" class="wp-caption alignnone" style="width: 490px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/08/symbols_for_paper_notebook_with_description.png" alt="symbols for paper notebook with description" title="symbols for paper notebook with description" width="480" height="192" class="size-full wp-image-887" /><p class="wp-caption-text"> </p></div>
<p>Систему обозначений придумал не я. <del datetime="2009-08-14T13:47:28+00:00">Но, к сожалению, не могу найти первоисточник</del> (UPD. Огромное спасибо <a href="http://i-smarty.com">Smarty</a> за ссылку на <a href="http://font.is/?p=790">оригинал</a>). Предназначена она для использования с бумажным блокнотом и довольно удобная. Во всяком случае, читать такой список задач становится намного легче. Взгляд сразу отбрасывает выполненные задачи.</p>
<p>Но <strong>возможности web приложений намного шире</strong>, чем у обычного ежедневника. Например, можно сделать систему фильтров и легко работать с большими списками задач.</p>
<p>В общем, я написал небольшое web приложение, использующее эту систему обозначений.</p>
<p>Если есть желание, можете поиграться с ним (логин admin@todo.loc, пароль password).</p>
<p><a href="http://demosites.org.ua/simpletasks/"><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/2009/08/simpletasks.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><strong>Принцип работы.</strong></p>
<p><strong>Создание новой записи.</strong><br />
Кликаем по ссылке &#034;Новая запись&#034; (справа в верхней части страницы) и в открывшемся окне вводим данные записи.<br />
При клике по полю &#034;Дата&#034; будет открыт календарь. Т.е. ввести дату в неправильном формате довольно проблематично.</p>
<p><strong>Редактирование.</strong><br />
Клик или двойной клик на соответствующем поле позволяет изменить его. Открываетеся либо диалог, либо inline редактор.</p>
<p><strong>Удаление.</strong><br />
Кликните по картинке с изображением крестика в соответствующей строке и подтвердите удаление.</p>
<p><strong>Фильтры.</strong><br />
Позволяют выбрать задачи с определенным состоянием в указанном диапазоне дат.</p>
<p>Ссылки в верхнем меню дублируют наиболее распространенные (на мой взгляд) фильтры.</p>
<p><strong>Состояние работ.</strong><br />
На данный момент это только бета версия.<br />
Еще не доделана локализация. Доступен только один вариант &#8211; русский.<br />
Возможно, отсутствуют некоторые сообщения об ошибках.</p>
<p>Скорее всего, некоторые функции будут дорабатываться.</p>
<p><strong>И я очень хочу услышать ваше мнение!<br />
</strong><br />
Прежде всего, меня интересуют такие вопросы.</p>
<p>1) Есть ли смысл делать подобное приложение многопользовательским? Т.е. технически это совсем не сложно, вопрос в том будет ли кто-то в рамках небольшой организации использовать такое приложение для хранения заметок сотрудников?</p>
<p>2) Какие еще функии вы бы добавили?</p>
<p>3) Может кто-то видел хороший тьюториал о локализации <acronym title="JavaScript">JS</acronym> приложений? (Сейчас я ориентируюсь на то, как сделана локализация в jQuery UI).</p>
<p><strong>P.S.</strong> На этих выходных я уезжаю догуливать остатки отпуска, поэтому прошу прощения, если не сразу отвечу на ваши комментарии. Я обязательно их прочитаю&#8230; даже спаммерские <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=885&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/php-skript-todo-s-kartinkami.html/feed</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
		<item>
		<title>Динамическая загрузка картинок для анонсов с помощью Ajax, jQuery и PHP</title>
		<link>http://www.simplecoding.org/dinamicheskaya-zagruzka-kartinok-dlya-anonsov-s-pomoshhyu-ajax-jquery-i-php.html</link>
		<comments>http://www.simplecoding.org/dinamicheskaya-zagruzka-kartinok-dlya-anonsov-s-pomoshhyu-ajax-jquery-i-php.html#comments</comments>
		<pubDate>Sat, 20 Jun 2009 12:31:18 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=854</guid>
		<description><![CDATA[Идею этого эффекта я нагло стырил позаимствовал на сайте jomsocial. Там есть блоки (под кнопкой Learn More) с анонсами. При наведении мышки на эти блоки к ним добавляется картинка.
Реализовать такой эффект можно разными способами. Например, можно теги картинок вставить прямо в страницу и прятать/показывать их с помощью JavaScript.
Основное достоинство такого варианта – отсутствие задержек при [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_855" class="wp-caption alignnone" style="width: 305px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/06/ajax_image_load.jpg" alt="ajax_image_load" title="ajax_image_load" width="295" height="159" class="size-full wp-image-855" style="float:left; padding: 0 10px 10px 0" /><p class="wp-caption-text"> </p></div>
<p>Идею этого эффекта я <del datetime="2009-06-20T11:32:50+00:00">нагло стырил</del> позаимствовал на сайте <a href="http://www.jomsocial.com/">jomsocial</a>. Там есть блоки (под кнопкой <em>Learn More</em>) с анонсами. При наведении мышки на эти блоки к ним добавляется картинка.</p>
<p><strong>Реализовать такой эффект можно разными способами</strong>. Например, можно теги картинок вставить прямо в страницу и прятать/показывать их с помощью JavaScript.</p>
<p>Основное достоинство такого варианта – <strong>отсутствие задержек</strong> при появлении картинок (если конечно вы подождали пока страница полностью загрузится).</p>
<p>Но при этом увеличивается размер страницы и не факт, что посетитель вообще будет эти картинки рассматривать.</p>
<p>Поэтому я решил привести <strong>пример своей реализации этого эффекта</strong>.</p>
<p>Картинки будут загружаться только если посетитель наведет мышку на какой-нибудь блок с аннотацией. Естественно, что загрузка будет выполняться <strong>только один раз</strong>.</p>
<p>Если посетитель наведет курсор мышки на другую аннотацию, будет загружена картинка для неё, а предыдущая – исчезнет.</p>
<p>Говорят, что одна картинка стоит тысячи слов, поэтому я сделал демонстрационную страничку для этого примера.<br />
<span id="more-854"></span><br />
<a href="http://demosites.org.ua/imagepreview/"><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/2009/06/ajaximagepreview.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><strong>А теперь разберем как это все работает</strong>.</p>
<p>Допустим у нас есть страница (index.html) со следующей разметкой.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//<acronym title="World Wide Web Consortium">W3C</acronym>//<acronym title="Document Type Definition">DTD</acronym> <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> 1.0 Strict//EN&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0"> &nbsp; &nbsp; &nbsp; &nbsp;&quot;http://www.w3.org/TR/xhtml1/<acronym title="Document Type Definition">DTD</acronym>/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>Пердпросмотр с картинками<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span>=<span class="st0">&quot;screen&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;styles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;content&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;leftCol&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;butterfly&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;tiger&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;elephant&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;wolf&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;fish&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;rightCol&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;whale&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;flamingo&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;bear&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;dog&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;cat&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<p>Сразу обратите внимание на блок <code>content</code>. Он состоит из двух колонок (<code>leftCol</code> и <code>rightCol</code>) в которых размещены аннотации.</p>
<p>Всем аннотациям присвоен <acronym title="Cascading Style Sheets">CSS</acronym> класс <code>annotaionBlock</code> и уникальный <code>id</code>. Этот <code>id</code> будет использоваться для определения нужной картинки.</p>
<p>Сами аннотации представляют собой обычный текст с <acronym title="HyperText Markup Language">HTML</acronym> разметкой или без неё.</p>
<p><strong>Теперь напишем <acronym title="JavaScript">JS</acronym> скрипт, который будет подгружать картинки.</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span> src=<span class="st0">&quot;jquery-1.3.1.min.js&quot;</span>&gt;&lt;/script&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.annotaionBlock&#039;</span><span class="br0">&#41;</span>.<span class="me1">hover</span><span class="br0">&#40;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curAnnotation = $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curId = curAnnotation.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> annotImg = curAnnotation.<span class="me1">children</span><span class="br0">&#40;</span><span class="st0">&#039;.annotImg&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>annotImg.<span class="me1">length</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#039;getimage.php&#039;</span>, <span class="br0">&#123;</span>img : curId<span class="br0">&#125;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotImg = $<span class="br0">&#40;</span><span class="st0">&#039;&lt;div class=&quot;annotImg&quot;&gt;&lt;img src=&quot;&#039;</span> + data + <span class="st0">&#039;&quot; alt=&quot;Картинка&quot; /&gt;&lt;/div&gt;&#039;</span><span class="br0">&#41;</span>.<span class="me1">hide</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; curAnnotation.<span class="me1">append</span><span class="br0">&#40;</span>annotImg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.annotImg&#039;</span><span class="br0">&#41;</span>.<span class="me1">not</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">slideUp</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotImg.<span class="me1">slideDown</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.annotImg&#039;</span><span class="br0">&#41;</span>.<span class="me1">not</span><span class="br0">&#40;</span>annotImg<span class="br0">&#41;</span>.<span class="me1">slideUp</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotImg.<span class="me1">slideDown</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&lt;/script&gt;</div>
</li>
</ol>
</div>
<p>Прежде всего мы подключаем библиотеку <a href="http://jquery.com/">jQuery</a> и пишем функцию, которая будет вызвана сразу после загрузки страницы (строки 3-25).</p>
<p>В этой функции мы объявляем обработчик события <code>hover</code> для всех элементов страницы с классом <code>annotaionBlock</code>, т.е. для всех наших аннотаций.</p>
<p>В качестве параметров этому обработчику передается 2 функции. Первая будет вызвана при появлении мышки над блоком, вторая – при выходе из него.</p>
<p>Вторую функцию (строки 22-23) мы оставляем пустой, т.к. вставлять и прятать картинки будем в первой.</p>
<p><strong>Алгоритм работы.</strong></p>
<p>1) При появлении курсора над аннотацией, сохраняем указатель на неё и её <code>id</code> (строки 6-7).</p>
<p>2) Проверяем загружен ли рисунок для данной аннотации (строки 8-9) и если нет, выполняем <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> запрос к серверному (<acronym title="PHP: Hypertext Preprocessor">PHP</acronym>) скрипту, в параметрах которого передаем <code>id</code> блока (строки 10-15).</p>
<p>3) После получения ответа сервера создаем скрытый тег <code>img</code> и вставляем его в конец блока с аннотацией (строки 11, 12). После этого применяем эффект <code>slideUp</code> ко всем картинкам в блоках с аннотацией кроме текущей (строка 13). И с помощью эффекта <code>slideDown</code> показываем картинку для данной аннотации (строка 14).</p>
<p>4) Если картинка была вставлена раньше, то <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> запрос мы не отправляем, а просто показываем её и прячем остальные (с помощью эффектов <code>slideUp</code> и <code>slideDown</code>, строки 18-19).</p>
<p>Обратите внимание. Если применять эффекты <code>slideDown</code> и <code>slideUp</code> непосредственно к тегу <code>img</code> картинка будет плавно изменять как вертикальный, так и горизонтальный размеры. Т.е. она будет «выезжать» из левого верхнего угла.<br />
Чтобы изменялась только высота картинки нужно поместить её внутрь тега <code>div</code> и примерять эффекты к нему.</p>
<p><strong>Серверная часть</strong></p>
<p><acronym title="PHP: Hypertext Preprocessor">PHP</acronym> скрипт, который обрабатывает запросы на получение картинок (getimage.php) должен прочитать <code>id</code> запрашиваемой картинки и вернуть соответствующую ссылку.</p>
<p>Эти ссылки можно хранить в БД или текстовом файле, выбирать случайным образом или однозначно связать с аннотациями. Всё это зависит от конкретной ситуации. Мы ограничимся простейшим вариантом с использованием оператора <code>switch</code>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$image</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#039;img&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$image</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;butterfly&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/152/408688454_2d868d0104_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;tiger&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm4.static.flickr.com/3284/2507729467_915274dab3_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;elephant&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm3.static.flickr.com/2377/1520324747_e468eab773_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;wolf&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/177/402657323_ebf5c7ce51_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;fish&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm2.static.flickr.com/1084/892454941_56fd34ac3c_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;whale&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm3.static.flickr.com/2401/2052477420_fe7fb452b0_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;flamingo&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm4.static.flickr.com/3303/3557243577_3c1bab1ec3_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;bear&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/172/401014816_9d879ceac6_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;dog&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/68/215233902_0f2d1ac9e5_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;cat&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm3.static.flickr.com/2068/2532467266_d8b5c9ea15_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Как видите, у нас есть десять аннотаций и каждой соответствует своя ссылка.</p>
<p>И в заключение <strong>несколько слов об оформлении страницы</strong>.</p>
<p>Размещение аннотаций и их внешний вид задаётся с помощью <acronym title="Cascading Style Sheets">CSS</acronym> стилей (файл styles.css).</p>
<p>Я приведу только его фрагмент, который создаёт две колонки (в архиве вы найдете полный вариант).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">#content</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">600px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">margin</span>: <span class="kw2">auto</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">text-align</span>: <span class="kw2">justify</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">#leftCol</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">299px</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">#rightCol</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">margin-left</span>: <span class="re3">301px</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Как видите, ширину всего блока с аннотациями мы установили равной 600px. Для левой колонки указали правило <code>float: left</code> и ширину 299px, а для правой – отступ слева 301px (внутри этого отступа будет находится левая колонка).</p>
<p>Вот и всё. На мой взгляд, эффект довольно симпатичный, но подходит не для всех сайтов.</p>
<p>Как всегда, буду рад ответить на вопросы и выслушать замечания.</p>
<p>До встречи!</p>
<p><strong>Интересно почитать</strong></p>
<p>Актуально про seo и <a href="http://seoprofy.net/tema/poiskovye-sistemy/">поисковые системы</a> от SeoProfy</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=854&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/dinamicheskaya-zagruzka-kartinok-dlya-anonsov-s-pomoshhyu-ajax-jquery-i-php.html/feed</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Создаём виджет для хранения заметок. Часть 2.</title>
		<link>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-2.html</link>
		<comments>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-2.html#comments</comments>
		<pubDate>Fri, 29 May 2009 10:42:59 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=841</guid>
		<description><![CDATA[В этой статье мы продолжаем разработку виджета для работы с короткими заметками. Если вы не читали предыдущую часть, то очень советую бегло её просмотреть. В ней мы подробно описаны постановка задачи и реализована серверная часть виджета, т.е. весь PHP код.
Для того, чтобы виджет заработал нам осталось написать клиентскую часть.
Думаю, очевидно, что для виджета отправка и [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_840" class="wp-caption alignnone" style="width: 229px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/notes_widget.png" alt="notes widget" title="notes widget" width="219" height="251" style="float:left" class="size-full wp-image-840" /><p class="wp-caption-text"> </p></div>
<p>В этой статье мы продолжаем разработку виджета для работы с короткими заметками. Если вы не читали <a href="http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-1.html">предыдущую часть</a>, то очень советую бегло её просмотреть. В ней мы подробно описаны постановка задачи и реализована <strong>серверная часть виджета</strong>, т.е. весь <acronym title="PHP: Hypertext Preprocessor">PHP</acronym> код.</p>
<p>Для того, чтобы виджет заработал нам осталось написать <strong>клиентскую часть</strong>.</p>
<p>Думаю, очевидно, что для виджета отправка и получение данных должна выполняться с помощью <strong><acronym title="Asynchronous JavaScript and XML">AJAX</acronym> запросов</strong>. Ведь вряд ли кому-то понравиться, если каждая операция с виджетом будет приводить к перезагрузке всей страницы.</p>
<p>Поэтому основную часть клиентской части у нас будет занимать <strong>JavaScript</strong> код. А чтобы его сократить мы используем библиотеку <a href="http://jquery.com/">jQuery</a> с несколькими плагинами.</p>
<p>Кстати, есть демонстрационная страничка с этим виджетом.</p>
<p><a href="http://www.demosites.org.ua/notes-widget/"><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/2009/05/notes_widget.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Прежде всего, <strong>рассмотрим разметку страницы</strong> (index.html).<br />
<span id="more-841"></span></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;</span>?xml <span class="kw3">version</span>=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;UTF-8&quot;</span>?<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//<acronym title="World Wide Web Consortium">W3C</acronym>//<acronym title="Document Type Definition">DTD</acronym> <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/<acronym title="Document Type Definition">DTD</acronym>/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>Notes Widget<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;pagestyles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;widgetstyles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;content&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">…. Содержимое страницы…</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;notesWidget&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;notesHeader&quot;</span><span class="kw2">&gt;</span></span>Мои заметки<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;notes&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;form</span> <span class="kw3">id</span>=<span class="st0">&quot;fAddNote&quot;</span> <span class="kw3">action</span>=<span class="st0">&quot;savenote.php&quot;</span> <span class="kw3">method</span>=<span class="st0">&quot;post&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;text&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;addNote&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;addNote&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;submit&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;bAddNote&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;bAddNote&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/form&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-1.3.2.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-ui-1.7.1.custom.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery.jeditable.mini.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/custom.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<p>В заголовке страницы мы подключаем файлы с <strong><acronym title="Cascading Style Sheets">CSS</acronym> стилями</strong> (строки 13 и 14). Я вынес все стили, которые относятся к виджету в отдельный файл (widgetstyles.css), чтобы они не путались со стилями основной страницы.</p>
<p>Внутри страницы у нас находится 2 блока: основное содержимое (<code>&lt;div id=&quot;content&quot;&gt;</code>) и виджет (<code>&lt;div id=&quot;notesWidget&quot;&gt;</code>).</p>
<p>Первый блок нас не интересует, а вот на втором остановимся подробнее. Он состоит из трёх частей:</p>
<p>- заголовок (<code>&lt;div id=&quot;notesHeader&quot;&gt;</code>);<br />
- блок заметок (<code>&lt;div id=&quot;notes&quot;&gt;</code>);<br />
- блок с формой добавления заметки (<code>&lt;form id=&quot;fAddNote&quot;</code>).</p>
<p><em>Обратите внимание</em>, что блок заметок не заполнен. Внутрь него мы будем вставлять список заметок, полученный от сервера.</p>
<p>И в конце страницы мы <strong>подключаем jQuery, плагины и файл с нашими скриптами</strong>.</p>
<p>Сразу же рассмотрим используемые плагины.</p>
<p>1) <a href="http://jqueryui.com/">jQuery UI</a>. Это скорее не плагин, а целая библиотека. На её сайте вы можете выбрать необходимые компоненты и скачать архив с ними. Для нашего виджета нужны <strong>Core UI</strong> и <strong>Draggable</strong>. С их помощью мы сможем свободно перемещать виджет по странице.</p>
<p>2) <a href="http://www.appelsiini.net/projects/jeditable/default.html">Jeditable</a>. С помощью этого плагина мы будем создавать <strong>in-line редакторы</strong>. Т.е. сделаем список с нашими заметками редактируемым. При клике по тексту заметки будет появляться поле ввода с помощью которого пользователь сможет изменить текст.</p>
<p>Теперь <strong>рассмотрим <acronym title="Cascading Style Sheets">CSS</acronym> стили</strong> минимально необходимые для работы плагина. Полный файл со стилями вы можете посмотреть в архиве с исходниками. К тому же при использовании виджета его оформление наверняка придется подстраивать под дизайн страницы.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">#notesWidget</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">position</span>: <span class="kw2">absolute</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">top</span>: <span class="re3">200px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">left</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">200px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3">300px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ….</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">#notesHeader</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">cursor</span>: move;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ….</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">#notes</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">overflow</span>: <span class="kw2">scroll</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ….</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Для того, чтобы виджет можно было перемещать по странице, он должен иметь абсолютное позиционирование. При этом необходимо задать его размеры и положение.</p>
<p>Чтобы пользователь без наших подсказок мог догадаться, что это перемещаемый блок, мы изменим вид курсора для заголовка виджета.</p>
<p>И, т.к. заметок может быть много, добавим прокрутку в блок <code>notes</code>.</p>
<p>Теперь переходим к самой интересной части – <strong>нашему JavaScript файлу (custom.js)</strong>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//делаем виджет перемещаемым</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notesWidget&#039;</span><span class="br0">&#41;</span>.<span class="me1">draggable</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; handle: <span class="st0">&#039;#notesHeader&#039;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; , containment: <span class="st0">&#039;parent&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//обработчик нажатия на кнопку добавления новой записи</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#bAddNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="st0">&#039;#addNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span> != <span class="st0">&#034;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//сохраняем запись</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">post</span><span class="br0">&#40;</span><span class="st0">&#039;savenote.php&#039;</span>, <span class="br0">&#123;</span>value:$<span class="br0">&#40;</span><span class="st0">&#039;#addNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, bAddNote:<span class="kw2">true</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>noteid<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//добавляем запись в список</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curDate = <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> noteData = <span class="br0">&#123;</span>id:noteid, note_text:$<span class="br0">&#40;</span><span class="st0">&#039;#addNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; note_date:curDate.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> note = $<span class="br0">&#40;</span>createListElement<span class="br0">&#40;</span>noteData<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notes ul&#039;</span><span class="br0">&#41;</span>.<span class="me1">prepend</span><span class="br0">&#40;</span>note<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.edit&#039;</span><span class="br0">&#41;</span>.<span class="me1">editable</span><span class="br0">&#40;</span><span class="st0">&#039;savenote.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; note.<span class="me1">children</span><span class="br0">&#40;</span><span class="st0">&#039;.remove&#039;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>addRemove<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&#039;Вы ничего не написали&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//загружаем список записей</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">getJSON</span><span class="br0">&#40;</span><span class="st0">&#039;getnotes.php&#039;</span>, <span class="br0">&#123;</span><span class="br0">&#125;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>data, <span class="kw3">status</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="kw3">status</span> == <span class="st0">&#039;OK&#039;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//формируем список</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> notesList = <span class="st0">&#039;&lt;ul&gt;&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">each</span><span class="br0">&#40;</span>data.<span class="me1">notes</span>, <span class="kw2">function</span><span class="br0">&#40;</span>i, note<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notesList += createListElement<span class="br0">&#40;</span>note<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notesList += <span class="st0">&#039;&lt;/ul&gt;&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notes&#039;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>notesList<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//делаем записи редактируемыми</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.edit&#039;</span><span class="br0">&#41;</span>.<span class="me1">editable</span><span class="br0">&#40;</span><span class="st0">&#039;savenote.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//добавляем обработчики нажатия на кнопку удаления записи</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.remove&#039;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>addRemove<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//вывод сообщения об ошибке</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notes&#039;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span><span class="st0">&#039;&lt;p&gt;Не могу загрузить список записей&lt;/p&gt;&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> createListElement<span class="br0">&#40;</span>note<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#039;&lt;li&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;img src=&quot;images/removenote.gif&quot; alt=&quot;Удалить&quot; class=&quot;remove&quot; /&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;div class=&quot;edit&quot; id=&quot;note_&#039;</span> + note.<span class="me1">id</span> + <span class="st0">&#039;&quot;&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + note.<span class="me1">note_text</span> + <span class="st0">&#039;&lt;/div&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;div class=&quot;notedate&quot;&gt;&#039;</span> + note.<span class="me1">note_date</span> + <span class="st0">&#039;&lt;/div&gt;&#039;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;/li&gt;&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> addRemove<span class="br0">&#40;</span>element<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> noteid = $<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//удаляем запись</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">post</span><span class="br0">&#40;</span><span class="st0">&#039;removenote.php&#039;</span>, <span class="br0">&#123;</span>id:noteid<span class="br0">&#125;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//убираем данную запись из списка</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">parent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">slideUp</span><span class="br0">&#40;</span><span class="st0">&quot;slow&quot;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> odds = $<span class="br0">&#40;</span><span class="st0">&#039;#notes ul li:odd&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; odds.<span class="me1">removeClass</span><span class="br0">&#40;</span><span class="st0">&#039;even&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; odds.<span class="me1">addClass</span><span class="br0">&#40;</span><span class="st0">&#039;odd&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw2">var</span> evens = $<span class="br0">&#40;</span><span class="st0">&#039;#notes ul li:even&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; evens.<span class="me1">removeClass</span><span class="br0">&#40;</span><span class="st0">&#039;odd&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; evens.<span class="me1">addClass</span><span class="br0">&#40;</span><span class="st0">&#039;even&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Рассмотрим его подробнее.</p>
<p>Прежде всего, <strong>сделаем виджет перемещаемым</strong> (строки 3-6). Параметр <code>handle</code> указывает, что блок можно будет перемещать только за заголовок, а <code>containment</code> – запрещает выводить блок за пределы страницы.</p>
<p>Затем, мы <strong>создаем обработчик нажатия на кнопку «Добавить»</strong> (строки 8-30). В нём мы проверяем, ввел ли пользователь текст новой заметки и отправляем <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> запрос.</p>
<p>После получения ответа будет вызвана анонимная функция (строки 12-23), которая:</p>
<p>1) создает элемент списка с новой записью (с помощью функции <code>createListElement</code>, её мы рассмотрим чуть ниже);</p>
<p>2) вставляет его в начало общего списка;</p>
<p>3) делает редактируемым (с помощью метода <code>editable</code>);</p>
<p>4) добавляет обработчик нажатия на кнопку «Удалить» (вызывает функцию <code>addRemove</code>);</p>
<p>5) и обновляет цвет фона записей (с помощью функции <code>refreshClasses</code>).</p>
<p><strong>Теперь рассмотрим функцию createListElement</strong> (строки 59-66). Её основная задача – создать разметку новой записи.</p>
<p>Запись состоит из текста, кнопки «Удалить» (точнее это обычный рисунок, которому назначается обработчик события <code>click</code>), и даты. Оформление записи выполняется с помощью <acronym title="Cascading Style Sheets">CSS</acronym> стилей, но на них я останавливаться не буду, в них ничего примечательного нет, к тому же они в любом случае должны сочетаться с конкретной страницей (если интересно, качайте архив с виджетом).</p>
<p>В разметке записи стоит обратить внимание на два момента.</p>
<p>1) Тексту записи присваивается класс <code>edit</code> (<code>&lt;div class=&quot;edit&quot;…</code>). С его помощью мы выбираем элементы для которых создаются in-line редакторы.</p>
<p>2) Этому же элементу мы присваиваем атрибут <code>id</code> в формате (<code>note_№</code>), его значение используется при изменении и удалении заметок.</p>
<p>Следующая <strong>функция addRemove</strong> (строки 68-79).</p>
<p>Здесь выполняется <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> запрос на удаление заметки (строка 72) и после этого заметка удаляется из списка. При этом используется эффект <code>slideUp</code>.</p>
<p>Теперь рассмотрим функцию <code>refreshClasses</code> (строки 81-88).</p>
<p>Она работает следующим образом.</p>
<p>1) Находим все нечетные элементы в списке заметок.</p>
<p>2) Устанавливаем для них класс <code>odd</code> и убираем <code>even</code> (если он был установлен).</p>
<p>3) Находим все четные элементы списка и устанавливаем для них класс even.</p>
<p>Стили для классов <code>odd</code> и <code>even</code> указаны в <acronym title="Cascading Style Sheets">CSS</acronym> файле (widgetstyles.css). Т.е. с помощью этой функции мы всегда можем обновить расцветку списка после добавления или удаления элементов.</p>
<p>Теперь <strong>рассмотрим загрузку полного списка записей</strong> (строки 32-56). Она выполняется сразу после загрузки страницы.</p>
<p>Мы отправляем <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> запрос (с помощью метода <code>getJSON</code>) и после получения ответа формируем <acronym title="HyperText Markup Language">HTML</acronym> список с заметками. Точно также как и при добавлении заметки устанавливаем обработчики нажатия на кнопку «Удалить», делаем записи редактируемыми и обновляем стили.</p>
<p>На этом можно остановиться. Общий принцип работы виджета мы рассмотрели, а если есть вопросы или замечания, пишите в комментариях, постараюсь ответить.</p>
<p><strong>P.S.</strong> В архиве с исходниками есть файл <strong>notes.sql</strong> с помощью которого можно создать таблицу в базе данных.</p>
<p><strong>Интересно почитать:</strong></p>
<p><a href="http://www.alik.su/articles/the-decline-of-the-web/">Закат Веба?</a></p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=841&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-2.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Стикер. Создаем плагин для jQuery.</title>
		<link>http://www.simplecoding.org/stiker-sozdaem-plagin-dlya-jquery.html</link>
		<comments>http://www.simplecoding.org/stiker-sozdaem-plagin-dlya-jquery.html#comments</comments>
		<pubDate>Sat, 16 May 2009 17:38:03 +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=833</guid>
		<description><![CDATA[Приветствую всех! Сегодня я покажу, как создать несложный плагин для jQuery. Пример, конечно, учебный, но подобный подход можно использовать для создания интерфейсов, которые позволяют перемещать блоки на странице.
Итак, задача такая. Нам нужно создать стикер, который пользователь сможет свободно перемещать по странице. Но если пользователь оставит стикер около края страницы, то он должен плавно &#034;прилипнуть&#034; к [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_835" class="wp-caption alignnone" style="width: 219px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/jquery_sticker.png" alt="jquery sticker" title="jquery sticker" width="209" height="129" class="size-full wp-image-835" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Приветствую всех! Сегодня я покажу, как создать несложный <strong>плагин для jQuery</strong>. Пример, конечно, учебный, но подобный подход можно использовать для создания интерфейсов, которые позволяют перемещать блоки на странице.</p>
<p>Итак, <strong>задача</strong> такая. Нам нужно создать стикер, который пользователь сможет свободно перемещать по странице. Но если пользователь оставит стикер около края страницы, то он должен плавно &#034;прилипнуть&#034; к этому краю. Сам стикер может представлять собой что угодно, для этого примера я использовал обычный <code>div</code> с картинкой.</p>
<p>Чтобы лучше объяснить принцип работы, я сделал демонстрационную страничку. По-умолчанию стикер находится около левого края окна, но вы можете переместить его в любую часть страницы. Если вы оставите его за пределами текста (над белым полем), то он плавно прижмется к краю страницы.</p>
<p><a href="http://demosites.org.ua/jquery-sticker/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a><br />
<a href='http://www.simplecoding.org/wp-content/uploads/2009/05/jquery_sticker.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Теперь <strong>перейдем к реализации</strong>.<br />
<span id="more-833"></span><br />
Прежде всего, рассмотрим <strong>общий принцип перемещения блока по странице</strong>.</p>
<p>Для того чтобы перемещение блока не влияло на другие элементы на странице, он должен быть не связан с ними. Для этого используется <acronym title="Cascading Style Sheets">CSS</acronym> определение <code>position: absolute</code>.</p>
<p>При этом координаты левого верхнего угла блока задаются с помощью определений left и top.</p>
<p>Например, так.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">#sticker</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">position</span>: <span class="kw2">absolute</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">top</span>: <span class="re3">200px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">left</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Сделать элемент перемещаемым (<strong>draggable</strong>) мы можем с помощью <a href="http://jqueryui.com/">jQuery UI</a>.</p>
<p>Таким образом, нам остается только проверять координаты блока после того, как пользователь отпустит его. Если расстояние от края блока до правого или левого краев страницы окажется меньше заданного значения, то нужно переместить блок к этому краю.</p>
<p><strong>Рассмотрим, разметку <acronym title="HyperText Markup Language">HTML</acronym> страницы.</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;</span>?xml <span class="kw3">version</span>=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;UTF-8&quot;</span>?<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//<acronym title="World Wide Web Consortium">W3C</acronym>//<acronym title="Document Type Definition">DTD</acronym> <acronym title="eXtensible HyperText Markup Language">XHTML</acronym> 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/<acronym title="Document Type Definition">DTD</acronym>/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>jQuery widget<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;styles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;content&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="coMULTI">&lt;!&#8211; основное содержимое страницы &#8211;&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;sticker&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;img</span> <span class="kw3">src</span>=<span class="st0">&quot;sticker.png&quot;</span> <span class="kw3">alt</span>=<span class="st0">&quot;sticker&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-1.3.2.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-ui-1.7.1.custom.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/sticker.jquery.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; $(function() {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $(&quot;#sticker&quot;).sticker({stickingZone: 100, speed: 50});</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; });</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<p>Начало страницы самое обычное. Мы подключили файл со стилями и добавили какое-то содержимое.</p>
<p>Затем создали блок стикера (строки 17-19).</p>
<p>После этого подключили три js файла. Первый – библиотека <strong>jQuery</strong>, второй – плагин <strong>jQuery UI</strong>, третий – с нашим плагином (его мы создадим чуть ниже).</p>
<p>И сразу же <strong>обратите внимание на использование плагина</strong> (строка 26).</p>
<p>Чтобы превратить блок в стикер, нужно вызвать для него метод <code>sticker</code>, который принимает 2 параметра:</p>
<p><code>stickingZone</code> – максимальное расстояние от стикера до края страницы при котором стикер будет «прилипать» к этому краю (в пикселах);</p>
<p><code>speed</code> – скорость перемещения стикера при «прилипании» (если точнее, это время за которое стикер сместится к краю страницы, в миллисекундах).</p>
<p>Оба параметра не обязательные и если их опустить будут использованы значения, установленные по-умолчанию (30px и 300 мс).</p>
<p>Теперь создадим файл с <acronym title="Cascading Style Sheets">CSS</acronym> стилями (styles.css).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">#sticker</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">position</span>: <span class="kw2">absolute</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">50px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3">150px</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">top</span>: <span class="re3">200px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">left</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re1">.ui-draggable</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">cursor</span>: move;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Зачем нужно абсолютное позиционирование я уже рассказывал, сейчас обратите внимание на второе правило, которое установлено для класса ui-draggable. Этот класс присваивает стикеру плагин jQuery UI после того, как мы делаем его перемещаемым (draggable). С его помощью очень удобно контролировать внешний вид элемента. В данном случае мы просто изменяем вид курсора.</p>
<p>Наконец, <strong>займемся плагином</strong> <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Прежде всего, обратите внимание на название файла. Оно должно начинаться с имени плагина после которого нужно добавить <code>.jquery.js</code>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>$<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">fn</span>.<span class="me1">sticker</span> = <span class="kw2">function</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> settings = $.<span class="me1">extend</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; speed: <span class="nu0">300</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; , stickingZone: <span class="nu0">30</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>, options||<span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> element = $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">draggable</span><span class="br0">&#40;</span><span class="br0">&#123;</span> containment: <span class="st0">&#039;parent&#039;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">bind</span><span class="br0">&#40;</span><span class="st0">&#039;dragstop&#039;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>event, ui<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> rightDistance = $<span class="br0">&#40;</span>window<span class="br0">&#41;</span>.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; ui.<span class="me1">position</span>.<span class="me1">left</span> &#8211; element.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> leftDistance = ui.<span class="me1">position</span>.<span class="me1">left</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>leftDistance &lt; settings.<span class="me1">stickingZone</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">animate</span><span class="br0">&#40;</span><span class="br0">&#123;</span>left : <span class="st0">&quot;0&quot;</span><span class="br0">&#125;</span>, settings.<span class="me1">speed</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>rightDistance &lt; settings.<span class="me1">stickingZone</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> leftCorner = $<span class="br0">&#40;</span>window<span class="br0">&#41;</span>.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; element.<span class="me1">width</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">animate</span><span class="br0">&#40;</span><span class="br0">&#123;</span>left : leftCorner + <span class="st0">&quot;px&quot;</span><span class="br0">&#125;</span>, settings.<span class="me1">speed</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> element;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="br0">&#40;</span>jQuery<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Взгляните на первую и последнюю строки плагина. Мы объявили функцию, которая принимает в качестве параметра <code>$</code>, и сразу же вызвали её с параметром <code>jQuery</code>.</p>
<p>С помощью такого приёма мы получаем возможность использовать внутри нашего плагина функцию <code>$</code> и при этом не создаём проблем другим библиотекам (например, prototype), которые также используют <code>$</code>.</p>
<p>После этого мы создаем новый метод <code>sticker</code> (строка 2) (его название должно совпадать с названием плагина).</p>
<p>На этом этапе плагин создан, и его можно использовать. Правда он ничего не делает.</p>
<p>Исправляем этот недостаток.</p>
<p>1) Если при вызове плагина были указаны параметры, заменяем ими значения, установленные по-умолчанию (строки 3-6).</p>
<p>2) Сохраняем текущий элемент в переменной <code>element</code>.</p>
<p>3) Делаем этот элемент перемещаемым (draggable) (строка 8), параметр <code>containment: 'parent'</code> указывает, что стикер нельзя перемещать за границы родительского элемента.</p>
<p>4) Назначаем обработчик события <code>dragstop</code> (строки 9-19), которое возникает после того как пользователь отпустит стикер.</p>
<p>5) Принцип работы обработчика очень простой. Мы рассчитываем расстояния от стикера до правого и левого края страницы. А после этого сравниваем его с заданным значением (<code>stickingZone</code>). Если условие выполняется, перемещаем стикер к краю страницы. Для этого используем метод <code>animate</code>, в параметрах которого передаем координаты левого края стикера и время, за которое он должен переместиться.</p>
<p>6) Возвращаем текущий элемент (строка 20). Если этого не сделать, плагин работать будет, но мы не сможем использовать цепочки вызовов.</p>
<p>Как видите, плагин для jQuery создать совсем не сложно. Главное понимать, как получить желаемый эффект. В остальном, плагин не на много отличается от обычного метода.</p>
<p>Если возникли вопросы или замечания, пишите в комментариях, обсудим <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=833&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/stiker-sozdaem-plagin-dlya-jquery.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Делаем радио кнопки удобными</title>
		<link>http://www.simplecoding.org/delaem-radio-knopki-udobnymi.html</link>
		<comments>http://www.simplecoding.org/delaem-radio-knopki-udobnymi.html#comments</comments>
		<pubDate>Sat, 02 May 2009 15:01:02 +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=822</guid>
		<description><![CDATA[Сложно представить работу в интернете без использования форм. Но, к сожалению, очень часто удобство их использования оставляет желать лучшего.
В этой заметке я расскажу, как можно значительно увеличить этот показатель для формы с радио кнопками (radio buttons) за счет правильной HTML разметки и нескольких CSS стилей.
Обратите внимание. Применение этих советов никоим образом не сказывается на работоспособности [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_823" class="wp-caption alignnone" style="width: 278px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/radio_buttons_html_css.png" alt="radio buttons html css" title="radio buttons html css" width="268" height="118" style="float:left" class="size-full wp-image-823" /><p class="wp-caption-text"> </p></div>
<p>Сложно представить работу в интернете без использования форм. Но, к сожалению, очень часто удобство их использования оставляет желать лучшего.</p>
<p>В этой заметке я расскажу, как можно значительно увеличить этот показатель для <strong>формы с радио кнопками</strong> (<em>radio buttons</em>) за счет правильной <strong><acronym title="HyperText Markup Language">HTML</acronym> разметки</strong> и нескольких <strong><acronym title="Cascading Style Sheets">CSS</acronym> стилей</strong>.</p>
<p><em>Обратите внимание</em>. Применение этих советов никоим образом не сказывается на работоспособности формы и не изменяет отправляемые данные.</p>
<p>Как говорится «Одна картинка стоит тысячи слов». Поэтому сразу даю ссылки на демонстрационную страничку и архив с файлами примера.<br />
<span id="more-822"></span></p>
<p><a href="http://demosites.org.ua/radiobtn/"><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/2009/05/radiobtn.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<h2>Рассмотрим самый простой вариант разметки</h2>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;p&gt;</span></span><span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;radio&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;simple&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;1&quot;</span> /<span class="kw2">&gt;</span></span> Раз<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;p&gt;</span></span><span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;radio&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;simple&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;2&quot;</span> /<span class="kw2">&gt;</span></span> Два<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;p&gt;</span></span><span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;radio&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;simple&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;3&quot;</span> /<span class="kw2">&gt;</span></span> Три<span class="sc2"><span class="kw2">&lt;/p&gt;</span></span></div>
</li>
</ol>
</div>
<p>Такая <acronym title="HyperText Markup Language">HTML</acronym> разметка создаст три вполне работоспособные радиокнопки, которые входят в одну группу (<code>simple</code>).</p>
<p>В принципе, на этом можно было бы остановиться, ведь кнопки уже работают. Но вот пользоваться ими совсем <strong>неудобно</strong>.</p>
<p>Посетитель должен <strong>точно</strong> попасть мышкой по кнопке, а она совсем небольшая. Промахнулся на пару миллиметров – кнопка не отмечена.</p>
<p>А если при этом форма содержит несколько групп таких кнопок, то раздражение гарантировано.</p>
<h2>Изменяем <acronym title="HyperText Markup Language">HTML</acronym> разметку</h2>
<p>Попробуем исправить ситуацию. Добавим к названиям кнопок тег <code>label</code>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;p&gt;</span></span><span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;radio&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;labeled&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;1&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;labeled_1&quot;</span> /<span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;label</span> <span class="kw3">for</span>=<span class="st0">&quot;labeled_1&quot;</span><span class="kw2">&gt;</span></span>Раз<span class="sc2"><span class="kw2">&lt;/label&gt;</span></span><span class="sc2"><span class="kw2">&lt;/p&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;p&gt;</span></span><span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;radio&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;labeled&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;2&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;labeled_2&quot;</span> /<span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;label</span> <span class="kw3">for</span>=<span class="st0">&quot;labeled_2&quot;</span><span class="kw2">&gt;</span></span>Два<span class="sc2"><span class="kw2">&lt;/label&gt;</span></span><span class="sc2"><span class="kw2">&lt;/p&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;p&gt;</span></span><span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;radio&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;labeled&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;3&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;labeled_3&quot;</span> /<span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;label</span> <span class="kw3">for</span>=<span class="st0">&quot;labeled_3&quot;</span><span class="kw2">&gt;</span></span>Три<span class="sc2"><span class="kw2">&lt;/label&gt;</span></span><span class="sc2"><span class="kw2">&lt;/p&gt;</span></span></div>
</li>
</ol>
</div>
<p>Теперь если кликнуть по описанию (слова «Раз», «Два», «Три») будет нажата соответствующая кнопка. Таким образом, мы увеличиваем площадь кнопки.</p>
<p><em>Примечание</em>. Для связи кнопки с описанием используется атрибуты <code>id</code> и <code>for</code>. <strong>Их значения должны совпадать</strong>.</p>
<p>Кроме того, использование такой разметки значительно упростит работу для устройств чтения с экрана.</p>
<p>Пользоваться кнопками стало удобнее, но это не предел. Попробуем сделать подсветку и ещё больше увеличить площадь кнопки.</p>
<h2>Добавляем <acronym title="Cascading Style Sheets">CSS</acronym> стили</h2>
<p>Для начала сделаем подсветку. Для этого нам потребуется всего одного правило.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">p<span class="re2">:hover</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">background-color</span>: <span class="re0">#efefef</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Теперь если мышка окажется над параграфом, в котором расположена кнопка, его фон станет светло-серым.</p>
<p>Тут нужно учесть один момент. <strong>Нельзя останавливаться на этом этапе</strong>. Сейчас подсвечивается весь параграф, но клик за пределами самой кнопки или текста с описанием ничего не даст. И у посетителя может сложиться впечатление, что форма вообще не работает.</p>
<p>Поэтому нужно сделать так, чтобы клик по всему параграфу включал кнопку.</p>
<p>Для этого нужно чтобы тег <code>label</code> полностью совпадал по площади с тегом <code>p</code>.</p>
<p>Для начала убираем отступы у параграфа.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">p <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">margin</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">padding</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">clear</span>: <span class="kw2">both</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Делаем <code>label</code> блочным элементом</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">label <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">display</span>: <span class="kw2">block</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">padding</span>: <span class="nu0">0</span><span class="re1"><span class="re3">.5em</span></span> <span class="nu0">0</span><span class="re1"><span class="re3">.5em</span></span> <span class="nu0">0</span><span class="re1"><span class="re3">.5em</span></span> <span class="re3">2em</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>После применения этих стилей <code>label</code> станет занимать всю строку. Но где при этом окажется сама кнопка? Она будет находиться за пределами <code>label</code>, точнее над ним, и <strong>не</strong> будет подсвечиваться.</p>
<p>Опускаем её на один уровень с надписью.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">input <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">position</span>: <span class="kw2">relative</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">top</span>: <span class="nu0">0</span><span class="re1"><span class="re3">.5em</span></span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">left</span>: <span class="nu0">0</span><span class="re1"><span class="re3">.5em</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Здесь нужны некоторые пояснения.</p>
<p>Применение правила <code>float: left</code> поместит кнопку внутри блока <code>label</code>, но в верхнем левом его углу, т.е. немного выше текста.</p>
<p>С помощью <code>position: relative; top: 0.5em</code> и <code>left: 0.5em</code> мы смещаем кнопку вниз и вправо на <code>0.5em</code>, т.е. на величину отступов, которые указаны в стилях для <code>label</code>. Кстати, правый отступ (2em) я выбрал таким, чтобы кнопка не накладывалась на текст.</p>
<h2>Заключение</h2>
<p>Как видите, с помощью не хитрых манипуляций можно сделать форму значительно удобнее. Да и у пользователя сложится впечатление, что сайт нормально реагирует на его действия.</p>
<p>Пример тестировался в FireFox 3.0.10, Opera 9.62, <acronym title="Internet Explorer">IE</acronym> 7 и Safari 4 beta. Могут быть проблемы с :hover в <acronym title="Internet Explorer">IE</acronym> 6 и более ранних.</p>
<p>Если есть замечания, буду рад обсудить.</p><img src="http://www.simplecoding.org/?ak_action=api_record_view&id=822&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/delaem-radio-knopki-udobnymi.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
