<?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>Очередной блог фрилансера &#187; jquery</title>
	<atom:link href="http://dreamhelg.ru/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://dreamhelg.ru</link>
	<description>о моей работе в сети и не только</description>
	<lastBuildDate>Fri, 23 Dec 2011 07:10:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>10 отличных jQuery-сниппетов</title>
		<link>http://dreamhelg.ru/2011/11/10-awesome-jquery-snippets/</link>
		<comments>http://dreamhelg.ru/2011/11/10-awesome-jquery-snippets/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 11:39:00 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[изучаем Jquery]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=2207</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2011/11/home.jpg" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>jQuery вдохнул новую жизнь в JavaScript-программирование. Благодаря этому замечательному инструменту, появилась возможность с легкостью создавать мощные и интерактивные страницы. В сегодняшней статье собраны 10 полезных примеров jQuery-кода, которые обязательно вам пригодятся при разработке клиентской стороны сайта.<span id="more-2207"></span>

<h3>Предзагрузка изображений</h3>
Предзагрузка изображений весьма удобна: вместо того чтобы загружать картинку по запросу пользователя, мы предварительно подгружаем их в фоне, для того чтобы они сразу были готовы к показу. С помощью jQuery это делается очень просто, смотрите:

[javascript]
(function($) {
  var cache = [];
  // Аргументами являются пути картинок, относительно текущей страницы
  $.preLoadImages = function() {
    var args_len = arguments.length;
    for (var i = args_len; i--;) {
      var cacheImage = document.createElement('img');
      cacheImage.src = arguments[i];
      cache.push(cacheImage);
    }
  }

jQuery.preLoadImages(&quot;image1.gif&quot;, &quot;/path/to/image2.png&quot;);
[/javascript]

Источник: <a title="http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript" href="http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript">http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript</a>

<h3>Ссылки target=”blank”</h3>
Следующий фрагмент предназначен для того, чтобы все ссылки, имеющие атрибут <strong>rel=”external”, </strong>открывались в новом табе/окне. Код легко можно изменить, например открывать ссылки только с определенным классом.

[javascript]
$('a[@rel$='external']').click(function(){
     this.target = &quot;_blank&quot;;
});

/*
   Использование:
   &lt;a href=&quot;http://www.catswhocode.com&quot; rel=&quot;external&quot;&gt;catswhocode.com&lt;/a&gt;
*/
[/javascript]

Источник: <a title="http://snipplr.com/view/315/-jquery–target-blank-links/" href="http://snipplr.com/view/315/-jquery–target-blank-links">http://snipplr.com/view/315/-jquery–target-blank-links</a>
<h3>Добавление класса тэгу &lt;body&gt; при включенном ява-скрипте</h3>
Этот пример состоит всего из одной строчки, но он является самым простым способом определить включен ли ява-скрипт в клиентском браузере. Если ява-скрипт включен, класс <strong>hasJs</strong> будет добавлен к тегу <strong>&lt;body&gt;.</strong>

[javascript]
$('body').addClass('hasJS');
[/javascript]

Источник: <a title="http://eisabainyo.net/weblog/2010/09/01/10-useful-jquery-snippets/" href="http://eisabainyo.net/weblog/2010/09/01/10-useful-jquery-snippets">http://eisabainyo.net/weblog/2010/09/01/10-useful-jquery-snippets</a>

<h3>Плавная прокрутка по ссылке</h3>
jQuery хорошо известен своей возможностью легко создавать красивые визуальные эффекты. Одним из таких эффектов, является плавная прокрутка страницы, при нажатии на ссылку. Следующий пример демонстрирует пример такой прокрутки страницы, по клику на ссылку с классом <strong>topLink.</strong>

[javascript]
$(document).ready(function() {
	$(&quot;a.topLink&quot;).click(function() {
		$(&quot;html, body&quot;).animate({
			scrollTop: $($(this).attr(&quot;href&quot;)).offset().top + &quot;px&quot;
		}, {
			duration: 500,
			easing: &quot;swing&quot;
		});
		return false;
	});
});
[/javascript]

Источник: <a title="http://snipplr.com/view.php?codeview&amp;id=26739" href="http://snipplr.com/view.php?codeview&amp;id=26739">http://snipplr.com/view.php?codeview&amp;id=26739</a>

<h3>Изменение прозрачности при наведении</h3>
Еще один красивый эффект – очень популярный среди клиентов – эффект затухания элемента при движении мыши. Следующий пример кода, реализует плавное изменение прозрачности картинки при наведении/отведении мыши.

[javascript]
$(document).ready(function(){
    $(&quot;.thumbs img&quot;).fadeTo(&quot;slow&quot;, 0.6); // Эта строчка при загрузке страницы задает всем миниатюрам прозрачность равную 60% 
    
    $(&quot;.thumbs img&quot;).hover(function(){
        $(this).fadeTo(&quot;slow&quot;, 1.0);  // Делаем картинку непрозрачной, при наведении мыши
    },function(){
        $(this).fadeTo(&quot;slow&quot;, 0.6); // Снова возвращаем прозрачность 60%, при отведении мыши
    });
});
[/javascript]

Источник: <a title="http://snipplr.com/view/18606/" href="http://snipplr.com/view/18606">http://snipplr.com/view/18606</a>
<h3>Колонки одинаковой высоты</h3>
При создании сайта с колонками, очень часто требуется, чтобы все колонки были одинаковой высоты, как это можно было сделать в старых, добрых таблицах. Этот пример кода вычисляет высоту самой длинной колонки, и автоматически задает ту же высоту всем остальным.

[javascript]
var max_height = 0;
$(&quot;div.col&quot;).each(function(){
    if ($(this).height() &gt; max_height) { max_height = $(this).height(); }
});
$(&quot;div.col&quot;).height(max_height);
[/javascript]

Источник: <a title="http://web.enavu.com/tutorials/top-10-jquery-snippets-including-jquery-1-4/" href="http://web.enavu.com/tutorials/top-10-jquery-snippets-including-jquery-1-4">http://web.enavu.com/tutorials/top-10-jquery-snippets-including-jquery-1-4</a>

<h3>Включаем HTML5-разметку в старых браузерах</h3>
HTML5 – это будущее клиентской веб-разработки. К сожалению, некоторые старые браузеры не умеют распознавать новые теги, такие как <strong>header</strong> и <strong>section. </strong>Этот пример кода, научит старые браузеры распознавать новые HTML5-тэги.

[javascript]
(function(){if(!/*@cc_on!@*/0)return;var e = &quot;abbr,article,aside,audio,bb,canvas,datagrid,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video&quot;.split(','),i=e.length;while(i--){document.createElement(e[i])}})()
[/javascript]

Еще лучше будет, если вы подключите .js-файл в секции <strong>&lt;head&gt;</strong> вашей html-страницы.

[javascript]
&lt;!--[if lt IE 9]&gt;
&lt;script src=&quot;http://html5shim.googlecode.com/svn/trunk/html5.js&quot;&gt;&lt;/script&gt;
&lt;![endif]--&gt;
[/javascript]

Источник: <a title="http://remysharp.com/2009/01/07/html5-enabling-script/" href="http://remysharp.com/2009/01/07/html5-enabling-script/">http://remysharp.com/2009/01/07/html5-enabling-script/</a>

<h3>Проверяем поддерживает ли браузер определенное CSS3-свойство</h3>
Ниже представлена простая jQuery-функция, проверяющая, поддерживает ли браузер клиента определенное CSS3-свойство. В этом примере, мы проверяем свойство border-radius, но его конечно, легко можно изменить на любое другое.

Обратите внимание, что при указании свойства, вам нужно опустить дефис, чтобы предотвратить ошибку синтаксиса. Поэтому вместо border-radius, вам нужно написать “borderRadius” или “BorderRadius”.

[javascript]
var supports = (function() {
   var div = document.createElement('div'),
      vendors = 'Khtml Ms O Moz Webkit'.split(' '),
      len = vendors.length;

   return function(prop) {
      if ( prop in div.style ) return true;

      prop = prop.replace(/^[a-z]/, function(val) {
         return val.toUpperCase();
      });

      while(len--) {
         if ( vendors[len] + prop in div.style ) {
            // browser supports box-shadow. Do what you need.
            // Or use a bang (!) to test if the browser doesn't.
            return true;
         }
      }
      return false;
   };
})();

if ( supports('textShadow') ) {
   document.documentElement.className += ' textShadow';
[/javascript]

Источник:  <a title="http://snipplr.com/view/44079" href="http://snipplr.com/view/44079">http://snipplr.com/view/44079</a>
<h3>Получаем параметры url</h3>
Получение url-параметров с помощью jQuery – довольно простая задача. Следующий пример это продемонстрирует.

[javascript]
$.urlParam = function(name){
	var results = new RegExp('[\\?&amp;]' + name + '=([^&amp;#]*)').exec(window.location.href);
	if (!results) { return 0; }
	return results[1] || 0;
}
[/javascript]

Источник: <a title="http://snipplr.com/view/26662" href="http://snipplr.com/view/26662">http://snipplr.com/view/26662</a>
<h3>Отключаем клавишу “Enter” в формах</h3>
По умолчанию, форма отправляется на сервер при нажатии клавиши “Enter”. Но для некоторых форм, нажатие этой клавиши может вызвать проблемы. Следующий пример кода, поможет вам предотвратить нежелательную отправку формы, путем отключения клавиши “Enter”, с помощью jQuery.

[javascript]
$(&quot;#form&quot;).keypress(function(e) {
  if (e.which == 13) {
    return false;
  }
});
[/javascript]

Источник: <a title="http://snipplr.com/view/10943/disable-enter-via-jquery/" href="http://snipplr.com/view/10943/disable-enter-via-jquery">http://snipplr.com/view/10943/disable-enter-via-jquery</a>

Перевод статьи “<a href="http://www.catswhocode.com/blog/10-awesome-jquery-snippets">10 awesome jQuery snippets</a>”, автор  <strong>Jean-Baptiste Jung</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2011/11/10-awesome-jquery-snippets/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Эффект неонового текста с помощью CSS и JQuery</title>
		<link>http://dreamhelg.ru/2010/06/neon-text-effect-with-css-and-jquery/</link>
		<comments>http://dreamhelg.ru/2010/06/neon-text-effect-with-css-and-jquery/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 05:00:07 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=2043</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2010/06/home.png" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>В сегодняшней статье, вы узнаете как создать красивый эффект неонового свечения текста, средствами JQuery и CSS, и совсем немного фотошопа. Результат, как обычно можно посмотреть <a href="http://demo.tutorialzine.com/2010/06/neon-text-effect-jquery/demo.html" target="_blank">заранее</a>.<span id="more-2043"></span>
<br/>
<h3>Шаг 1 – Дизайн</h3>
Первым делом, для достижения такого эффекта, нам нужно создать фоновое изображение, содержащее две, слегка отличающиеся версии текста. jQuery будет плавно переключаться между этими изображениями, создавая красивый эффект свечения.

Итак, открываем фотошоп  и создаем новый документ, 650х300 пикселей, в качестве фонового цвета указываем #141414. Для заголовка используйте свой любимый шрифт, в приведенном примере – это Century Gothic, размер 60px.

После этого, Ctrl + клик по иконке текстового слоя в палитре слоев, для выделения всего текста.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/06/i1.png"><img class="aligncenter size-full wp-image-2045" title="i1" src="http://dreamhelg.ru/wp-content/uploads/2010/06/i1.png" alt="" width="620" height="260" /></a>

Используйте инструмент прямоугольного выделения, зажав Shift + Alt, для того, чтобы ограничить выделение текста одним словом.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/06/i2.png"><img class="aligncenter size-full wp-image-2046" title="i2" src="http://dreamhelg.ru/wp-content/uploads/2010/06/i2.png" alt="" width="620" height="260" /></a>

Далее, сохраняя выделение, создайте новый слой под названием “gradients”, и кликните по нему, для активации.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/06/i3.png"><img class="aligncenter size-full wp-image-2047" title="i3" src="http://dreamhelg.ru/wp-content/uploads/2010/06/i3.png" alt="" width="620" height="260" /></a>

Теперь, возьмите инструмент градиента и раскрасьте каждое слово, поочередно переключая выделение между отдельными словами. Выделение отдельных слов требуется для ограничения области действия градиента, к тому же мы предварительно активировали слой “gradients”, с тем, чтобы все изменения были сохранены на нем.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/06/i4.png"><img class="aligncenter size-full wp-image-2048" title="i4" src="http://dreamhelg.ru/wp-content/uploads/2010/06/i4.png" alt="" width="620" height="260" /></a>

После того, как вы раскрасите весь заголовок, дублируйте слой, расположив его ниже основного, и примените другой набор градиентов. В результате, у нас получилась картинка, с двумя разноцветными заголовками, так что мы легко сможем переключаться между ними, путем простого изменения свойства background-position в CSS.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/06/i5.png"><img class="aligncenter size-full wp-image-2049" title="i5" src="http://dreamhelg.ru/wp-content/uploads/2010/06/i5.png" alt="" width="620" height="260" /></a>

Вы найдете psd-файл данного изображения, в архиве с приведенным примером.
<h3>Шаг 2 – XHTML</h3>
XHTML-разметка очень простая, вам понадобится только контейнер (#neonText H1), который будет содержать две версии фона.

[html]
&lt;h1 id=&quot;neonText&quot;&gt;
	Neon Text Effect With jQuery &amp; CSS.
	&lt;span class=&quot;textVersion&quot; id=&quot;layer1&quot;&gt;&lt;/span&gt;
	&lt;span class=&quot;textVersion&quot; id=&quot;layer2&quot;&gt;&lt;/span&gt;
&lt;/h1&gt;
[/html]

Слой layer1, постепенно уменьшая свою прозрачность, создает плавный эффект неонового свечения, за счет того, что он расположен поверх слоя layer2.

Исходя из соображений поисковой оптимизации, мы также создадим текст, соответствующий надписи на картинке, который будет скрыт с помощью отрицательного значения свойства text-indent.
<h3>Шаг 3 – CSS</h3>
Стили, используемые для этого эффекта – также очень простые. Два элемента span, которым назначено одинаковое фоновое изображение, с разницей в позиционировании. Один элемент показывает только верхнюю часть картинки, а второй, только нижнюю.

[css]
/* The two text layers */
#neonText span{
	width:700px;
	height:150px;
	position:absolute;
	left:0;
	top:0;

	background:url('img/text.jpg') no-repeat left top;
}

span#layer1{
	z-index:100;
}

span#layer2{
	background-position:left bottom;
	z-index:99;
}

/* The h1 tag that holds the layers */
#neonText{
	height:150px;
	margin:180px auto 0;
	position:relative;
	width:650px;
	text-indent:-9999px;
}
[/css]

Контейнер #neonText позиционирован относительно, с тем, чтобы внутренние элементы span, располагались точно один над другим. Кроме того, обратите вниманием на свойство text-indent, которое скрывает текстовое содержимое нашего контейнера.

<h3>Шаг 4 – jQuery</h3>
Последнее, что нам осталось сделать – создать анимацию переключения блоков. Поскольку мы используем jQuery (предварительно подключив его на страницу тэгом script), в нашем распоряжении есть два удобных метода fadeIn и fadeOut, которые мы используем в следующем коде.

[javascript]
$(document).ready(function(){

	setInterval(function(){

		// Selecting only the visible layers:
		var versions = $('.textVersion:visible');

		if(versions.length&lt;2){
			// If only one layer is visible, show the other
			$('.textVersion').fadeIn(800);
		}
		else{
			// Hide the upper layer
			versions.eq(0).fadeOut(800);
		}
	},1000);

});
[/javascript]

Функция, расположенная внутри выражения setinterval, выполняется каждую секунду, отображая/скрывая слой с первым контейнером span.

<a href="http://demo.tutorialzine.com/2010/06/neon-text-effect-jquery/demo.zip">Скачать архив с примером</a>.

Перевод статьи “<a href="http://tutorialzine.com/2010/06/neon-text-effect-jquery/">Neon Text Effect With jQuery &amp; CSS</a>”, автор <strong>Martin</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2010/06/neon-text-effect-with-css-and-jquery/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Анимированный ландшафт с помощью CSS и JQuery</title>
		<link>http://dreamhelg.ru/2010/06/animated-landscape-using-css-and-jquery/</link>
		<comments>http://dreamhelg.ru/2010/06/animated-landscape-using-css-and-jquery/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 14:00:31 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[верстка]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[animate]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=2028</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2010/05/home.png" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>С появлением JQuery, многие разработчики, не слишком хорошо знакомые с javascript, начали использовать jQuery, благодаря большому количеству различных эффектов, поддерживаемых этим фреймворком. На сегодняшний день, JQuery является одним из самых популярных ява-скрипт-фреймворков. Такая его популярность объясняется простотой использования и наличием множества замечательных эффектов, для применения которых, не требуется углубленных знаний ява-скрипт. В сегодняшней статье, мы создадим анимированную картинку, с помощью CSS и JQuery.<span id="more-2028"></span>

<h3>Шаг 1. Подготовка файлов</h3>
Для начала, нам необходимо подготовить все файлы, необходимые для этого примера, затем создать один HTML-файл, один CSS-файл и папку, которая будет содержать все наши картинки.

Прежде, чем мы начнем, посмотрите <a href="http://acrisdesign.com/demo/landscape/">демо</a>.

<h3>Шаг 2. HTML-страница</h3>
Теперь, создадим HTML-разметку, которая будет содержать контейнер с фиксированной высотой и шириной, а внутри него будет еще один блок, содержащий все элементы нашей страницы. В результате, у нас получилась вот такая разметка:

[html]
&lt;div id=&quot;wrapper&quot;&gt;
&lt;div id=&quot;inner&quot;&gt;
    &lt;div id=&quot;cloudone&quot;&gt;&lt;img src=&quot;images/clud1.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
    &lt;div id=&quot;cloudtwo&quot;&gt;&lt;img src=&quot;images/clud2.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
    &lt;div id=&quot;cloudthree&quot;&gt;&lt;img src=&quot;images/clud1.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
    &lt;div id=&quot;boat&quot;&gt;&lt;img src=&quot;images/boat.png&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
[/html]

Полная версия:

[html]
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;Animated Landscape Using CSS and jQuery&lt;/title&gt;
&lt;link href=&quot;style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;wrapper&quot;&gt;
&lt;div id=&quot;inner&quot;&gt;
    &lt;div id=&quot;cloudone&quot;&gt;&lt;img src=&quot;images/clud1.png&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;cloudtwo&quot;&gt;&lt;img src=&quot;images/clud2.png&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;cloudthree&quot;&gt;&lt;img src=&quot;images/clud1.png&quot;&gt;&lt;/div&gt;
    &lt;div id=&quot;boat&quot;&gt;&lt;img src=&quot;images/boat.png&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
[/html]

<h3>Шаг 2. CSS-стили</h3>
Далее добавим немного CSS-стилей, без которых просто нельзя обойтись. Здесь следует обратить внимание на два момента – это свойство overflow: hidden, которое обязательно должно быть установлено для блока #inner, и абсолютное позиционирование, для всех, двигающихся картинок. На данном этапе, мы вынесем наши движущиеся изображения (облака и лодку) за пределы контейнера, путем установки отрицательных полей, с тем чтобы в дальнейшем, с помощью JQuery, получить красивый эффект. Далее CSS-код, необходимый для нашего примера:

[css]
#wrapper {
	width:800px;
	height:600px;
       /* main background image with sky, sun, river and ground */
	background-image:url(images/Untitled-3.jpg);
	background-repeat:no-repeat;
	margin-top:10px;
	margin-left:auto;
	margin-right:auto;
	border: 10px solid #666;
}
#inner {
	position:relative;
	overflow:hidden;
	width:800px;
	height:600px;
	margin:0px;
}
#cloudone {
	position:absolute;
	margin-top:2px;
	margin-left:-200px;
	filter:alpha(opacity=80);
  /* CSS3 standard */
        opacity:0.8;
}
#cloudtwo {
	position:absolute;
	margin-top:80px;
	margin-left:-300px;
	filter:alpha(opacity=60);
  /* CSS3 standard */
        opacity:0.6;
}
#cloudthree {
	position:absolute;
	margin-top:60px;
	margin-left:-600px;
	filter:alpha(opacity=70);
  /* CSS3 standard */
        opacity:0.7;
}
#boat {
	margin-top:360px;
	position:absolute;
	margin-left:800px;
}
[/css]

<h3>Шаг 4. jQuery</h3>
Прежде всего, нам необходимо подключить jQuery, к нашей странице:

[html]
&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;
&lt;/script&gt;
&lt;script src=&quot;landscape.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
[/html]


Здесь, мы дважды будем использовать функцию <strong>.animate</strong>, для анимирования облаков и лодки. Кроме того, мы создадим специальную функцию для того, чтобы облака и лодка двигались по кругу. Смотрите пример ниже.

[javascript]
function cloudone(){
    $(&quot;#cloudone&quot;).animate({left:&quot;+=1200px&quot;},10000).animate({left:&quot;-200px&quot;}, 0)
    setTimeout(&quot;cloudone()&quot;,10000);
}
[/javascript]

В приведенном коде происходит следующее: с помощью первой функции <strong>.animate</strong>, мы двигаем объект #cloudone вправо, на 1200 пикселей, причем объект будет двигаться со скользящим эффектом, в течении 10 секунд. Далее, вторая функция <strong>.animate</strong> возвращает объект на исходную позицию, с интервалом 0 секунд. Для того, чтобы снова запустить анимацию, нам необходимо суммировать временные интервалы обоих функций <strong>.animate</strong>, и с помощью функции <strong>setTimeout</strong>, мы сможем снова запустить цикл вращения картинки. Таким образом, можно анимировать все картинки. Далее приведен код, для анимации остальных изображений:

[javascript]
function cloudone(){
   $(&quot;#cloudone&quot;).animate({left:&quot;+=1200px&quot;},10000).animate({left:&quot;-200px&quot;}, 0)
   setTimeout(&quot;cloudone()&quot;,10000);
}
function cloudtwo(){
   $(&quot;#cloudtwo&quot;).animate({left:&quot;+=1500px&quot;},15000).animate({left:&quot;-300px&quot;}, 0)
   setTimeout(&quot;cloudtwo()&quot;,15000);
}
function cloudthree(){
   $(&quot;#cloudthree&quot;).animate({left:&quot;+=2000px&quot;},20000).animate({left:&quot;-600px&quot;}, 0)
   setTimeout(&quot;cloudthree()&quot;,20000);
}
function boat(){
   //This time we need to move boat to left side so we put the margin to 1000px
   $(&quot;#boat&quot;).animate({right:&quot;+=1000px&quot;},20000).animate({right:&quot;-200px&quot;}, 0)
   setTimeout(&quot;boat()&quot;,20000);
}
[/javascript]

Теперь, нам нужно запустить всю нашу анимацию (cloudone(), cloudtwo(), cloudthree), сразу после того, как загрузится страница. Это делается следующим образом:

[javascript]
$(document).ready(function() {
	setTimeout(&quot;cloudone()&quot;,10);
	setTimeout(&quot;cloudtwo()&quot;,10);
	setTimeout(&quot;cloudthree()&quot;,10);
	setTimeout(&quot;boat()&quot;,10);
});
[/javascript]

Весь код, будет выглядеть вот так.

[javascript]
$(document).ready(function() {
	setTimeout(&quot;cloudone()&quot;,10);
	setTimeout(&quot;cloudtwo()&quot;,10);
	setTimeout(&quot;cloudthree()&quot;,10);
	setTimeout(&quot;boat()&quot;,10);
});
function cloudone(){
	$(&quot;#cloudone&quot;).animate({left:&quot;+=1200px&quot;},10000).animate({left:&quot;-200px&quot;}, 0)
	setTimeout(&quot;cloudone()&quot;,10000);
}
function cloudtwo(){
	$(&quot;#cloudtwo&quot;).animate({left:&quot;+=1500px&quot;},15000).animate({left:&quot;-300px&quot;}, 0)
	setTimeout(&quot;cloudtwo()&quot;,15000);
}
function cloudthree(){
	$(&quot;#cloudthree&quot;).animate({left:&quot;+=2000px&quot;},20000).animate({left:&quot;-600px&quot;}, 0)
	setTimeout(&quot;cloudthree()&quot;,20000);
}
function boat(){
	$(&quot;#boat&quot;).animate({right:&quot;+=1000px&quot;},20000).animate({right:&quot;-200px&quot;}, 0)
	setTimeout(&quot;boat()&quot;,20000);
}
[/javascript]

Перевод статьи “<a href="http://acrisdesign.com/2010/04/animated-landscape-using-css-and-jquery/">Animated Landscape Using CSS and jQuery</a>”, автор <strong>Vikas Ghodke</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2010/06/animated-landscape-using-css-and-jquery/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Создание навигации &#8220;волшебная линия&#8221; с помощью jQuery</title>
		<link>http://dreamhelg.ru/2010/02/create-magic-line-navigation-with-jquery/</link>
		<comments>http://dreamhelg.ru/2010/02/create-magic-line-navigation-with-jquery/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 18:41:17 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[верстка]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[animate]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[навигация]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1903</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2010/02/home1.png" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>Такой “скользящий” стиль навигации существует довольно давно, мне всего лишь было нужно изменить его немного под собственные нужды, поскольку появилась такая возможность. Это оказалось очень легко. Можете взглянуть на <a href="http://dreamhelg.ru/demo/magic-line/">два примера</a> такой навигации на демонстрационной странице.<span id="more-1903"></span>
<h3>Идея</h3>
Идея состоит в наличие какой-либо подсветки (фонового изображения или подчеркивания), следующей за мышью, при наведении к какому-либо пункту меню. Это реализуется с помощью анимации jQuery. Следовательно, “волшебную линию” можно добавить только с помощью JavaScript. После того, как линия будет добавлена и стилизована, при движении мыши к любому пункту меню, ее ширина и левое позиционирование будет изменятся с анимационным эффектом.
<h3>HTML</h3>
Здесь обычный маркированный список. Ему назначен класс “group”, так как в примере будет использовано два горизонтальных меню. ID используется для указания элемента JavaScript.

[html]
&lt;div class=&quot;nav-wrap&quot;&gt;
 &lt;ul class=&quot;group&quot; id=&quot;example-one&quot;&gt;
    &lt;li class=&quot;current_page_item&quot;&gt;&lt;a href=&quot;#&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Buy Tickets&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Group Sales&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Reviews&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;The Show&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Videos&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Photos&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Magic Shop&lt;/a&gt;&lt;/li&gt;
 &lt;/ul&gt;
&lt;/div&gt;
[/html]

Обратите внимание, что список заключен внутри блока .nav-wrap. Это сделано в связи с особенностями стилизации. Панель, на которой расположена навигация, растянута на всю ширину экрана, но сама навигация центрирована внутри этой панели.

<h3>CSS</h3>
Здесь мы располагаем список горизонтально, и позиционируем волшебную линию абсолютно, поверх меню. Все остальное – просто наведение красоты.

[css]
.nav-wrap { margin: 50px auto;  background-color: rgba(0,0,0,0.6); border-top: 2px solid white; border-bottom: 2px solid white; }
#example-one { margin: 0 auto; list-style: none; position: relative; width: 960px; }
#example-one li { display: inline-block; }
#example-one li a { color: #bbb; font-size: 14px; display: block; float: left; padding: 6px 10px 4px 10px; text-decoration: none; text-transform: uppercase; }
#example-one li a:hover { color: white; }
#magic-line { position: absolute; bottom: -2px; left: 0; width: 100px; height: 2px; background: #fe4902; }
[/css]

<h3>JQuery JavaScript</h3>
<ol>
	<li>Когда DOM загружен…</li>
	<li>Устанавливаем переменные, включающие текущее левое смещение навигации</li>
	<li>Добавляем волшебную линию к навигации</li>
	<li>Назначаем позиционирование и ширину волшебной линии равной значению текущего элемента списка</li>
	<li>Также назначаем оригинальную ширину и позиционирование в качестве данных, с тем чтобы их можно было использовать для обратной анимации</li>
	<li>При наведении мыши, подсчитываем новую ширину и левое позиционирование, и включаем анимацию для изменения этих значений</li>
	<li>При отведении мыши от пункта меню, включаем анимацию возвращения линии на исходную позицию.</li>
</ol>

[javascript]
$(function() {

    var $el, leftPos, newWidth,
        $mainNav = $(&quot;#example-one&quot;);

    $mainNav.append(&quot;&lt;li id='magic-line'&gt;&lt;/li&gt;&quot;);
    var $magicLine = $(&quot;#magic-line&quot;);

    $magicLine
        .width($(&quot;.current_page_item&quot;).width())
        .css(&quot;left&quot;, $(&quot;.current_page_item a&quot;).position().left)
        .data(&quot;origLeft&quot;, $magicLine.position().left)
        .data(&quot;origWidth&quot;, $magicLine.width());

    $(&quot;#example-one li a&quot;).hover(function() {
        $el = $(this);
        leftPos = $el.position().left;
        newWidth = $el.parent().width();
        $magicLine.stop().animate({
            left: leftPos,
            width: newWidth
        });
    }, function() {
        $magicLine.stop().animate({
            left: $magicLine.data(&quot;origLeft&quot;),
            width: $magicLine.data(&quot;origWidth&quot;)
        });
    });
});
[/javascript]

<h3>Альтернативная версия</h3>
На демонстрационной <a href="http://dreamhelg.ru/demo/magic-line/">странице</a>, также имеется альтернативная версия “волшебной” линии, использующая фон вместо линии, и анимирующей цвет вместе с шириной и левым позиционированием. В основе все то же самое, отличается разве что CSS и JavaScript, который получает цвет для нового элемента списка, из HTML-атрибута rel. Для анимации цвета, потребуется <a href="http://plugins.jquery.com/files/jquery.color.js.txt">специальный плагин</a>.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/02/magicline.zip">Скачать архив с примером</a>.

Перевод статьи “<a href="http://css-tricks.com/jquery-magicline-navigation/">jQuery MagicLine Navigation</a>”, автор <strong>Chris Coyier</strong>

<strong>Примечение:</strong>
После небольшой доработки, скрипт нормально работает в опере и IE7-8, насчет IE6 не знаю, не тестировала.]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2010/02/create-magic-line-navigation-with-jquery/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Создание формы со скользящими подписями</title>
		<link>http://dreamhelg.ru/2010/01/create-form-with-sliding-labels/</link>
		<comments>http://dreamhelg.ru/2010/01/create-form-with-sliding-labels/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 08:47:34 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[верстка]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[label]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1850</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2010/01/home1.png" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>Пару недель назад, я читал статью <a href="http://www.lukew.com/">Люка Вроблевски</a>. Для тех, кто еще не слышал о нем, Люк -  автор книги о правильном дизайне веб-форм.

В его статье, меня особенно заинтересовала часть, о расположении подписей внутри текстовых полей:<span id="more-1850"></span>
<br/>
<p><blockquote><em>Поскольку подписи, расположенные внутри текстовых полей, исчезают при вводе текста, вместе с ними исчезает контекст введенных данных. Так что, если вы вдруг забудете, на какой вопрос вы ввели ответ, значит вам не повезло – подпись к полю вы, скорее всего нигде не найдете. Из этого следует, что подписи, расположенные внутри текстовых полей – не самое лучшее решение для создания длинных форм. Когда вы заполните форму до конца, все подписи пропадут! В этом случае, гораздо сложнее будет вернутся и проверить свои ответы.</em>

<em>Люк Вроблевски</em></blockquote></p>

Эти слова стали хорошим поводом для размышления. Конечно, вы можете взглянуть на поле со значением “Вася Пупкин”, и точно сказать что это поле для ввода имени. Но в случае с длинными формами, очень легко забыть вопросы, на которые вы отвечали.

Самым лучшим решением, по мнению Люка, является размещение подписей за пределами текстового поля, с тем, чтобы они всегда были доступны для пользователя. Я думаю это неплохое решение, но мы можем придумать кое-что поинтереснее.
<h3>Скользящие подписи</h3>
После прочтения этой статьи, мне пришло в голову, что мы вполне можем использовать преимущества каждого из методов. Мне нравится как выглядят подсказки внутри полей, но тем не менее, я согласен с тем, что она всегда должна оставаться на экране. Но, к счастью у нас в распоряжении есть JQuery, мы знакомы с принципом постепенного улучшения, поэтому давайте создадим подписи, расположенные внутри текстовых полей, которые, вместо того, чтобы исчезать, будут сдвигаться влево (или вверх, как вам больше хочется), при клике по текстовому полю.

<h3>HTML</h3>

[html]
&lt;form action=&quot;&quot; method=&quot;post&quot; id=&quot;info&quot;&gt;
    &lt;h2&gt;Контактная информация&lt;/h2&gt;
    &lt;div id=&quot;name-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;name&quot;&gt;
            Имя
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot;&gt;
    &lt;/div&gt;&lt;!--/#name-wrap--&gt;
    &lt;div id=&quot;email-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;email&quot;&gt;
            E&amp;ndash;mail
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;email&quot; name=&quot;email&quot;&gt;
    &lt;/div&gt;&lt;!--/#email-wrap--&gt;
    &lt;div id=&quot;street-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;st&quot;&gt;
            Город
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;st&quot; name=&quot;st&quot;&gt;
    &lt;/div&gt;&lt;!--/#street-wrap--&gt;
    &lt;div id=&quot;city-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;city&quot;&gt;
            Улица
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;city&quot; name=&quot;city&quot;&gt;
    &lt;/div&gt;&lt;!--/#city-wrap--&gt;
    &lt;div id=&quot;zip-wrap&quot; class=&quot;slider&quot;&gt;
        &lt;label for=&quot;zip&quot;&gt;
            Индекс
        &lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;zip&quot; name=&quot;zip&quot;&gt;
    &lt;/div&gt;&lt;!--/#zip-wrap--&gt;
    &lt;input type=&quot;submit&quot; id=&quot;btn&quot; name=&quot;btn&quot; value=&quot;отправить&quot;&gt;
&lt;/form&gt;
[/html]

Единственным необходимым элементом, для создания скользящих подписей (в моей реализации), является оборачивающий элемент (в моем примере DIV), и применение к нему класса “slider” (это легко можно изменить в JavaScript).

На этом этапе, у нас получилась очень простая, и некрасивая форма:
<p style="text-align: center;"><img class="aligncenter" src="http://dreamhelg.ru/wp-content/uploads/2010/01/one_thumb.jpg" alt="one" width="292" height="266" /></p>

<h3>CSS</h3>
[css]
body {
    font: 12px / 1.3 Arial, Sans-serif;
}

form {
    width: 360px;
    padding: 10px 20px 30px 60px;
    margin: auto;
    background: #f7f7f7;
    border: 1px solid #ddd;
}

div {
    clear: both;
    position: relative;
    margin: 0 0 10px;
}

label {
    cursor: pointer;
    display: block;
}

input[type =
&quot;text&quot;] {
    width: 300px;
    border: 1px solid #999;
    padding: 5px;
    -moz-border-radius: 4px;
}

input[type =
&quot;text&quot;]:focus {
    border-color: #777;
}

input[name =
&quot;zip&quot;] {
    width: 150px;
}

/* submit button */
input[type =
&quot;submit&quot;] {
    cursor: pointer;
    border: 1px solid #999;
    padding: 5px;
    -moz-border-radius: 4px;
    background: #eee;
}

input[type =
&quot;submit&quot;]:hover, input[type = &quot;submit&quot;]:focus {
    border-color: #333;
    background: #ddd;
}

input[type =
&quot;submit&quot;]:active {
    margin-top: 1px;
}
[/css]

Единственный, 100%-необходимый CSS в этом примере – это применение position: relatve, к оборачивающему элементу (DIV). Все остальное используется только для настройки внешнего вида формы, вы можете изменять его по своему вкусу.

Теперь у нас получилась вполне симпатичная форма, в которой подписи расположены сверху непосредственных полей ввода.
<p style="text-align: center;"><img class="aligncenter" title="two" src="http://dreamhelg.ru/wp-content/uploads/2010/01/two.jpg" alt="two" width="384" height="392" /></p>

<h3>jQuery</h3>
Теперь, раздел, который все обычно пропускают, переходя к демо-странице:

[javascript]
$('form#info .slider label').each(function(){
	var labelColor = '#999';
	var restingPosition = '5px';

	// стилизация и позиционирование подписей 
	$(this).css({
		'color' : labelColor,
		 	'position' : 'absolute',
	 		'top' : '6px',
			'left' : restingPosition,
			'display' : 'inline',
    	               'z-index' : '99'
	});

	// получение введенного в поле, значения
	var inputval = $(this).next('input').val();

	// получение длины подписи, и добавление к ней 5px 
	var labelwidth = $(this).width();
	var labelmove = labelwidth + 5;

	//проверяем, если поле заполнено, то сдвигаем подпись за пределы поля
	if(inputval !== ''){
		$(this).stop().animate({ 'left':'-'+labelmove }, 1);
	}    	

	// если значение поля пустое при фокусе, сдвигаем подпись влево
	// если оно осталось пустым, при потере фокуса, возвращаем их обратно
	$('input').focus(function(){
		var label = $(this).prev('label');
		var width = $(label).width();
		var adjust = width + 5;
		var value = $(this).val();

		if(value == ''){
			label.stop().animate({ 'left':'-'+adjust }, 'fast');
		} else {
			label.css({ 'left':'-'+adjust });
		}
	}).blur(function(){
		var label = $(this).prev('label');
		var value = $(this).val();
		if(value == ''){
			label.stop().animate({ 'left':restingPosition }, 'fast');
		}
	});
})
[/javascript]

Вот и все, у вас должна получится полностью работающая форма со скользящими подписями.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/01/final.jpg"><img class="aligncenter size-full wp-image-1857" title="final" src="http://dreamhelg.ru/wp-content/uploads/2010/01/final.jpg" alt="" width="373" height="312" /></a>

Обратите внимание, что форма остается рабочей, даже с отключенным ява-скриптом, это является основным принципом постепенного улучшения. Верите или нет, но все еще остаются люди, не использующие ява-скрипт при просмотре веб-страниц.

<a href="http://dreamhelg.ru/demo/sliding-labels/index.htm">Демонстрационная страница</a>.
<a href="http://dreamhelg.ru/wp-content/uploads/2010/01/demo.zip">Архив с примером</a>.

Перевод статьи “<a href="http://www.csskarma.com/blog/sliding-labels/">Form Design with Sliding Labels</a>”, автор <strong>Tim Wright</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2010/01/create-form-with-sliding-labels/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Анимация jQuery: изучение за 7 шагов</title>
		<link>http://dreamhelg.ru/2010/01/jquery-animation-a-7-step-program/</link>
		<comments>http://dreamhelg.ru/2010/01/jquery-animation-a-7-step-program/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 08:15:48 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[изучаем Jquery]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[animate]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquery UI]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1823</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2010/01/200x200.jpg" class="attachment-200x200 wp-post-image" alt="200x200" title="200x200" /></p>Небольшой штрих анимации может украсить любой, скучный интерфейс. В сегодняшней статье, вы узнаете, как правильно ее использовать с помощью jQuery.<span id="more-1823"></span>

<h3>Вступление</h3>
Анимация – понятие, которое обычно вызывает неоднозначную реакцию у людей. Одни считают ее полезной, другие осуждают ее чрезмерное использование. Несмотря на это, правильно используемая анимация, зачастую украшает пользовательский интерфейс, и делает его более опрятным и живым. В сегодняшней статье, мы коротко рассмотрим основы jQuery, затем научимся создавать нашу первую анимацию, научимся строить различные эффекты, а затем создадим анимацию, которую вполне можно будет использовать в реальных проектах.

<h3>Шаг 1. Основы jQuery</h3>
jQuery – это JavaScript библиотека, которая призвана помочь разработчику создавать многофункциональные, интерактивные веб-сайты и пользовательские интерфейсы, с использованием минимально возможного количества кода.

Обычная строка кода, выглядит следующим образом:

[javascript]$(DOM Element).something();[/javascript]

Давайте разберем каждую часть:
<ul>
	<li><strong>$</strong> - Сокращение для объекта jQuery. Если вы одновременно используете несколько фреймворков на одной странице, вместо знака $, воспользуетесь сокращением jQuery:  jQuery(DOM Element).something();</li>
	<li><strong>(DOM Element) </strong>– Элемент, с которым вы собираетесь что-то сделать. Это одна из ключевых особенностей jQuery. Вы можете использовать CSS-селекторы для получения нужного элемента. Любые селекторы, работающие в CSS-файле, могут быть использованы здесь. ID, классы, псевдо-классы, все что угодно.</li>
	<li><strong>.something() </strong>– То, что вы хотите сделать с полученным элементом. Это может быть все что угодно от простого скрытия элемента до создания AJAX-запроса к обработчику события.</li>
</ul>

Сегодня мы рассмотрим только анимацию, и эффекты, связанные с ее функциональностью.

<h3>Шаг 2. Использование встроенных эффектов</h3>
jQuery предоставляет большое количество встроенных методов, которые вы можете использовать прямо из коробки. Это методы для отображения/скрытия элементов, с различными вариациями, включающими скольжение элемента и изменение его прозрачности. Вы также можете использовать ряд методов <strong>toggle</strong>, которые переключают видимость элемента.

Прежде чем мы рассмотрим каждый из этих методов, посмотрите на основной формат вызова каждого метода:

[javascript]$(&quot;#element&quot;).effect([speed, callback]);[/javascript]

Выше представлена основная парадигма jQuery, сначала мы получаем необходимый элемент, используя CSS-селекторы. Далее, мы просто вызываем любой  из встроенных методов.

Несмотря на то, что большинство методов можно вызвать без параметров, часто возникает необходимость настроить их функциональность. Каждый из методов принимает как минимум два параметра: <strong>speed</strong> и <strong>callback</strong>.

<strong>speed</strong> – определяет продолжительность анимации в секундах. Вы можете передать в качестве значения одно из ключевых слов: slow, normal или fast; или задать время в миллисекундах.

<strong>callback</strong> - это функция, которая выполняется после того как анимация завершена. Вы можете использовать ее для чего угодно, например, сделать AJAX-вызов в фоне, обновить часть пользовательского интерфейса и многое другое. Вы ограничены только своим воображением.

Далее представлен список функций, всходящий в состав jQuery:
<ul>
	<li><strong>show</strong>/<strong>hide</strong> – Методы для отображения и скрытия элемента. Принимают в качестве параметров speed и callback.</li>
	<li><strong>toggle</strong> – Метод, манипулирующий с отображением элемента, в зависимости от текущего состояния элемента. То есть если он скрыт, то отображает его и наоборот. Использует методы show и hide.</li>
	<li><strong>slideDown</strong>/<strong>slideUp</strong> – Вполне очевидные методы. Изменяя высоту элемента, создается скользящая анимация, отображающая или наоборот скрывающая элемент.</li>
	<li><strong>slideToggle</strong> – Практически то же самое что и метод toggle, за исключением того, что здесь используются методы slideDown/slideUp, для отображения/скрытия элемента.</li>
	<li><strong>fadeIn</strong>/<strong>fadeout</strong> – Изменение прозрачности элемента, для создания эффекта затухания.</li>
	<li><strong>fadeTo</strong> – Изменяет прозрачность элемента в соответствии с переданным значением.  Как нетрудно догадаться, он принимает дополнительный параметр opacity, где 0 это полная прозрачность, а 1 полная непрозрачность.</li>
</ul>

В качестве дополнительной функциональности, метод <strong>toggle</strong>, может принимать в качестве параметра выражение, решающее отображать элемент, или прятать.

Например, если вы хотите переключать только те элементы списка, которые имеют класс <em>effect</em>, ваш код будет выглядеть следующим образом:

[javascript]$(&quot;li&quot;).toggle( $(this).hasClass(&quot;effect&quot;) );[/javascript]

Проще говоря, функция <strong>toggle</strong> проверяет выражение, переданное ему в качестве параметра, и если оно истинно, то он переключает видимость элемента. Выражение, которые мы передали, в примере, проверяет наличие у элемента определенного класса.

<h3>Шаг 3. Создание собственной анимации</h3>
Очень часто, встроенные методы не удовлетворяют вашим потребностям, в этом случае вы, скорее всего, захотите создать свои собственные эффекты. С помощью jQuery вы легко сможете это сделать .

Чтобы создать персональный анимационный эффект, вам понадобится метод <strong>animate</strong>. Это выглядит следующим образом:

[javascript]$(&quot;#somelement&quot;).animate({property: value}, [speed, callback] );[/javascript]

Метод <strong>animate</strong> весьма похож на любые другие методы тем, что используется точно так же. Мы получаем элемент, и затем передаем ему некоторые параметры. Принимаемые параметры – это то, в чем метод <strong>animate</strong> отличается от готовых эффектов.

Параметры speed и callback выполняют те же функции, что и в предыдущих методах. Объект со свойствами, состоящими из определенного количества пар ключ/значение – то, что делает этот метод уникальным. Вы передаете каждое свойство, которое хотите анимировать, вместе с финальным результатом. Например, предположим, вы хотите анимировать изменение ширины элемента, на 90% от его текущего значения. Это можно сделать следующим образом:

[javascript]
$(&quot;#somelement&quot;).animate({width: &quot;90%&quot;}, 350, function(){
         alert (&quot;The animation has finished running.&quot;);
  }
);
[/javascript]

Указанный пример кода, анимирует изменение ширины на 90%, а затем выдает сообщение, что анимация завершена.

Заметьте, что вы не ограничены в количестве. Вы можете добавить анимацию большому массиву свойств, включая прозрачность, поля, отступы, рамки, размеры шрифтов. Метод <strong>animate</strong>, удобен еще и потому, что может работать с любыми единицами измерения. Пиксели, ems, проценты – все работает. Так что, даже, представленный ниже, запутанный пример кода, будет работать. Правда выглядеть будет не очень понятно.

[javascript]
$(&quot;#somelement&quot;).animate({  
width: &quot;90%&quot;  
fontSize: &quot;14em&quot;,  
height: &quot;183px&quot;,  
opacity: 0.8,  
marginTop: &quot;2cm&quot;,  
marginLeft: &quot;0.3in&quot;,  
borderBottom: &quot;30mm&quot;,  
}, 350, function(){alert (&quot;The animation has finished running.&quot;);}); 
[/javascript]

При указании свойства, состоящего из нескольких слов, оно записывается без тире, и первая буква второго слова должна быть заглавной. Такая запись значительно отличается от привычного синтаксиса CSS, поэтому обязательно постарайтесь это запомнить. Например, свойство <strong>border-top</strong>, следует записывать  <strong>borderTop</strong>.

<blockquote><strong>Обратите внимание</strong>: jQuery позволяет анимировать только числовые значения свойств. Это значит, что вы не сможете анимировать цветовые свойства, используя только jQuery. Но все не так плохо. С небольшой помощью jQuery UI, вы сможете добавить анимацию цвета очень легко.</blockquote>

<h3>Шаг 4. Настройка эффекта</h3>
Если вы рассмотрите простой эффект на демонстрационной странице, то возможно заметите небольшую ошибку. Многократное наведение мыши на элемент, приводит к образованию длинной очереди из повторяющихся анимационных эффектов. В результате появляется неприятный, дергающийся эффект.

Самый простой способ решить эту проблему – использовать метод <strong>stop</strong>, непосредственно до начала анимации.  Этот метод отлично очищает очередь, и анимация выполняется в обычном режиме.

Например, это ваш обычный код:

[javascript]
$(&quot;#someelement&quot;)  
  .hover(function() {  
    $(this).animate({ top: 20 }, 'fast');  
  }, function() {  
    $(this).animate({ top: 0 }, 'fast');  
  });  
[/javascript]

Используя метод <strong>stop</strong> для предотвращения лишних повторений анимации, ваш новый код будет выглядеть вот так:

[javascript]
$(&quot;#someelement&quot;)  
  .hover(function() {  
    $(this).stop().animate({ top: 20 }, 'fast');  
  }, function() {  
    $(this).stop().animate({ top: 0 }, 'fast');  
  });  
[/javascript]

Очень просто, правда? Но этот метод имеет одну небольшую проблему. Быстрые движения не приводят к повторяющемуся эффекту, но за это приходится расплачиваться неполной анимацией. Если вы хотите полностью решить эту проблему, вам понадобится плагин наподобие <a href="http://www.2meter3.de/code/hoverFlow/">hoverFlow</a>.

<h3>Шаг 5.  Добавление реализма – Easing</h3>
Если хотите добавить чуть больше реализма, вам понадобится дополнительный контроль над скоростью, с которой выполняется анимация. Вот здесь нам на помощь приходит easing. <strong>Easing</strong> контролирует ускорение и замедление анимации по времени.

Метод, который <strong>easing</strong> использует по умолчанию, называется <strong>swing</strong>, он встроен в базовый функционал jQuery. <a href="http://gsgd.co.uk/sandbox/jquery/easing/">Плагин Роберта Пеннера easing</a>, позволит вам использовать несколько различных эффектов.

Существует только одно предостережение, когда речь идет об использовании персональных эффектов easing:  вы можете использовать их только вместе со специальными эффектами анимации, то есть, с методом <strong>animate()</strong>. После того, как вы подключили плагин, использовать любой метод easing очень просто, передав его в качестве параметра:

[javascript]
$(&quot;#somelement&quot;).animate({  
width: &quot;90%&quot;  
height: &quot;183px&quot;,  
}, 550, &quot;easeInElastic&quot;); 
[/javascript]

Вы можете проверить, как выглядят различные эффекты easing в действии, на демо-странице, в соответствующем разделе. И хотя некоторые из эффектов не подходят ко всем ситуациям, ваша анимация будет выглядеть гораздо более привлекательной при правильном использовании некоторых методов easing.

<h3>Шаг 6. Поднимаемся на ступеньку выше – jQuery UI</h3>
Апгрейд до jQuery UI приносит нам ряд необходимых функций. Фактически, для использования дополнительных функций, вам не потребуется полная библиотека. Для получения нужной функциональности, вам потребуются встроенные эффекты. Не само ядро UI, только файл со встроенными эффектами, который весит около 10 килобайт.

Наиболее важными функциями, которые предоставляет библиотека эффектов jQuery UI, является поддержка анимации цветов, easing и переходы классов.

Если помните, я уже говорил, что в jQuery анимацию можно применить только к числовым значениям. С jQuery UI об этом ограничении можно забыть. Теперь вы легко сможете анимировать фоновый цвет элемента, цвет рамки и тому подобное. Кроме того, вместо того чтобы создавать отдельные функции для новых возможностей, jQuery UI просто расширяет базовый функционал <strong>animate</strong>. То есть, если вы включили библиотеку в свою страницу, то можете использовать обычный метод <strong>animate</strong>, и он сделает всю грязную работу за вас.

Например, если вы хотите анимировать цвет рамки элемента, при наведении, то ваш код будет выглядеть следующим образом:

[javascript]
$(&quot;.block&quot;).hover(function() {  
    $(this).animate({ borderColor: &quot;black&quot; }, 1000);  
},function() {  
    $(this).animate({ borderColor: &quot;red&quot; }, 500);  
});  
[/javascript]

Переходы классов отвечают за анимацию между классами. При использовании базовой библиотеки jQuery, если вы удаляете, а затем добавляете класс, изменяющий внешний вид элемента, то это происходит мгновенно. Когда в вашем распоряжении имеется библиотека UI, вы получаете возможность передавать дополнительные параметры, управляющие скоростью анимации, метод <strong>easing</strong> и <strong>callback</strong>. Эта функциональность, как и предыдущие, является надстройкой над существущим API jQuery, облегчающей процесс перехода.

<h3>Шаг 7. Создание первого, настоящего эффекта</h3>
Все вышеуказанные примеры являются всего лишь демо-версиями функциональности. Неплохо было бы использовать их для создания настоящего эффекта. Именно этим мы и займемся. Наш эффект не будет чем-то радикальным или особенным, но с его помощью, вы узнаете как применить полученные знания на практике.

Предположим, нам нужно отобразить картинку, внутри которой будут появляться две секции, при наведении мыши. Верхняя секция будет содержать заголовок картинки, нижняя – ее краткое описание. Я знаю, что вы можете найти огромное количество различных плагинов, которые делают то же самое, но сегодня мы сделаем это с нуля. Это не так сложно, как кажется. Фактически, это очень просто и делается довольно быстро. Давайте начнем.
<h3>HTML</h3>
Для начала нам понадобится HTML-основа

[html]
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en-GB&quot;&gt;
&lt;head&gt;
&lt;title&gt;Анимация с JQuery для начинающих&lt;/title&gt;
&lt;link type=&quot;text/css&quot; href=&quot;css/style.css&quot; rel=&quot;stylesheet&quot; /&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jqueryui.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/mojo.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;div id=&quot;container&quot;&gt;

&lt;h1&gt;Анимация с JQuery для начинающих&lt;/h1&gt;

&lt;div class=&quot;bblock&quot;&gt;
&lt;h2&gt;Простой пример использования&lt;/h2&gt;
&lt;p&gt;
	Простой пример использования возможностей анимации jQuery.
	Наведите курсор на картинку, чтобы увидеть ее название и описание.
	При отведении мыши, они скроются. При наведении курсора на блоки с названием и описанием изображения, они изменят фоновый цвет.
&lt;/p&gt;	

&lt;p&gt;Анимация использует easing, для создания большей привлекательности.&lt;/p&gt;

&lt;div class=&quot;item&quot;&gt;
&lt;div class=&quot;title&quot;&gt;ThemeForest&lt;/div&gt;
&lt;img src=&quot;images/tf.jpg&quot; alt=&quot;Image&quot; /&gt;
&lt;div class=&quot;desc&quot;&gt;Сайт, где вы найдете множество шаблонов и тем&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;item last&quot;&gt;
&lt;div class=&quot;title&quot;&gt;CodeCanyon&lt;/div&gt;
&lt;img src=&quot;images/cc.jpg&quot; alt=&quot;Image&quot; /&gt;
&lt;div class=&quot;desc&quot;&gt;Сайт, содержащий множество скриптов и примеров кода.&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;!-- Rest of the code for the demo --&gt;  
&lt;/div&gt;  
&lt;/body&gt;  
&lt;/html&gt;  
[/html]

Для этого эффекта, нам нужно продумать структуру каждого элемента. Каждый элемент будет заключен в div, с классом <em>item</em>. Внутри дива, будет размещено три элемента: картинка, и два дива, содержащих название и описание картинки.

Остальные части довольно простые. Нам понадобится подключить на страницу библиотеку jQuery, jQuery UI и файл, содержащий наш персональный код. Помните, что нам необходимы только эффекты jQuery UI, если вы хотите включить больше эффектов, вам понадобится специальная сборка, скачать которую можно здесь.

Вот так будет выглядеть наша страница на этом этапе.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/01/before_css.jpg"><img class="aligncenter size-full wp-image-1837" title="before_css" src="http://dreamhelg.ru/wp-content/uploads/2010/01/before_css.jpg" alt="" width="469" height="606" /></a>
<h3>CSS</h3>

[css]
.item {  
    position: relative;  
    margin: 20px 60px 40px 0;  
    overflow: hidden;  
}  
  
.item .title, .item .desc {  
    background: #000;  
    color: #fff;  
    position: absolute;  
    display: block;  
    width: 638px;  
    opacity: 0.4;   
}  
  
.item .title {  
    top: 0;  
    font-size: 16px;  
    padding: 12px 10px 25px 0;  
    text-align: rightright;  
}  
  
.item .desc {  
    bottombottom: 0;  
    font-size: 12px;  
    padding: 5px 0 15px 10px;  
}  
[/css]

Здесь есть несколько моментов, на которые вам стоит обратить внимание. Каждому элементу установлено свойство <em>position</em> в значение <em>relative</em>, для того чтобы внутри этого элемента легко было расположить другие. Также, блокам назначено свойство <em>overflow: hidden</em>, с тем, чтобы мы могли скрывать название и описание картинки снаружи, когда они не нужны.

Блокам, которые содержат название и описание, установлено свойство <em>position: absolute</em>, так что они точно позиционируются внутри блока с картинкой. Заголовку назначена координата <em>top: 0</em>, так что он располагается вверху, а описанию <em>bottom: 0</em>, и он соответственно, расположен внизу.

Остальной CSS очень простой, назначены стили для шрифтов, немного позиционирования. Ничего особенного.

Теперь наша страница выглядит вот так.

<a href="http://dreamhelg.ru/wp-content/uploads/2010/01/with_css.jpg"><img class="aligncenter size-full wp-image-1838" title="with_css" src="http://dreamhelg.ru/wp-content/uploads/2010/01/with_css.jpg" alt="" width="471" height="610" /></a>
<h3>Включаем JavaScript-магию</h3>

[javascript]
$(document).ready(function()   
{  
    // Code for other parts of the demo  
      
    $(&quot;.item&quot;).children(&quot;div.title&quot;).animate({top: -60}, 300);  
    $(&quot;.item&quot;).children(&quot;div.desc&quot;).animate({bottom: -40}, 300);  
      
$(&quot;.item&quot;).hover(  
        function()  
        {  
            $(this).children(&quot;div.title&quot;).stop().animate({top: 0}, 700, &quot;easeOutBounce&quot;);  
            $(this).children(&quot;div.desc&quot;).stop().animate({bottom: 0}, 700, &quot;easeOutBounce&quot;);  
        },  
        function(){  
            $(this).children(&quot;div.title&quot;).stop().animate({top: -60}, 500);  
            $(this).children(&quot;div.desc&quot;).stop().animate({bottom: -40}, 400);  
        }  
        );  
      
$(&quot;.title, .desc&quot;).hover(  
        function()  
        {  
            $(this).stop().animate({backgroundColor: &quot;#444&quot;}, 700, &quot;easeOutSine&quot;);  
        },  
        function(){  
            $(this).stop().animate({backgroundColor: &quot;#000&quot;}, 700);  
        }  
        );  
});
[/javascript]

Возможно, это выглядит немного сложно, но на самом деле это не так. Давайте рассмотрим каждую часть.

Логика этого эффекта очень проста. Поскольку мы позиционировали элементы абсолютно, сначала мы прячем их за пределами блока с картинкой. При наведении мыши на изображения, нам нужно просто вернуть их обратно, к изначальному положению.

Сначала мы передвигаем заголовок и описание за пределы родительского блока. Но вместо того, чтобы использовать CSS, мы делаем это помощью JavaScript, по весьма конкретным причинам. Даже если JS будет отключен, страница все равно останется функциональной. Заголовок и описание останутся поверх изображения, и будут выглядеть так, как будто применен эффект наведения. А вот если бы мы скрыли эти блоки с помощью CSS, и JS на странице был бы отключен, то они так бы и не появились на экране.

Наш код начинается с создания функции <strong>hover</strong> для каждого элемента. Первая функция выполняется при наведении мыши, вторая – наоборот, при отведении.

Внутри функции, <strong>this</strong> – указывает на элемент, который вызвал событие. Мы используем метод <strong>animate</strong>, для изменения соответствующих значений. Мы также используем <strong>easing</strong>, для добавления большей привлекательности нашему эффекту. При отведении мыши, мы просто изменяем значения к их изначальному состоянию.

В качестве небольшого дополнения, если навести курсор на блоки с заголовком или описанием, они медленно изменят цвет, спасибо jQuery UI.

Вот и все, наш эффект готов к использованию. Можете посмотреть на <a href="http://dreamhelg.ru/demo/animate-7-steps/code.html">результат</a> и <a href="http://dreamhelg.ru/wp-content/uploads/2010/01/animate.zip">скачать архив</a> с приведенными примерами.

Перевод статьи «<a href="http://net.tutsplus.com/tutorials/javascript-ajax/jquery-animations-a-7-step-program/">jQuery Animations: A 7-Step Program</a>», автор <strong>Siddharth</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2010/01/jquery-animation-a-7-step-program/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Фантастическая CSS3 лайтбокс галерея с помощью jQuery</title>
		<link>http://dreamhelg.ru/2009/12/fancy-lightbox-css3-image-gallery-with-jquery/</link>
		<comments>http://dreamhelg.ru/2009/12/fancy-lightbox-css3-image-gallery-with-jquery/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 11:31:42 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[верстка]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[drag-and-drop]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1789</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2009/12/home.png" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>С удовольствием принимаю эстафету по обзору полезных зарубежных ресурсов, предложенную блоггером <a href="http://cuprum.name/">cuprum</a>, и сегодня, хочу представить вашему вниманию англоязычный блог - <a href="http://tutorialzine.com">tutorialzine.com</a>. Этот блог отличается от других, главным образом тем, что в нем регулярно публикуются очень красивые, а главное полезные, готовые решения для веб-разработчика. И сегодняшняя статья – не исключение.<span id="more-1789"></span>

В сегодняшней статье, мы создадим отличную фото-галерею, которая использует новейшие техники <strong>CSS3</strong> и <strong>Jquery</strong>. Созданный нами скрипт, будет сканировать папку с картинками на вашем веб-сервере, и строить на основе полученных данных полноценную drag-and-drop галерею.

Это решение будет SEO-дружелюбным, кроме того оно будет работать даже с браузерами, выпущенными в одно время с IE6 (за исключением потери нескольких красивых эффектов).

Мы будем использовать <strong>jQuery</strong>, <strong>jQuery UI</strong> (для реализации drag-and-drop) и плагин jQuery <a href="http://fancybox.net/">fancybox</a> в дополнение к PHP и CSS, для интерактивности и стилизации.

Прежде чем мы начнем, взгляните на конечный <a href="http://demo.tutorialzine.com/2009/11/hovering-gallery-css3-jquery/demo.php">результат</a>.

Итак, давайте перейдем к первому шагу.
<h3>Шаг 1 – XHTML</h3>
Основная идея в том, чтобы использовать PHP для генерации необходимой XHTML-разметки для каждого  изображения. Сгенерированный код, в дальнейшем будет включен в файл demo.php.

<strong>demo.php</strong>

[html]
&lt;!-- The gallery container: --&gt;
&lt;div id=&quot;gallery&quot;&gt;

&lt;?php
/* PHP code, covered in detail in step 3 */
?&gt;

&lt;!-- The droppable share box --&gt;
&lt;div class=&quot;drop-box&quot;&gt;
&lt;/div&gt;

&lt;/div&gt;

&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;

&lt;!-- This is later converted to the modal window with the url of the image: --&gt;
&lt;div id=&quot;modal&quot; title=&quot;Share this picture&quot;&gt;
&lt;form&gt;
&lt;fieldset&gt;
&lt;label for=&quot;name&quot;&gt;URL of the image&lt;/label&gt;
&lt;input type=&quot;text&quot; name=&quot;url&quot; id=&quot;url&quot; class=&quot;text ui-widget-content ui-corner-all&quot; onfocus=&quot;this.select()&quot; /&gt;
&lt;/fieldset&gt;
&lt;/form&gt;

&lt;/div&gt;
[/html]

Здесь нет ничего сложного. Обратите внимание на блок с <code>id =”modal” </code> - он используется для создания модального окна, которое отображается, если пользователь перетаскивает изображение на блок "drop to share". Но подробнее об этом, мы поговорим позже.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/12/i12.jpg"><img class="aligncenter size-full wp-image-1795" title="i12" src="http://dreamhelg.ru/wp-content/uploads/2009/12/i12.jpg" alt="" width="600" height="460" /></a>

<h3>Шаг 2 – CSS</h3>
Теперь, когда у нас есть вся необходимая разметка, пришло время ее стилизовать. Сначала, нам нужно включить CSS-файлы в секции <code>head</code> нашей страницы.

<strong>demo.php</strong>

[html]
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;demo.css&quot; /&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/ui-darkness/jquery-ui.css&quot; type=&quot;text/css&quot; media=&quot;all&quot; /&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;fancybox/jquery.fancybox-1.2.6.css&quot;&gt;
[/html]

После этого, можно перейти к написанию стилей.

<strong>demo.css</strong>

[css]
body{
	/* Styling the body */
	color:white;
	font-size:13px;
	background: #222222;
	font-family:Arial, Helvetica, sans-serif;
}

#gallery{
	/* The pics container */
	width:100%;
	height:580px;
	position:relative;
}

.pic, .pic a{
	/* Each picture and the hyperlink inside it */
	width:100px;
	height:100px;
	overflow:hidden;
}

.pic{
	/* Styles specific to the pic class */
	position:absolute;
	border:5px solid #EEEEEE;
	border-bottom:18px solid #eeeeee;

	/* CSS3 Box Shadow */
	-moz-box-shadow:2px 2px 3px #333333;
	-webkit-box-shadow:2px 2px 3px #333333;
	box-shadow:2px 2px 3px #333333;
}

.pic a{
	/* Specific styles for the hyperlinks */
	text-indent:-999px;
	display:block;
	/* Setting display to block enables advanced styling for links */
}

.drop-box{
	/* The share box */
	width:240px;
	height:130px;
	position:absolute;
	bottom:0;
	right:0;
	z-index:-1;

	background:url(img/drop_box.png) no-repeat;
}

.drop-box.active{
	/* The active style is in effect when there is a pic hovering above the box */
	background-position:bottom left;
}

label, input{
	/* The modal dialog URL field */
	display:block;
	padding:3px;
}

label{
	font-size:10px;
}

fieldset{
	border:0;
	margin-top:10px;
}

#url{
	/* The URL field */
	width:240px;
}
[/css]

Один из представленных выше классов нуждается в пояснении, это CSS-класс <code>pic</code>. Он используется для того картинки выглядели как полароидные снимки. Для достижения такого эффекта, каждому изображению добавляется белая рамка.

Кроме того, в этом классе используется CSS3-свойство <code>box-shadow</code>, благодаря которому, каждый снимок отбрасывает тень.

Если вы посмотрите на демо-страницу, то увидите, что фотографии разбросаны по страницы и развернуты в разные стороны. Такой эффект достигается с помощью CSS, на стороне PHP, как вы скоро увидите.

Остальные стили очень простые, и не нуждаются в детальном объяснении.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/12/images.png"><img class="aligncenter size-full wp-image-1796" title="images" src="http://dreamhelg.ru/wp-content/uploads/2009/12/images.png" alt="" width="600" height="230" /></a>

<h3>Шаг 3 – PHP</h3>
Как вы помните, на шаге 1, мы рассмотрели часть XHTML-разметки, и отметили, что PHP будет использоваться для создания специальной разметки, для каждого изображения. И вот как это делается:

<strong>demo.php</strong>

[php]
/* Configuration Start */
$thumb_directory = 'img/thumbs';
$orig_directory = 'img/original';
$stage_width=600;
$stage_height=400;
/* Configuration end */

$allowed_types=array('jpg','jpeg','gif','png');
$file_parts=array();
$ext='';
$title='';
$i=0;

/* Opening the thumbnail directory and looping through all the thumbs: */
$dir_handle = @opendir($thumb_directory) or die(&quot;There is an error with your image directory!&quot;);
$i=1;

while ($file = readdir($dir_handle))
{
	/* Skipping the system files: */
	if($file=='.' || $file == '..') continue;

	$file_parts = explode('.',$file);
	$ext = strtolower(array_pop($file_parts));

	/* Using the file name (withouth the extension) as a image title: */
	$title = implode('.',$file_parts);
	$title = htmlspecialchars($title);

	/* If the file extension is allowed: */
	if(in_array($ext,$allowed_types))
	{
		/* Generating random values for the position and rotation: */
		$left=rand(0,$stage_width);
		$top=rand(0,400);
		$rot = rand(-40,40);

		if($top&gt;$stage_height-130 &amp;&amp; $left &gt; $stage_width-230)
		{
			/* Prevent the images from hiding the drop box */
			$top-=120+130;
			$left-=230;
		}

		/* Outputting each image: */
		echo '
		&lt;div id=&quot;pic-'.($i++).'&quot; class=&quot;pic&quot; style=&quot;top:'.$top.'px;left:'.$left.'px;background:url('.$thumb_directory.'/'.$file.') no-repeat 50% 50%; -moz-transform:rotate('.$rot.'deg); -webkit-transform:rotate('.$rot.'deg);&quot;&gt;

		&lt;a class=&quot;fancybox&quot; rel=&quot;fncbx&quot; href=&quot;'.$orig_directory.'/'.$file.'&quot; target=&quot;_blank&quot;&gt;'.$title.'&lt;/a&gt;

		&lt;/div&gt;';
	}
}

/* Closing the directory */
closedir($dir_handle);
[/php]

Сначала, мы открываем папку миниатюр с помощью <code>opendir</code> (с помощью модификатора @, мы предотвращаем появление любых возможных проблем, отображаемых пользователю) и проходим циклом по всем картинкам.

В цикле, мы пропускаем файлы, не являющиеся изображениями, и генерируем некоторый XHTML-код для каждого изображения, который выводится непосредственно на экран.

Как уже упоминалось ранее, в части CSS, PHP отвечает за вращение и разброс картинок по странице. Каждое изображение позиционируется по случайным <code>X</code> и <code>Y</code> координатам, и поворачивается в диапазоне от <code>-40</code> до <code>40</code> градусов (для предотвращения переворачивания снимков вверх ногами). Все это генерируется с помощью PHP-функции <code>rand()</code> и включается в качестве CSS-стиля картинки, с помощью атрибута <code>style</code>.

Существуют две папки с картинками, использующиеся галереей – thumbs, в которой содержатся миниатюры картинок, размером 100 х 100 пикселей, и original, которая содержит картинку реального размера. Обратите внимание на важную деталь, изображения в папке thumbnail и original, должны иметь одно и то же имя, иначе галерея будет работать не правильно.

Единственно, что осталось сделать – добавить немного интерактивности.

<h3>Шаг 4 – jQuery</h3>
Итак, у нас на руках отличная CSS-галерея. Но это ничего не значит, если мы не можем перетаскивать понравившиеся картинки по экрану и увеличивать их для более детального просмотра, не так ли?

Пришло время JQuery.

<strong>script.js</strong>

[javascript]
$(document).ready(function(){
	// Executed once all the page elements are loaded
	var preventClick=false;
	$(&quot;.pic a&quot;).bind(&quot;click&quot;,function(e){

		/* This function stops the drag from firing a click event and showing the lightbox */
		if(preventClick)
		{
			e.stopImmediatePropagation();
			e.preventDefault();
		}
	});

	$(&quot;.pic&quot;).draggable({

		/* Converting the images into draggable objects */
		containment: 'parent',
		start: function(e,ui){
			/* This will stop clicks from occuring while dragging */
			preventClick=true;
		},
		stop: function(e, ui) {
			/* Wait for 250 milliseconds before re-enabling the clicks */
			setTimeout(function(){ preventClick=false; }, 250);
		}
	});

	$('.pic').mousedown(function(e){
		/* Executed on image click */
		var maxZ = 0;

		/* Find the max z-index property: */
		$('.pic').each(function(){
			var thisZ = parseInt($(this).css('zIndex'))
			if(thisZ&gt;maxZ) maxZ=thisZ;
		});

		/* Clicks can occur in the picture container (with class pic) and in the link inside it */
		if($(e.target).hasClass(&quot;pic&quot;))
		{
			/* Show the clicked image on top of all the others: */
			$(e.target).css({zIndex:maxZ+1});
		}
		else $(e.target).closest('.pic').css({zIndex:maxZ+1});
	});

	/* Converting all the links to a fancybox gallery */
	$(&quot;a.fancybox&quot;).fancybox({
		zoomSpeedIn: 300,
		zoomSpeedOut: 300,
		overlayShow:false
	});

	/* Converting the share box into a droppable: */
	$('.drop-box').droppable({
		hoverClass: 'active',
		drop:function(event,ui){

			/* Fill the URL text field with the URL of the image. */
			/* The id of the image is appended as a hash #pic-123 */
			$('#url').val(location.href.replace(location.hash,'')+'#' + ui.draggable.attr('id'));
			$('#modal').dialog('open');
		}
	});

	/* Converts the div with id=&quot;modal&quot; into a modal window  */
	$(&quot;#modal&quot;).dialog({
		bgiframe: true,
		modal: true,
		autoOpen:false,

		buttons: {
			Ok: function() {
				$(this).dialog('close');
			}
		}
	});

	if(location.hash.indexOf('#pic-')!=-1)
	{
		/* Checks whether a hash is present in the URL */
		/* and shows the respective image */
		$(location.hash+' a.fancybox').click();
	}
});
[/javascript]

Сначала, мы вешаем, обработчик событий на клик по картинке, с тем, чтобы лайтбокс не срабатывал, когда мы просто перетаскиваем изображение.

После этого, мы делаем все картинки перетаскиваемыми, а затем настраиваем lightbox.

Теперь, нам нужно сделать блок «Drop to share», «принимающим», то есть блок сможет определять, когда к нему подвели и отпустили картинку. Это позволит нам применить специальный стиль к контейнеру, и открыть модальное окно.

Модальное окно – это компонент пользовательского интерфейса, поставляемый вместе с jQuery UI. Он прячет все элементы страницы, под полупрозрачный слой, тем самым блокируя их использование для пользователя. Единственная вещь, полностью привлекающая внимание пользователя – это окно с сообщением, которое в нашем случае, окно содержит URL картинки.

И наконец, у нас есть несколько строк кода, которые проверяют, есть ли строки вида  <code>#pic-123</code> в URL, c помощью которых, лайтбокс показывает соответствующие изображения при загрузке страницы.

Наша CSS3-галерея готова.

<a href="http://demo.tutorialzine.com/2009/11/hovering-gallery-css3-jquery/demo.zip">Скачать архив с примером</a>.

Перевод статьи «<a href="http://tutorialzine.com/2009/11/hovering-gallery-css3-jquery/">An Awesome CSS3 Lightbox Gallery With jQuery</a>», автор <strong>Martin</strong>
<h3><strong> </strong>Другие участники эстафеты:</h3>
<ul>
	<li>Cuprum.name – <a href="http://cuprum.name/page/cvetovaya-model-rgba">Работа с цветовой моделью RGBA</a></li>
	<li>rotorweb.ru — <a href="http://rotorweb.ru/mysli-vslux/saying-goodbye-overflow-hidden.html">Скажем прощай overflow: hidden!</a></li>
</ul>
Хотите принять участие в эстафете? Это очень просто, опубликуйте перевод статьи из представляемого ресурса, сообщите мне, и я с удовольствием поставлю ссылку на ваш блог. Обязательное условие – статьи и ресурсы не должны повторятся.]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/12/fancy-lightbox-css3-image-gallery-with-jquery/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Простой, перетаскиваемый элемент на jQuery</title>
		<link>http://dreamhelg.ru/2009/11/simple-draggable-element-with-jquery/</link>
		<comments>http://dreamhelg.ru/2009/11/simple-draggable-element-with-jquery/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 07:54:16 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1713</guid>
		<description><![CDATA[<p><img width="200" height="200" src="http://dreamhelg.ru/wp-content/uploads/2009/11/200x200.jpg" class="attachment-200x200 wp-post-image" alt="200x200" title="200x200" /></p>Бывают случаи, когда вам может понадобиться создать перетаскиваемый элемент внутри вашего веб-приложения. Это отличная функциональность, однако, возможно вы хотите, чтобы элемент оставался на новом месте, после перетаскивания.  В сегодняшней статье вы узнаете, как можно легко перетаскивать и закреплять в новом месте нужный элемент даже после перезагрузки страницы, с помощью захвата и хранения его X и Y координат.<span id="more-1713"></span>

<h3>Сценарий</h3>
Итак, у вас есть элемент на странице. Вы можете перетаскивать его туда-сюда. Но, когда страница перезагружается, элемент возвращается на исходную позицию.  И хотя нам нужно, чтобы элемент был перетаскиваемый, при этом нужно, чтобы наш элемент достаточно было перетащить один раз. Давайте рассмотрим простое решение, реализующее данную функциональность.

<h3>Начало</h3>
Для этого примера нам понадобится библиотека <a href="http://jquery.com/">jQuery</a>, <a href="http://jqueryui.com/">jQuery UI </a>и плагин JQuery-<a href="http://code.google.com/p/jquery-json/">JSON</a>. Кроме этого, мы также будем использовать PHP и базу данных MySQL для разбора и хранения наших данных. Если вы новичок в jQuery, не беспокойтесь. JQuery - это расширяемая, быстрая и легковесная JavaScript-библиотека, которую легко и весело использовать. Библиотека имеет хорошо структурированную документацию и огромное сообщество.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/jquery.jpg"><img class="aligncenter size-full wp-image-1716" title="jquery" src="http://dreamhelg.ru/wp-content/uploads/2009/11/jquery.jpg" alt="jquery" width="500" height="200" /></a>

<h3>HTML и CSS</h3>
Начнем с HTML-разметки и стилей для нашего примера. Сначала CSS:

[css]
html, body {   
    background:#151515;   
    margin:0 0 0 0;   
    padding:0 0 0 0;   
}   
  
#glassbox {   
    background:#333;   
    border:1px solid #000;   
    height:400px;   
    margin:30px auto auto auto;   
    position:relative;   
    width:960px;   
    -moz-border-radius: 10px;   
    -webkit-border-radius: 10px;       
}   
  
#element {   
    background:#666;   
    border:1px #000 solid;   
    cursor:move;   
    height:143px;   
    padding:10px 10px 10px 10px;   
    width:202px;   
    -moz-border-radius: 10px;   
    -webkit-border-radius: 10px;   
}   
  
#respond{   
    color:#fff;   
    margin:0 auto 0 auto;   
    width:960px;       
}  
[/css]

CSS – очень простой. Мы назначаем html и body нулевые свойства, для чистки внешних и внутренних отступов, далее устанавливаем значения высоты, ширины и другие свойства для наших элементов. -<code>moz-border-radius</code> и <code>-webkit-border-radius</code> – это два свойства, позволяющие нам создать закругленные углы (работает пока только в Mozilla Firefox и Safari 3) для наших элементов. Теперь, давайте взглянем на HTML:

[html]
&lt;!DOCTYPE html&gt;   
&lt;html&gt;   
&lt;head&gt;   
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;   
&lt;title&gt;Simple Draggable Element Persistence with jQuery&lt;/title&gt;   
  
&lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; type=&quot;text/css&quot; /&gt;   
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;   
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-ui-1.7.2.custom.min.js&quot;&gt;&lt;/script&gt;   
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.json-2.2.min.js&quot;&gt;&lt;/script&gt;   
  
&lt;/head&gt;   
  
&lt;body&gt;   
  
    &lt;div id=&quot;glassbox&quot;&gt;   
        &lt;div id=&quot;element&quot;&gt;&lt;img src=&quot;nettuts.jpg&quot; alt=&quot;Nettuts+&quot; /&gt;Move the Box&lt;p&gt;&lt;/p&gt;&lt;/div&gt;   
    &lt;/div&gt;   
  
    &lt;div id=&quot;respond&quot;&gt;&lt;/div&gt;   
[/html]

Как видите, мы создали очень простую страницу, в которую подключили наш CSS, библиотеку JavaScript и плагины, кроме того, страница содержит элементы, к которым мы будем применять некоторые эффекты и события. Обратите внимание, что файл jquery-ui представляет собой специальную сборку, включающую в себя только ядро и функции перетаскивания элементов.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/general.jpg"><img class="aligncenter size-full wp-image-1717" title="general" src="http://dreamhelg.ru/wp-content/uploads/2009/11/general.jpg" alt="general" width="584" height="452" /></a>

<h3>JavaScript</h3>
Теперь самое интересное! Сначала давайте рассмотрим базовые функции, которые мы будем использовать для применения некоторых эффектов к нашим элементам. Разберем все до основания.

[javascript]
&lt;script type=&quot;text/javascript&quot;&gt;   
    $(document).ready(function() {   
        $(&quot;#element&quot;).draggable({    
                containment: '#glassbox',    
                scroll: false   
         })   
[/javascript]

Сначала мы говорим браузеру: «Эй, это код, который мы хотим запустить; это не HTML, это JavaScript». Затем, мы ждем пока документ полностью загрузится, после того как это случилось, вызываем функцию для получения нашего блока <code>#element</code>, и добавляем к нему обработчик перетаскивания с базовыми настройками. Опция <code>containment</code> содержит наш элемент внутри родительского блока, и мы устанавливаем значение <code>scroll</code> в <code>false</code>, потому что, нам не нужен скролл.

Двигаемся дальше:

[javascript]
.mousemove(function(){   
    var coord = $(this).position();   
    $(&quot;p:last&quot;).text( &quot;left: &quot; + coord.left + &quot;, top: &quot; + coord.top );   
})   
[/javascript]

Внутри этого фрагмента, мы вызываем, обработчик события mousemove и говорим ему: «Когда мышь передвигается, установить переменную <code>coord</code> равной значению текущей позиции нашего блока #element» Затем мы получаем последний параграф в блоке <code>#(“p: last”) </code>и печатаем текст, выводящий значения свойств <code>left(x) </code>и <code>top(y)</code> нашего элемента, относительно родительского объекта (которым является блок <code>#glassbox</code>).

[javascript]
.mouseup(function(){    
            var coords=[];   
            var coord = $(this).position();   
            var item={ coordTop:  coord.left, coordLeft: coord.top  };   
            coords.push(item);   
            var order = { coords: coords };   
            $.post('updatecoords.php', 'data='+$.toJSON(order), function(response){   
                    if(response==&quot;success&quot;)   
                        $(&quot;#respond&quot;).html('&lt;div class=&quot;success&quot;&gt;X and Y Coordinates Saved!&lt;/div&gt;').hide().fadeIn(1000);   
                        setTimeout(function(){ $('#respond').fadeOut(1000); }, 2000);   
                    });    
            });   
                       
});   
lt;/script&gt;   
[/javascript]

Ну да, здесь уже сложнее. В этом фрагменте мы собираемся сделать кучу вещей. Сначала, мы устанавливаем пустой массив, а затем получаем некоторые значения для его наполнения. С помощью вызова обработчика событий <code>.mouseup()</code> мы велим браузеру отслеживать событие, когда вы отпускаете кнопку мыши. Мы указываем, что переменная <code>coords</code> – это пустой массив и снова устанавливаем ее значение равной позиции нашего блока <code>#element</code>.

Затем, нам нужно создать список из двух строчек, которыми будут <code>coordTop:</code> и <code>coordLeft:</code>, соответствующие позициям <code>left</code> и <code>top</code>, нашего блока. С помощью строки <code>coords.push(item)</code>, мы заполним наш список массивом из координат. Затем задаем переменную <code>order</code> как новый список, в котором ключ <code>coords</code> будет соответствовать нашему массиву <code>coords</code>. Теперь немного аякса.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/dragged.jpg"><img class="aligncenter size-full wp-image-1718" title="dragged" src="http://dreamhelg.ru/wp-content/uploads/2009/11/dragged.jpg" alt="dragged" width="528" height="458" /></a>

<code>$.post</code> – это обработчик запроса AJAX, который загружает удаленную страницу, с помощью метода <code>HTTP POST</code>. Эта функция принимает следующие параметры: url, дата, ответ и тип данных для возврата. В этом примере, мы укажем файле updatecoords.php в качестве нашего URL, потому что, именно этому файлы мы хотим отправить наши данные. Затем, мы опишем тип данных, с помощью включения функции <code>$.toJSON</code>, определенной в плагине JSON и назначим переменную <code>order</code>, в качестве данных, которые должен вернуть <code>.toJSON</code>.

Далее, мы создаем ответ, который проверяет возвращение успешного ответа от нашего PHP-файла. В случае получения успешного ответа, мы отображаем сообщение об успешном сохранении координат, используя метод <code>.fadeIn()</code> и скорость 1000 миллисекунд, затем задаем таймер на 2000 миллисекунд, и снова медленно прячем это сообщение, с помощью метода <code>.fadeOut()</code>. Вот так будет выглядеть наш JavaScript в целом виде:

[javascript]
&lt;script type=&quot;text/javascript&quot;&gt;   
    $(document).ready(function() {   
        $(&quot;#element&quot;).draggable({    
                containment: '#glassbox',    
                scroll: false   
         }).mousemove(function(){   
                var coord = $(this).position();   
                $(&quot;p:last&quot;).text( &quot;left: &quot; + coord.left + &quot;, top: &quot; + coord.top );   
         }).mouseup(function(){    
                var coords=[];   
                var coord = $(this).position();   
                var item={ coordTop:  coord.left, coordLeft: coord.top  };   
                coords.push(item);   
                var order = { coords: coords };   
                $.post('updatecoords.php', 'data='+$.toJSON(order), function(response){   
                        if(response==&quot;success&quot;)   
                            $(&quot;#respond&quot;).html('&lt;div class=&quot;success&quot;&gt;X and Y Coordinates Saved!&lt;/div&gt;').hide().fadeIn(1000);   
                            setTimeout(function(){ $('#respond').fadeOut(1000); }, 2000);   
                        });    
                });   
                           
        });   
&lt;/script&gt;   
[/javascript]

Поместите этот код ниже HTML, сразу после закрывающего тега body.
<h3>PHP</h3>
Хорошо, давайте сделаем что-нибудь с данными, которые приходят от нашего JQuery. Сначала нужно создать простую базу данных, для хранения наших координат, которые мы впоследствии будем использовать для определения позиции нашего элемента. Затем, нам понадобится файл config.php, в котором будут записаны параметры подключения к базе данных, а затем мы перейдем к updatecords.php.

<strong>SQL</strong>

[sql]
Database: 'xycoords'   
  
CREATE TABLE IF NOT EXISTS `coords` (   
  `id` int(11) NOT NULL AUTO_INCREMENT,   
  `x_pos` int(4) NOT NULL,   
  `y_pos` int(4) NOT NULL,   
  PRIMARY KEY (`id`)   
) ENGINE=MyISAM  DEFAULT CHARSET=latin1; 
[/sql]

<strong>Config.php</strong>

[php]
&lt;?php   
/*Database Settings*/   
  
$db_host =&quot;localhost&quot;; //this will likely stay the same   
$db_name = &quot;xycoords&quot;; //name of the database we will be using   
$db_usr = &quot;database_username&quot;; //db username   
$db_pass = &quot;database_password&quot;; //db password   
  
//Connect to the database   
$link = mysqli_connect($db_host, $db_usr, $db_pass) or die(&quot;MySQL Error: &quot; . mysqli_error());   
//Select our database   
mysqli_select_db($link, $db_name) or die(&quot;MySQL Error: &quot; . mysqli_error());   
?&gt;   
[/php]

<strong>updatecoords.php</strong>

[php]
&lt;?php   
if(!$_POST[&quot;data&quot;]){   
    echo &quot;Nothing Sent&quot;;   
    exit;   
}   
  
include ('config.php');   
  
//decode JSON data received from AJAX POST request   
$data = json_decode($_POST[&quot;data&quot;]);   
  
foreach($data-&gt;coords as $item) {   
    //Extract X number for panel   
    $coord_X = preg_replace('/[^\d\s]/', '', $item-&gt;coordTop);   
    //Extract Y number for panel   
    $coord_Y = preg_replace('/[^\d\s]/', '', $item-&gt;coordLeft);   
    //escape our values - as good practice   
    $x_coord = mysqli_real_escape_string($link, $coord_X);   
    $y_coord = mysqli_real_escape_string($link, $coord_Y);   
       
    //Setup our Query   
    $sql = &quot;UPDATE coords SET x_pos = '$x_coord', y_pos = '$y_coord'&quot;;   
       
    //Execute our Query   
    mysqli_query($link, $sql) or die(&quot;Error updating Coords :&quot;.mysqli_error());    
}   
  
//Return Success   
echo &quot;success&quot;;   
  
?&gt;
[/php]

Здесь все довольно просто. Первое, что мы делаем – это проверяем, были ли переданы данные в файл. Если это произошло, мы включаем наш файл с настройками config.php и назначаем переменной <code>$data</code> значение <code>json_decode(passed post variable);</code> <a href="http://us.php.net/manual/en/function.json-decode.php">json_decode</a> – это PHP-функция, представленная в PHP 5.2.0, которая позволяет декодировать строку JSON.

Поскольку наша переменная <code>$data</code> содержит массив данных, нам нужно разобрать его на части, чтобы получить нужные значения. Для этого мы пройдемся по массиву <code>$data-&gt;coords () </code>(который был получен из переменной <code>order</code> в JavaScript) и обработаем каждый элемент. В результате, из каждой пары ключ – значение будет создан объект списка, который мы в дальнейшем укажем и создадим переменную для его вывода. При этом мы будем использовать функцию <code>preg_replace</code>, для исключения ненужных символов. Кроме того, мы подготовим наши значения для вставки в базу данных, путем экранирования кавычек, и апострофов, с помощью функции <code>mysqli_real_escape_string</code>. Если все прошло хорошо, нам нужно будет вернуть успешный результат JavaScript.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/response.jpg"><img class="aligncenter size-full wp-image-1719" title="response" src="http://dreamhelg.ru/wp-content/uploads/2009/11/response.jpg" alt="response" width="558" height="466" /></a>
<h3>В заключение</h3>
Теперь, когда у нас уже все готово, для того чтобы получить координаты элемента и передать их в PHP для записи, нам понадобится изменить нашу HTML-разметку для отображения позиции элемента. Для этого, мы удалим простую HTML-разметку и создадим ее с помощью PHP:

[php]
&lt;div id=&quot;glassbox&quot;&gt;   
&lt;?php   
        //Create a query to fetch our values from the database     
        $get_coords = mysqli_query($link, &quot;SELECT * FROM coords&quot;);   
        //We then set variables from the * array that is fetched from the database   
        while($row = mysqli_fetch_array($get_coords)) {   
            $x = $row['x_pos'];   
            $y = $row['y_pos'];   
            //then echo our div element with CSS properties to set the left(x) and top(y) values of the element   
            echo '&lt;div id=&quot;element&quot; style=&quot;left:'.$x.'px; top:'.$y.'px;&quot;&gt;&lt;img src=&quot;nettuts.jpg&quot; alt=&quot;Nettuts+&quot; /&gt;Move the Box&lt;p&gt;&lt;/p&gt;&lt;/div&gt;';   
        }              
?&gt;   
&lt;/div&gt;   
&lt;div id=&quot;respond&quot;&gt;&lt;/div&gt;   
[/php]

Здесь мы исполняем простой запрос к базе данных для выбора всех строк из таблицы coords. Затем мы вызываем цикл while, который определяет каждую выбранную нами строчку как <code>$row</code>. Теперь, мы можем назначить переменные равными каждой, индивидуальной строке, полученной из базы данных, и выводим их в соответствующем месте.

<a href="http://nettuts.s3.amazonaws.com/477_drag/source.zip">Скачать архив с примером</a>.

Перевод статьи «<a href="http://net.tutsplus.com/tutorials/javascript-ajax/simple-draggable-element-persistence-with-jquery/">Simple Draggable Element Persistence with jQuery</a>», автор <strong>Dustin Blake</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/11/simple-draggable-element-with-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Красивая форма обратной связи на основе AJAX</title>
		<link>http://dreamhelg.ru/2009/11/fancy-ajax-contact-form/</link>
		<comments>http://dreamhelg.ru/2009/11/fancy-ajax-contact-form/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 08:56:14 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[общая]]></category>
		<category><![CDATA[переводы]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1690</guid>
		<description><![CDATA[<p><img width="200" height="150" src="http://dreamhelg.ru/wp-content/uploads/2009/11/home.jpg" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>Предоставление посетителям сайта простого и надежного средства обратной связи –  это важнейшая часть любого веб-проекта. Наиболее простым и часто используемым каналом обратной связи - являются контактные формы. Посмотреть результат можно <a href="http://dreamhelg.ru/demo/contactform/demo.php">здесь</a>.<span id="more-1690"></span>

В сегодняшней статье, мы создадим <strong>форму обратной связи  на аяксе</strong>, с использованием современных техник веб-разработки.  Для этого мы будем использовать PHP, CSS и jQuery в виде нескольких плагинов. Плагин <a href="http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/">formValidator</a> будем использовать для проверки введенных значений, а с помощью плагина <a href="http://www.dfc-e.com/metiers/multimedia/opensource/jqtransform/">jQTransform</a>, будем стилизовать текстовые поля и кнопки нашей формы. В дополнение, мы будем использовать класс <a href="http://sourceforge.net/projects/phpmailer/">PHPMailer</a> для отправки на почту введенных данных.

Кроме того, наша форма будет прекрасно работать даже с выключенным JS.

<em>*Для нормальной работы примера, вам понадобится <strong>PHP5</strong></em>
<h3>Шаг 1 – XHTML</h3>
Сначала нам понадобится XHTML-разметка для формы.

<strong>demo.php</strong>

[html]
&lt;div id=&quot;main-container&quot;&gt;	&lt;!-- The main container element --&gt;

&lt;div id=&quot;form-container&quot;&gt;	&lt;!-- The form container --&gt;

&lt;h1&gt;Fancy Contact Form&lt;/h1&gt;	&lt;!-- Headings --&gt;
&lt;h2&gt;Drop us a line and we will get back to you&lt;/h2&gt;

&lt;form id=&quot;contact-form&quot; name=&quot;contact-form&quot; method=&quot;post&quot; action=&quot;submit.php&quot;&gt;	&lt;!-- The form, sent to submit.php --&gt;

&lt;table width=&quot;100%&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;

&lt;tr&gt;
&lt;td width=&quot;18%&quot;&gt;&lt;label for=&quot;name&quot;&gt;Name&lt;/label&gt;&lt;/td&gt;	&lt;!-- Text label for the input field --&gt;
&lt;td width=&quot;45%&quot;&gt;&lt;input type=&quot;text&quot; class=&quot;validate[required,custom[onlyLetter]]&quot; name=&quot;name&quot; id=&quot;name&quot; value=&quot;&lt;?=$_SESSION['post']['name']?&gt;&quot; /&gt;&lt;/td&gt;
&lt;!-- We are using session to prevent losing data between page redirects --&gt;

&lt;td width=&quot;37%&quot; id=&quot;errOffset&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;label for=&quot;email&quot;&gt;Email&lt;/label&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type=&quot;text&quot; class=&quot;validate[required,custom[email]]&quot; name=&quot;email&quot; id=&quot;email&quot; value=&quot;&lt;?=$_SESSION['post']['email']?&gt;&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;label for=&quot;subject&quot;&gt;Subject&lt;/label&gt;&lt;/td&gt;

&lt;!-- This select is being replaced entirely by the jqtransorm plugin --&gt;

&lt;td&gt;&lt;select name=&quot;subject&quot; id=&quot;subject&quot;&gt;
&lt;option value=&quot;&quot; selected=&quot;selected&quot;&gt; - Choose -&lt;/option&gt;
&lt;option value=&quot;Question&quot;&gt;Question&lt;/option&gt;
&lt;option value=&quot;Business proposal&quot;&gt;Business proposal&lt;/option&gt;
&lt;option value=&quot;Advertisement&quot;&gt;Advertising&lt;/option&gt;
&lt;option value=&quot;Complaint&quot;&gt;Complaint&lt;/option&gt;
&lt;/select&gt;          &lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;&lt;label for=&quot;message&quot;&gt;Message&lt;/label&gt;&lt;/td&gt;
&lt;td&gt;&lt;textarea name=&quot;message&quot; id=&quot;message&quot; class=&quot;validate[required]&quot; cols=&quot;35&quot; rows=&quot;5&quot;&gt;&lt;?=$_SESSION['post']['message']?&gt;&lt;/textarea&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;label for=&quot;captcha&quot;&gt;&lt;?=$_SESSION['n1']?&gt; + &lt;?=$_SESSION['n2']?&gt; =&lt;/label&gt;&lt;/td&gt;

&lt;!-- A simple captcha math problem --&gt;

&lt;td&gt;&lt;input type=&quot;text&quot; class=&quot;validate[required,custom[onlyNumber]]&quot; name=&quot;captcha&quot; id=&quot;captcha&quot; /&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td valign=&quot;top&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;!-- These input buttons are being replaced with button elements --&gt;
&lt;td colspan=&quot;2&quot;&gt;&lt;input type=&quot;submit&quot; name=&quot;button&quot; id=&quot;button&quot; value=&quot;Submit&quot; /&gt;
&lt;input type=&quot;reset&quot; name=&quot;button2&quot; id=&quot;button2&quot; value=&quot;Reset&quot; /&gt;
&lt;?=$str?&gt;

&lt;!-- $str contains the error string if the form is used with JS disabled --&gt;

&lt;img id=&quot;loading&quot; src=&quot;img/ajax-load.gif&quot; width=&quot;16&quot; height=&quot;16&quot; alt=&quot;loading&quot; /&gt;
&lt;!-- the rotating gif animation, hidden by default --&gt;
&lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;
&lt;/form&gt;

&lt;?=$success?&gt;
&lt;!-- The $success variable contains the message that is shown if JS is disabled and the form is submitted successfully --&gt;

&lt;/div&gt;
&lt;/div&gt;	&lt;!-- closing the containers --&gt;
[/html]

Как вы могли заметить в строке 8, обрабатывать нашу форму будет файл <strong>submit.php</strong>. Мы будем использовать этот файл в обоих случаях – как для обычной отправки формы (для посетителей с выключенным JS), так и для аяксовой отправки формы. Это позволит легко обновлять код, без необходимости объединять изменения между файлами.

Далее, мы можете видеть, что мы используем массив <strong>$_SESSION</strong> для заполнения текстовых полей значениями. Это делается для того, чтобы данные не потерялись во время перенаправления страницы, которое происходит во время отправки формы в <strong>submit.php</strong>.

Другой важный аспект – это классы, назначенный текстовым полям – <strong>classs=”validate[required,custom[onlyLetter]]”</strong>. Эти классы используются плагином валидации для определения правил проверки введенных значений для каждого текстового поля. В нашем примере, мы указываем, что поле обязательное, и разрешено вводить только буквы.

Существует множество доступных правил валидации, вы можете узнать о них на домашней странице плагина.

Теперь взгляните, как будет выглядеть наша форма, с применением плагина <strong>JQtransform</strong>.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/1.jpg"><img class="aligncenter size-full wp-image-1694" title="1" src="http://dreamhelg.ru/wp-content/uploads/2009/11/1.jpg" alt="1" width="433" height="468" /></a>
<h3>Шаг 2 – jQuery</h3>
МЫ используем два плагина jQuery – <strong>jQtransform</strong> для стилизации элементов формы, и <strong>formValidator</strong> для проверки введенных значений на клиентской стороне.

Очень важно помнить, что кроме клиентской стороны, введенные данные всегда нужно проверять на серверной стороне.

Итак, для начала нам нужно подключить все необходимые библиотеки.

<strong>demo.php</strong>

[php]
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;jqtransformplugin/jqtransform.css&quot; /&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;formValidator/validationEngine.jquery.css&quot; /&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;demo.css&quot; /&gt;

&lt;?=$css?&gt; &lt;!-- Special CSS rules, created by PHP --&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;jqtransformplugin/jquery.jqtransform.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;formValidator/jquery.validationEngine.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;script.js&quot;&gt;&lt;/script&gt;
[/php]

Указанный выше код расположен в секции <em>head</em>, файла <strong>demo.php</strong>. Сначала мы подключаем CSS-файлы, используемые обоими плагинами, а затем уже библиотеку JQuery и плагины. Возможно, вас заинтересовала строка 5 – это специальный набор CSS-правил, который мы создадим с помощью PHP, для отображения подтверждающего сообщения, как вы увидите в дальнейшем.

Теперь, давайте посмотрим на наш файл <strong>script.js</strong>.

<strong>script.js</strong>

[javascript]
$(document).ready(function(){
	/* after the page has finished loading */

	$('#contact-form').jqTransform();
	/* transform the form using the jqtransform plugin */

	$(&quot;button&quot;).click(function(){

		$(&quot;.formError&quot;).hide();
		/* hide all the error tooltips */
	});

	var use_ajax=true;
	$.validationEngine.settings={};
	/* initialize the settings object for the formValidation plugin */

	$(&quot;#contact-form&quot;).validationEngine({	/* create the form validation */
		inlineValidation: false,
		promptPosition: &quot;centerRight&quot;,
		success :  function(){use_ajax=true},	/* if everything is OK enable AJAX */
		failure : function(){use_ajax=false}	/* in case of validation failure disable AJAX */
	 })

	$(&quot;#contact-form&quot;).submit(function(e){

			if(!$('#subject').val().length)
			{
				$.validationEngine.buildPrompt(&quot;.jqTransformSelectWrapper&quot;,&quot;* This field is required&quot;,&quot;error&quot;)
				/* a custom validation tooltip, using the buildPrompt method */

				return false;
			}

			if(use_ajax)
			{
				$('#loading').css('visibility','visible');
				/* show the rotating gif */

				$.post('submit.php',$(this).serialize()+'&amp;ajax=1',
				/* using jQuery's post method to send data */

				function(data){
					if(parseInt(data)==-1)
						$.validationEngine.buildPrompt(&quot;#captcha&quot;,&quot;* Wrong verification number!&quot;,&quot;error&quot;);
						/* if there is an error, build a custom error tooltip for the captcha */
					else
					{
						$(&quot;#contact-form&quot;).hide('slow').after('&lt;h1&gt;Thank you!&lt;/h1&gt;');
						/* show the confirmation message */
					}

					$('#loading').css('visibility','hidden');
					/* hide the rotating gif */
				});
			}

e.preventDefault();	/* stop the default form submit */
})

});
[/javascript]

Весь блок скрипта выполняется внутри метода <strong>$(document).ready</strong>, который гарантирует нам, свое исполнение, только после окончания загрузки страницы.

Далее, мы используем метод <strong>jqTransform()</strong>, который определен в плагине <strong>jqtransform</strong>. Он переделывает и стилизует все элементы формы (тестовые поля, кнопки и др.)

Элемент <em>select</em> заменяется набором дивов и ссылок. Это выглядит здорово, однако влечет за собой некоторые проблемы с плагином валидации, в связи с чем, тултип для селекта нам придется сделать вручную.

После этого, в строке 7, вешаем обработчик событий на нажатие кнопки в нижней части формы, с одной строкой кода, которая прячет отображаемые тултипы с сообщениями об ошибках. Это для того, чтобы страница правильно обновлялась, и подсказки не оставались на странице, если пользователь ввел правильные данные.

Далее, мы инициализируем  плагин <strong>formValidation</strong>, с помощью метода <strong>validationEngine() </strong>и в строке 24 описываем событие формы <strong>onsubmit</strong>. Пара моментов, на которые стоит обратить внимание здесь – отдельный тултип в строке 28, и дополнительный параметр <strong>ajax=1</strong>, в строке 39. Этот параметр использует файл <strong>submit.php</strong>, для того чтобы определить, передан ли запрос с помощью аякса или получен непосредственно через отправку формы.

Также, обратите внимание, что мы используем специальную переменную <strong>use_ajax</strong>, для предотвращения работы аякса, если форма не прошла проверку.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/2.png"><img class="aligncenter size-full wp-image-1695" title="2" src="http://dreamhelg.ru/wp-content/uploads/2009/11/2.png" alt="2" width="600" height="460" /></a>
<h3>Шаг 3 – CSS</h3>
Все наши CSS-правила описаны в файле <strong>demo.css</strong>

<strong>demo.css</strong>

[css]
body,h1,h2,h3,p,quote,small,form,input,ul,li,ol,label{
	/* reset some of the page elements */
	margin:0px;
	padding:0px;
}

body{
	color:#555555;
	font-size:13px;
	background: url(img/dark_wood_texture.jpg) #282828;
	font-family:Arial, Helvetica, sans-serif;
}

.clear{
	clear:both;
}

#main-container{
	width:400px;
	margin:30px auto;
}

#form-container{
	background-color:#f5f5f5;
	padding:15px;

	/* rounded corners */
	-moz-border-radius:12px;
	-khtml-border-radius: 12px;
	-webkit-border-radius: 12px;
	border-radius:12px;
}

td{
	/* prevent multiline text */
	white-space:nowrap;
}

a, a:visited {
	color:#00BBFF;
	text-decoration:none;
	outline:none;
}

a:hover{
	text-decoration:underline;
}

h1{
	color:#777777;
	font-size:22px;
	font-weight:normal;
	text-transform:uppercase;
	margin-bottom:5px;
}

h2{
	font-weight:normal;
	font-size:10px;

	text-transform:uppercase;

	color:#aaaaaa;
	margin-bottom:15px;

	border-bottom:1px solid #eeeeee;
	margin-bottom:15px;
	padding-bottom:10px;
}

label{
	text-transform:uppercase;
	font-size:10px;
	font-family:Tahoma,Arial,Sans-serif;
}

textarea{
	color:#404040;
	font-family:Arial,Helvetica,sans-serif;
	font-size:12px;
}

td &gt; button{
	/* A special CSS selector that targets non-IE6 browsers */
	text-indent:8px;
}

.error{
	/* this class is used if JS is disabled */
	background-color:#AB0000;
	color:white;
	font-size:10px;
	font-weight:bold;
	margin-top:10px;
	padding:10px;
	text-transform:uppercase;
	width:300px;
}

#loading{
	/* the loading gif is hidden on page load */
	position:relative;
	bottom:9px;
	visibility:hidden;
}

.tutorial-info{
	color:white;
	text-align:center;
	padding:10px;
	margin-top:10px;
}
[/css]

Обратите внимание на строку 85. Это правило делает кнопки шире, но, к сожалению это плохо выглядит в IE6. Поэтому мы используем специальный CSS-селектор, который игнорируется IE6, но отлично понимают остальные браузеры.

Теперь, все что нам осталось – это PHP.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/3.jpg"><img class="aligncenter size-full wp-image-1696" title="3" src="http://dreamhelg.ru/wp-content/uploads/2009/11/3.jpg" alt="3" width="555" height="319" /></a>
<h3>Шаг 4 – PHP</h3>
Сначала давайте рассмотрим код в начале файла <strong>demo.php</strong>

<strong>demo.php</strong>

[php]
session_name(&quot;fancyform&quot;);
session_start();

$_SESSION['n1'] = rand(1,20);	/* generate the first number */
$_SESSION['n2'] = rand(1,20);	/* then the second */
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];	/* the expected result */

/* the code below is used if JS has been disabled by the user */
$str='';
if($_SESSION['errStr'])	/* if submit.php returns an error string in the session array */
{
	$str='&lt;div class=&quot;error&quot;&gt;'.$_SESSION['errStr'].'&lt;/div&gt;';
	unset($_SESSION['errStr']);	/* will be shown only once */
}

$success='';
if($_SESSION['sent'])
{
	$success='&lt;h1&gt;Thank you!&lt;/h1&gt;';	/* the success message */

	$css='&lt;style type=&quot;text/css&quot;&gt;#contact-form{display:none;}&lt;/style&gt;';
	/* a special CSS rule that hides our form */

	unset($_SESSION['sent']);
}
[/php]

Как видите, мы используем массив <strong>$_SESSION</strong> для хранения двух случайных чисел и ожидаемого результата. Это будет использоваться в дальнейшем, файлом <strong>submit.php</strong>, для подтверждения того, что капча решена.

Другой интересный момент находится в строке 21, где мы описываем простой CSS-класс. Фактически здесь, мы скрываем форму, и отображаем сообщение об успешной отправке, если у пользователя отключен JS.

<strong>submit.php</strong>

[php]
require &quot;phpmailer/class.phpmailer.php&quot;;

session_name(&quot;fancyform&quot;);	/* starting the session */
session_start();

foreach($_POST as $k=&gt;$v)
{
	/* if magic_quotes is enabled, strip the post array */
	if(ini_get('magic_quotes_gpc'))
	$_POST[$k]=stripslashes($_POST[$k]);

	$_POST[$k]=htmlspecialchars(strip_tags($_POST[$k]));
	/* escape the special chars */
}

$err = array();

/* some error checks */
if(!checkLen('name'))
	$err[]='The name field is too short or empty!';

if(!checkLen('email'))
	$err[]='The email field is too short or empty!';
else if(!checkEmail($_POST['email']))
	$err[]='Your email is not valid!';

if(!checkLen('subject'))
	$err[]='You have not selected a subject!';

if(!checkLen('message'))
	$err[]='The message field is too short or empty!';

/* compare the received captcha code to the one in the session array */
if((int)$_POST['captcha'] != $_SESSION['expect'])
	$err[]='The captcha code is wrong!';

/* if there are errors */
if(count($err))
{
	/* if the form was submitted via AJAX */
	if($_POST['ajax'])
	{
		echo '-1';
	}

	/* else fill the SESSION array and redirect back to the form */
	else if($_SERVER['HTTP_REFERER'])
	{
		$_SESSION['errStr'] = implode('&lt;br /&gt;',$err);
		$_SESSION['post']=$_POST;

		header('Location: '.$_SERVER['HTTP_REFERER']);
	}

	exit;
}

/* the email body */
$msg=
'Name:	'.$_POST['name'].'&lt;br /&gt;
Email:	'.$_POST['email'].'&lt;br /&gt;
IP:	'.$_SERVER['REMOTE_ADDR'].'&lt;br /&gt;&lt;br /&gt;

Message:&lt;br /&gt;&lt;br /&gt;

'.nl2br($_POST['message']).'

';

$mail = new PHPMailer();	/* using PHPMailer */
$mail-&gt;IsMail();

$mail-&gt;AddReplyTo($_POST['email'], $_POST['name']);
$mail-&gt;AddAddress($emailAddress);
$mail-&gt;SetFrom($_POST['email'], $_POST['name']);
$mail-&gt;Subject = &quot;A new &quot;.mb_strtolower($_POST['subject']).&quot; from &quot;.$_POST['name'].&quot; | contact form feedback&quot;;

$mail-&gt;MsgHTML($msg);

$mail-&gt;Send();

unset($_SESSION['post']);	/* unsetting */

/* the form was successfully sent */
if($_POST['ajax'])
{
	echo '1';
}
else
{
	$_SESSION['sent']=1;

	if($_SERVER['HTTP_REFERER'])
		header('Location: '.$_SERVER['HTTP_REFERER']);

	exit;
}

/* some helpful functions */
function checkLen($str,$len=2)
{
	return isset($_POST[$str]) &amp;&amp; mb_strlen(strip_tags($_POST[$str]),&quot;utf-8&quot;) &gt; $len;
}

function checkEmail($str)
{
	return preg_match(&quot;/^[\.A-z0-9_\-\+]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/&quot;, $str);
}
[/php]

Обратите внимание как мы проверяем переменную <strong>$_POST[‘ajax’]</strong> на предмет установки и правильной работы. Как вы наверное помните, мы устанавливаем ее ранее, в файле <strong>script.js</strong>, для определения используется ли аякс для извлечения данных.

Две переменные массива <strong>$_SESSION</strong> <strong>errStr</strong> и <strong>post</strong> используются для совместного использования данных между формой и файлом <strong>submit.php</strong>, в случае выключенного JS. Здесь переменная <strong>post</strong> содержит отправленный нами массив <strong>$_POST</strong> и используется для заполнения полей формы, после того как пользователь перенаправляется обратно.

На этом работа над нашей формой обратной связи подошла к концу.

Пример рабочий, за исключением одного маленького недоразумения. Плагин formValidation, создан с целью проводить валидацию только английских символов, так что если вы попытаетесь написать имя по-русски, он выдаст ошибку о том, что нужно вводить только буквы. К счастью это решается путем замены регулярного выражения в файле <strong>jquery.validationEngine.js</strong>. Найдите строчки:

[javascript]
&quot;onlyLetter&quot;:{
	&quot;regex&quot;:&quot;/^[a-zA-Z\ \']+$/&quot;,
}	
[/javascript]

и замените на следующую:

[javascript]
&quot;onlyLetter&quot;:{
	&quot;regex&quot;:&quot;/^[a-zA-Zа-яА-Я' ]+$/&quot;,
}	
[/javascript]

После этого, скрипт перестанет игнорировать русские символы.

<a href="http://dreamhelg.ru/wp-content/uploads/2009/11/contactform.zip">Скачать архив с примером</a>.

<strong>В связи с бесконечными вопросами, специально, отдельно сообщаю: настройка адреса email на который производится отправка писем, находится в файле submit.php, в самом начале файла, выглядит вот так:
</strong>
[php]
/* config start */

$emailAddress = '';

/* config end */
[/php]

Перевод статьи "<a href="http://tutorialzine.com/2009/09/fancy-contact-form/">A Fancy AJAX Contact Form</a>", автор <strong>Martin</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/11/fancy-ajax-contact-form/feed/</wfw:commentRss>
		<slash:comments>92</slash:comments>
		</item>
		<item>
		<title>Решение для очень длинных выпадающих меню</title>
		<link>http://dreamhelg.ru/2009/10/long-dropdowns-solutions/</link>
		<comments>http://dreamhelg.ru/2009/10/long-dropdowns-solutions/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 05:05:30 +0000</pubDate>
		<dc:creator>dreamhelg</dc:creator>
				<category><![CDATA[верстка]]></category>
		<category><![CDATA[общая]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[меню]]></category>
		<category><![CDATA[навигация]]></category>

		<guid isPermaLink="false">http://dreamhelg.ru/?p=1670</guid>
		<description><![CDATA[<p><img width="200" height="169" src="http://dreamhelg.ru/wp-content/uploads/2009/10/home1.jpg" class="attachment-200x200 wp-post-image" alt="home" title="home" /></p>Мне нравится давать статьям точные заголовки, но в данном случае, правильно было бы сказать *<strong>возможное</strong>* решение для очень длинного, выпадающего меню. Проблема с такими меню состоит в том, что выпадающий список может выйти за пределы самой веб-страницы, то есть ниже видимой области окна браузера. Так, что для доступа к нижним пунктам меню, вам понадобится прокручивать страницу до нужного пункта.<span id="more-1670"></span>

Для пользователей, имеющих специальное колесо прокрутки у мыши, это не большая проблема. Для тех же, у кого нет такой полезной функциональности, длинное выпадающее меню станет совершенно неработоспособным, потому что для прокрутки окна, им придется использовать полосу прокрутки браузера, для чего придется отвести мышь от меню, в связи с чем, меню, конечно же, закроется.

Но есть очень простое решение для этого. Прежде чем мы начнем, взгляните на <a href="http://css-tricks.com/examples/LongDropdowns/">результат</a>.

Впервые, я увидел эту идею на странице аккаунта, на сайте Media Temple. У них есть выпадающее меню для «Доменов», в котором перечислены все ваши домены, находящиеся у них на хостинге. Это может быть очень длинный список. Но, Media Temple применили специальную технику – при прокручивании окна, меню также прокручивается в ускоренном режиме.

<img class="aligncenter size-full wp-image-1671" title="mt-below-fold" src="http://dreamhelg.ru/wp-content/uploads/2009/10/mt-below-fold.jpg" alt="mt-below-fold" width="570" height="322" />

И конечно, поскольку я делал скриншот, то обратил внимание, что замечательное решение, которое они так расхваливали, оказалось не таким уж хорошим. Это заставило меня задуматься, какие именно проблемы у них возникают с этим меню, так что давайте смотреть вместе. Далее представлена визуализация идеи:

<img class="aligncenter size-full wp-image-1672" title="visual-long-dropdowns" src="http://dreamhelg.ru/wp-content/uploads/2009/10/visual-long-dropdowns.jpg" alt="visual-long-dropdowns" width="570" height="355" />
<h3>JQuery делает это мгновенно</h3>
Я выложу весь код здесь, просто для справки. Код сопровождают комментарии, так что понять его будет легко. Он насчитывает 60 строк, но не пугайтесь, что это слишком много, весь код очень простой.
<ol>
	<li>Устанавливаем максимальную высоту выпадающего меню</li>
	<li>При наведении открываем дочернее меню</li>
	<li>Рассчитываем коэффициент скорости, основанный на высоте дочернего меню</li>
	<li>Отслеживаем движение мыши в меню</li>
	<li>Прокручиваем меню вместе с движением мыши, основываясь на коэффициенте</li>
	<li>При покидании мыши, закрываем меню</li>
</ol>

[javascript]
var maxHeight = 400;

$(function(){

    $(&quot;.dropdown &gt; li&quot;).hover(function() {

         var $container = $(this),
             $list = $container.find(&quot;ul&quot;),
             $anchor = $container.find(&quot;a&quot;),
             height = $list.height() * 1.1,     // проверяем, достаточно ли свободного места внизу
             multiplier = height / maxHeight; // необходим для более быстрого движения, если список длиннее

        // сохраняем высоту здесь, так что она восстанавливается при покидании мыши       
$container.data(&quot;origHeight&quot;, $container.height());

        // сохраняем цвет наведения, пока открыто выпадающее меню
        $anchor.addClass(&quot;hover&quot;);

        // проверяем, появился ли список непорседственно под родительским списком
        $list
            .show()
            .css({
                paddingTop: $container.data(&quot;origHeight&quot;)
            });

        // Не применяем анимацию, если список короче максимального
        if (multiplier &gt; 1) {
            $container
                .css({
                    height: maxHeight,
                    overflow: &quot;hidden&quot;
                })
                .mousemove(function(e) {
                    var offset = $container.offset();
                    var relativeY = ((e.pageY - offset.top) * multiplier) - ($container.data(&quot;origHeight&quot;) * multiplier);
                    if (relativeY &gt; $container.data(&quot;origHeight&quot;)) {
                        $list.css(&quot;top&quot;, -relativeY + $container.data(&quot;origHeight&quot;));
                    };
                });
        }

    }, function() {

        var $el = $(this);

        // возвращаем все как было
        $el
            .height($(this).data(&quot;origHeight&quot;))
            .find(&quot;ul&quot;)
            .css({ top: 0 })
            .hide()
            .end()
            .find(&quot;a&quot;)
            .removeClass(&quot;hover&quot;);

    });

    // Добавляем нижнюю стрелку только для тех пунктов, у которых есть дочернее меню
    $(&quot;.dropdown &gt; li:has('ul')&quot;).each(function() {
        $(this).find(&quot;a:first&quot;).append(&quot;&lt;img src='images/down-arrow.png' /&gt;&quot;);
    });

});
[/javascript]

<h3>HTML и CSS</h3>
Я не стал выкладывать здесь HTML и CSS, поскольку они очень простые и не интересные. Вы, в любом случае, можете скачать архив с примером, и посмотреть. Это самый обыкновенный, вложенный, маркированный список, и немного очень простых стилей.
<h3>Тестирование</h3>
Пример тестировался во всех браузерах, вплоть до IE6, меню отлично выглядит и работает везде.

<a href="http://css-tricks.com/examples/LongDropdowns.zip">Скачать архив с примером</a>.

Перевод статьи "<a href="http://css-tricks.com/long-dropdowns-solution/">Solution For Very Long Dropdown Menus</a>", автор <strong>Chris Coyier</strong>]]></description>
		<wfw:commentRss>http://dreamhelg.ru/2009/10/long-dropdowns-solutions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

