Практическое применение виджета slider библиотеки jQuery UI. Слайдер для сайта

jquery ui slider

От автора: многие из Вас, при посещении интернет магазинов, встречали такую вещь, как сортировку товаров по цене. При этом в некоторых случаях эта сортировка выполнена в виде горизонтальной полосы прокрутки, с двумя ползунками, двигая которые можно указывать диапазон интересующих Вас цен. В сегодняшнем уроке мы с Вами рассмотрим практическое применение одного из виджетов библиотеки jQuery UI – slider.

В уроке мы реализуем виджет сортировки по цене с горизонтальной полосой прокрутки, а также создадим небольшую простенькую фотогалерею на основе указанного виджета библиотеки jQuery UI. В уроке вы научитесь создавать слайдер для сайта.

Детали учебника

Тема: jQuery

Сложность: Средняя

Урок: Видео (.mp4)

Время: 01:38:51

Размер архива: 156 Mb

скачать исходникидемоскачать урок

1. Создание виджета сортировки по цене.

1.1. Создаем html разметку.

Для начала, давайте реализуем слайдер, с помощью которого можно задавать диапазон цен в интернет магазине. Для этого создадим текстовый файл с обычной html разметкой (файл price.html) :

<!DOCTYPE html>
<html lang="en">
	<head>
		<title></title>
	</head>
	<body>

	</body>
</html>

Теперь нам необходимо создать форму и два текстовых поля: первое для минимальной цены, второе для максимальной цены. При этом заключим форму в контейнер div с идентификатором id=’options’(для удобства, как бы с имитируем то, что обычно такие текстовые поля находятся в сайдбарах интернет магазинов).

Итак между тегами body вставляем следующий код:

<div id='options'>
	<h3>Цена:</h3>
	<form method='post'>
		<label for='price'>
		От:
			<input type="text" name="price" id="price" maxlength="10">
		</label>
		<label for='price2'>
		До:	
			<input type="text" name="price" id="price2" maxlength="10">
		</label>
	</form>
</div>

Как видите стандартная форма, только я не создавал кнопку submit (отправки формы). Так отправлять данные мы не будем, потому что нам главное научиться добавлять слайдер, а отправка формы то уже стандартные вещи, которые все известны.

Далее необходимо создать пустой контейнер div в котором у нас будет располагаться слайдер. Добавим этот контейнер после закрывающего тега формы:

<div id="slider_price"></div>

1.2. Создаем и подключаем файл стилей.

Далее давайте создадим таблицу стилей и немного приукрасим нашу форму. Я создал файл style.css в папке css, с таким содержимым:

#price,#price2 {
	border:1px solid #074776;
	padding:5px;
	width:80px;
}
#options {
	width:300px;
	padding:10px;
	border:1px solid #074776;
}
#slider_price {
	margin-top:10px;	
} 

Далее осталось просто подключить данный файл между тегами head:

<link rel="stylesheet" href="css/style.css">

Давайте посмотрим предварительные результаты нашей работы в браузере:

jquery ui slider

1.3. Скачиваем и подключаем библиотеки jQuery и jQuery UI.

Теперь переходим к кодированию на javascript.

Первым делом скачиваем библиотеку jquery и подключаем к нашему скрипту (напомню, что скачать библиотеку можно с официального сайта http://jquery.com) :

<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>

Далее необходимо скачать и подключить библиотеку jquery UI. С помощью этой библиотеки мы и реализуем слайдер для изменения цен. А точнее мы используем стандартный виджет библиотеки jquery UI — slider, который позволяет реализовывать различные слайдеры для сайтов. Напомню, что скачать библиотеку можно на официальном сайте http://jqueryui.com, перейдя по ссылке Download. Далее выбрать режим скачивания, то есть либо Вы скачиваете полную версию библиотеки с полным набором виджетов функций и эффектов, либо скачиваете только то, что Вам нужно (галочками отмечаете требуемые компоненты библиотеки). Я предпочитаю лишнего не качать, поэтому для скачивания я выбрал только виджет slider, полный набор эффектов и, конечно же, ядро библиотеки. Далее напомню, что Вы можете перед скачиванием выбрать цветовую схему отображаемых элементов библиотеки, для этого либо выбрать из выпадающего списка конкретный стандартный стиль, либо же можно сгенерировать цветовой стиль самому, перейдя по ссылке design a custom theme.

Итак, подключаем библиотеку:

<script type="text/javascript" src="js/jquery-ui-1.8.19.custom.min.js"></script>

И теперь, последнее, что нам необходимо подключить — это файл со стилями для нашей библиотеки, поэтому подключаем и его:

<link rel="stylesheet" href="css/jquery-ui-1.8.19.custom.css">

1.4. Кодируем на javascript.

После того как все необходимые библиотеки подключены, давайте вернемся на официальный сайт библиотеки jquery UI. Далее перейдем в раздел Demos & Documentation, затем кликаем мышью по виджету — slider. И как Вы видите, справа в колонке нам представлены для выбора различные варианты использования виджета, а в центре показано как будет отображаться на экране выбранный виджет.

Посмотрите на пример Range slider, как видите — это и есть тот слайдер, который мы хотим реализовать. Ниже под примером есть ссылка View Sourcе, нажав на которую мы сможем посмотреть как данный пример сделан (то есть посмотреть исходный код примера).

Если внимательно посмотреть, то можно увидеть, что исходный код состоит из двух частей: первая часть это обычная html разметка, которая у нас уже выполнена, а вторая — это код на javascript, который нам и нужно скопировать и вставить себе в файл.

Поэтому из исходного кода копируем код заключенный в теги script. Вот код, который необходимо скопировать:

<script>
	$(function() {
		$( "#slider-range" ).slider({
			range: true,
			min: 0,
			max: 500,
			values: [ 75, 300 ],
			slide: function( event, ui ) {
				$( "#amount" ).val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
			}
		});
		$( "#amount" ).val( "$" + $( "#slider-range" ).slider( "values", 0 ) +
			" - $" + $( "#slider-range" ).slider( "values", 1 ) );
	});
	</script>

Далее вставляем его в файл с нашим скриптом, но обратите внимание, что в данном коде необходимо изменить селекторы по которым с помощью jquery выбираются элементы.

Смотрите, вначале выбирается элемент с идентификатором slider-range и к нему применяется виджет slider. В нашем же случае, слайдер будет в блоке с идентификатором slider_price, который как Вы помните, мы создали под формой. Поэтому изменяем селектор выбора с #slider-range на #slider_price. Далее обратите внимание, что в примере минимальная и максимальная цена записываются в одно текстовое поле, а нам необходимо что бы минимальная цена записывалась в первое текстовое поле, а максимальная — во второе. Поэтому, необходимо внести небольшие изменения в код.

Далее я приведу уже исправленный код, который необходимо вставить в наш скрипт (а ниже поясню все изменения).

<script>
	$(function() {
		$( "#slider_price" ).slider({
			range: true,
			min: 0,
			max: 500,
			values: [ 75, 300 ],
			slide: function( event, ui ) {
				//Поле минимального значения
				$( "#price" ).val(ui.values[ 0 ]);
				//Поле максимального значения
				$("#price2").val(ui.values[1]);			}
		});
		//Записываем значения ползунков в момент загрузки страницы
		//То есть значения по умолчанию
		$( "#price" ).val($( "#slider_price" ).slider( "values", 0 ));
		$("#price2").val($("#slider_price").slider( "values", 1 ));
	});
</script>	

Как Вы видите, код состоит из двух частей: первая это описание самого слайдера, а вторая — это запись в текстовые поля значений по умолчанию.

Итак, вначале, мы выбираем блок с идентификатором slider_price и применяем к нему виджет slider, с такими параметрами:

— range: true — если установлено в true, то между минимальным и максимальным значением на слайдере подсвечивается область, тем самым показывает нам, что выбран диапазон значений;
- min: 0 — минимальное значение на слайдере;
- max: 500 — максимальное значение на слайдере;
- values: [ 75, 300 ] — значения по умолчанию, которые будут установлены изначально на слайдере (то есть ползунки будут установлены в значения 75 и 300);
- slide: — в этом параметре можно описать функцию которая выполнится, когда пользователь начнет двигать ползунки. В нашем случае мы описываем функцию, которая считывает значения ползунков и передает их в значение атрибута value текстовых полей минимума и максимума.

Функция работает следующим образом: в начале с помощью jquery производим выборку по идентификатору «#price» текстового поля, затем вызываем метод val() и параметром передаем ему считанное значение с левого (минимального значения) ползунка на слайдере.

Напомню, что метод val(), если вызван без параметров, позволяет получить значение атрибута value выбранного элемента, если же передать ему какое то значение, то мы не получим значение а наоборот запишем это значение в атрибут value.

Считываем значение с ползунка следующим образом: производим выборку по идентификатору «#slider_price» блока div в котором находится слайдер, затем обращаемся к слайдеру и вызываем у него метод values, с индексом (номером) ползунка. Так как нас интересует в данный момент левый ползунок (минимального значения), то указываем его индекс 0.

Для текстового поля максимального значения все действия аналогичны только указываем индекс ползунка 1.

Далее записываем значения ползунков в момент загрузки страницы, для этого производим выборку по идентификатору «#price» поля минимального значения цены, далее вызываем метод val(), и параметром передаем ему значение, считанное с ползунка минимального значения. Это значение можно получить выбрав по идентификатору «#slider_price» блок в котором находится слайдер, затем обратится к его методу «values» (обратите внимание как записан метод — в скобках и в кавычках пишем имя метода, как параметр) и как и раньше передаем индекс (номер) ползунка. Для текстового поля максимального значения цены действия аналогичны.

Как Вы уже поняли метод slider( «values», 0 ) — возвращает значение ползунка с индексом 0, если же передать третьим параметром какое ни буть значение (slider( «values», 0 , 400)), то метод установит значение ползунка в то значение, которое передано третьим параметром (то есть значение ползунка будет 400).

Перейдем в браузер и посмотрим, что у нас получилось.

jquery ui slider

Как Вы видите, слайдер нормально работает и при перетаскивании ползунков значения текстовых полей изменяется.

Если добавить к свойствам вызова слайдера свойство: orientation: «vertical», то слайдер будет располагаться вертикально:

jquery ui slider

Теперь давайте реализуем возможность того что если пользователь вводит значение цены непосредственно в текстовое поле, то что бы после ввода ползунок слайдера передвигался на указанное в поле значение.

Для текстового поля минимального значение эта возможность реализуется с помощью в таких строк кода:

$('#price').change(function() {
			var val = $(this).val();
			$('#slider_price').slider("values",0,val);
		});

Здесь все просто: вначале производим выборку по идентификатору ‘#price’, затем вызываем обработчик события change (он сработает когда пользователь изменит значение тестового поля) и в обработчике описываем функцию, которая получает с помощью метода val() значение текстового поля и затем с помощью метода слайдера slider(«values»,0,val) изменяет значения ползунка (тем самым, передвигая ползунок на указанное значение).

Для текстового поля максимального значения все аналогично:

$('#price2').change(function() {
			var val1 = $(this).val();
			$('#slider_price').slider("values",1,val1);
		});

Теперь давайте проверим в браузере отработку скрипта. Итак все работает нормально, при изменении значений в текстовых полях, ползунки перемещаются на введенное значение.

Итак, давайте еще раз посмотрим на результат нашей работы, смотрите, как быстро и просто, используя виджет slider, мы с Вами создали очень удобную сортировку по цене, которая пригодится для любого интернет магазина.

Хочу еще обратить Ваше внимание на то, что в том месте, где мы с Вами копировали исходный код примера, немножко ниже имеется небольшая документация по данному виджету. Где описаны все свойства и методы данного виджета, поэтому рекомендую Вам посмотреть, может найдете для себя что то полезное, хотя главные свойства и методы мы с Вами рассмотрели.

2. Создание фотогалереи.

2.1. Создаем html разметку.

Теперь давайте посмотрим (на официальном сайте jquery UI раздел Demos&Documentation пункт slider) на еще один очень интересный пример реализации виджета слайдер – это Simple scrollbar.

jquery ui slider

Как вы видите с помощью этого виджета можно реализовать, как бы скроллер каких то объектов, к примеру картинок. Можно поместить в каждую ячейку по картинке и с помощью ползунка прокрутки листать изображения.

Давайте реализуем этот пример, то есть сделаем маленькую очень простую галерею картинок. Для этого, что бы не терять время скопируем из файла price.html весь код кроме кода расположенного между script и body и сохраним под именем slider.html (вот его код):

<html lang="en">
	<head>
		<link rel="stylesheet" href="css/style.css">
		<link rel="stylesheet" href="css/jquery-ui-1.8.19.custom.css">
		<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
		<script type="text/javascript" src="js/jquery-ui-1.8.19.custom.min.js"></script>
		<title></title>
</head>
	<body>
</body>
</html>	

Далее, я заготовил папку с изображениями images, в ней 10 изображений маленького размера и 10 этих же изображений, но большого размера, которые имеют такие же имена, но располагаются в папке big. Скопируем папку в корень нашего скрипта.

Теперь откроем исходный код примера реализации Simple scrollbar, давайте начнем его рассматривать снизу. Как Вы видите, внизу у нас идет обычная html разметка. Давайте скопируем этот участок кода (он содержится между тегами body). Затем внесем в него некоторые изменения, а именно добавим стиль style=»width:800px» в блок div с классом class=»scroll-pane», вставим картинки в каждую ячейку будущей галереи, и добавим блок div с классом class=»results», в котором будут отображаться увеличенные изображения (в момент загрузки будет отображено первое изображение).

Итак, в итоге получился вот такой код html разметки:

<div class="demo" style="padding:10px;width:850px;height:450px;border:1px solid #074776; position:relative">
	<div class="results" style="clear:both;width:320px;height:200px;border:1px solid #074776;padding:10px;margin:0px auto 0px auto">
		
	</div>
<div class="scroll-pane ui-widget ui-widget-header ui-corner-all" style="width:800px">
	<div class="scroll-content">
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"></div>
		<div class="scroll-content-item ui-widget-header"><img src="images/10.jpg"></div>
	</div>
	<div class="scroll-bar-wrap ui-widget-content ui-corner-bottom">
		<div class="scroll-bar"></div>
	</div>
</div>

</div><!-- End demo -->

2.2. Пишем логическую часть фотогалереи.

Дальше опять возвращаемся к исходному коду и скопируем код расположенный между тегами script. Я удалил из него две функции, которые для нашего примера не нужны, эти функции отвечали за поведение слайдера при изменении размеров окна. Вот такой вид имеет код, который необходимо вставить между тегами head:

<script>
$(function() {
		//scrollpane parts
		var scrollPane = $( ".scroll-pane" ),
			scrollContent = $( ".scroll-content" );
		
		//build slider
		var scrollbar = $( ".scroll-bar" ).slider({
			slide: function( event, ui ) {
				if ( scrollContent.width() > scrollPane.width() ) {
					scrollContent.css( "margin-left", Math.round(
						ui.value / 100 * ( scrollPane.width() - scrollContent.width() )
					) + "px" );
					//alert(Math.round(
						//ui.value / 100 * ( scrollPane.width() - scrollContent.width())));
				} else {
					scrollContent.css( "margin-left", 0 );
				}
			}
		});
		//рассчитывается ширина ползунка слдайдера в зависимости от ширины
		//блока с классом scroll-content
		//append icon to handle
		var handleHelper = scrollbar.find( ".ui-slider-handle" )
		.mousedown(function() {
			scrollbar.width( handleHelper.width() );
		})
		.mouseup(function() {
			scrollbar.width( "100%" );
		})
		.append( "<span class='ui-icon ui-icon-grip-dotted-vertical'></span>" )
		.wrap( "<div class='ui-handle-helper-parent'></div>" ).parent();
		
		//change overflow to hidden now that slider handles the scrolling
		scrollPane.css( "overflow", "hidden" );
		
		//size scrollbar and handle proportionally to scroll distance
		function sizeScrollbar() {
			var remainder = scrollContent.width() - scrollPane.width();
			var proportion = remainder / scrollContent.width();
			var handleSize = scrollPane.width() - ( proportion * scrollPane.width() );
			scrollbar.find( ".ui-slider-handle" ).css({
				width: handleSize,
				"margin-left": -handleSize / 2
			});
			handleHelper.width( "" ).width( scrollbar.width() - handleSize );
		}
		
		
		//init scrollbar size
		setTimeout( sizeScrollbar, 10 );//safari wants a timeout
	});
</script>

Здесь, конечно, все сложнее, чем в нашем первом примере, но это на первый взгляд. Смотрите, вначале производим выборку по классу $( «.scroll-bar» ) пустого блока div, в котором будет располагаться слайдер (полоса прокрутки). Затем сравниваем по ширине два блока первый с классом scroll-content, второй с классом scroll-pane. Блок с классом scroll-content изначально намного шире блока scroll-pane, так как в нем располагаются изображения и если посмотреть стили этого блока (в исходном коде, мы чуть позже добавим их к скрипту), то можно увидеть, что там выставлена огромная ширина width: 2440px. Поэтому выполнится условие if и при движении ползунка слайдера, наш блок с классом scroll-content будет получать отрицательный левый отступ пропорционально движению ползунка, тем самым смещаясь влево. Далее описывается функция sizeScrollbar(), которая рассчитывает длину ползунка сладера в зависимости от ширины блока с классом scroll-content (тоесть размер ползунка пропорционален контенту который он перемещает — чем больше контент тем меньше ползунок).

И последнее перед просмотром в браузере давайте скопируем из исходного кода стили и вставим в наш файл, только я их немного подкорректировал в соответствии с нашим примером (немного изменил ширину блока с изображениями и добавил стилей для изображений ), вот смотрите:

<style>
	#demo-frame > div.demo { padding: 10px !important; }
	.scroll-pane { overflow: auto; width: 99%; float:left; }
	.scroll-content { width: 1720px; float: left; }
	.scroll-content-item { width: 150px; height: 94px; float: left; margin: 10px; font-size: 3em; line-height: 96px; text-align: center; }
	* html .scroll-content-item { display: inline; } /* IE6 float double margin bug */
	.scroll-bar-wrap { clear: left; padding: 0 4px 0 2px; margin: 0 -1px -1px -1px; }
	.scroll-bar-wrap .ui-slider { background: none; border:0; height: 2em; margin: 0 auto;  }
	.scroll-bar-wrap .ui-handle-helper-parent { position: relative; width: 100%; height: 100%; margin: 0 auto; }
	.scroll-bar-wrap .ui-slider-handle { top:.2em; height: 1.5em; }
	.scroll-bar-wrap .ui-slider-handle .ui-icon { margin: -8px auto 0; position: relative; top: 50%;}
	.results img {width:320px;height:200px;}
	
</style>

Теперь давайте перейдем в браузер и посмотрим на результат нашей работы:

jquery ui slider

Итак, получился вот такой вот скроллер картинок, теперь необходимо реализовать возможность, что бы при клике по маленькому изображению, в центральном блоке появлялась увеличенная копия этого изображения. Давайте этим и займемся.

Вот код, который необходимо добавить, перед, или после, кода слайдера (а ниже я приведу описание его работы):

$('.scroll-content-item img').each(function () {
		$(this).click(function() {
			var url = $(this).attr('src');
			var path = 'images/big/' + url.substring(url.indexOf('/') + 1);
			$('.results').html('<img src="' + path +'"' + '>' ).hide();
			$('.results').fadeIn(1000);
		});
	});

Для начала сделаем выборку всех изображений в блоке с классом scroll-content-item, затем применим метод each. Этот метод позволяет нам создавать циклы, для последовательно прохода по каждому элементу выборки. Так как изображений у нас десять, а значит и в выборку попадет десять элементов, поэтому с помощью метода each мы можем работать с каждым элементом выборки. Внутри этого метода описываем функцию, которая будет отрабатывать для каждого элемента выборки. Далее для каждого элемента выборки вызываем обработчик события click. Этот обработчик сработает, когда по элементу кликнуть мышью, и как только это произойдет – выполнится функция, которая описана в обработчике. В этой функции мы получаем значение атрибута src, для изображения, с помощью метода attr() (в скобках указываем имя атрибута, значение которого хотим получить). То есть в переменную url запишется строка images/1.jpg (для первой картинки).

Далее формируем переменную path в которой будет хранится путь к изображению большого размера. Делаем это следующим образом: вначале вырезаем имя файла с помощью методов substring() и indexOf(), а затем прибавляем строку ‘images/big/’. И в конце производим выборку блока с классом results, вставляем в этот блок новую картинку (при помощи метода html()) с адресом, записанным в переменной path, далее мгновенно скрываем этот блок (при помощи метода hide()). Затем показываем блок, используя анимацию при помощи метода fadeIn(), со скоростью в 1 секунду(1000 миллисекунд).

Давайте перейдем в браузер и посмотрим:

jquery ui slider

Как Вы видите, теперь, если кликнуть мышью по маленькому изображению, в центральном блоке появляется увеличенная копия этого изображения (то есть как бы предварительный просмотр).

Теперь давайте сделаем так, что бы при клике по изображению в центре – это изображение увеличивалось до своего исходного размера, а при последующем клике – возвращалось обратно в исходное положение.

Итак, вначале как обычно код, а затем пояснения:

$('.results').toggle(
	//первый клик
	function() {
		$('.results img').css({
							'z-index':'100',
							'position':'absolute',
							'border':'10px solid #ffffff'
							
							});
		$('.results img').animate({
							'width':'800px',
							'height':'500px',
							'marginLeft':'-240px',
							'marginTop':'100px'
							
							});
	
	},
	//второй клик
	function() {
		$('.results img').css({
							'border':'0'
							
							});
		$('.results img').animate({
							'width':'320px',
							'height':'200px',
							'marginLeft':'0px',
							'marginTop':'0px'
							
							});
	
	}); 

Первым делом производим выборку блока с классом results и применяем к нему метод toggle(). Этот метод позволяет реализовать своего рода переключатель, то есть в этом методе мы описываем две функции: первая выполнится при первом клике мыши, вторая – при втором клике мыши.

Итак, функция для первого клика: производим выборку изображений в блоке с классом results и с помощью метода css() (метод позволяет задать выбранному элементу произвольные css-стили) зададим несколько правил css-стилей, а именно рамку, позицию и свойство z-index то есть вынесем изображение на первый план. Далее к этому блоку применяем метод animate() (данная функция предназначена для создания пользовательской анимации, то есть она принимает параметрами css правила, и если они отличны от существующих правил элемента, то происходит анимированное изменение этих правил, к примеру, если ширина элемента 100 пикселей и мы передаем методу animate() ширину в 200 пикселей то ширина элемента плавно увеличится до 200 пикселей) и передаем новые правила css-стилей, а именно исходные ширину и высоту изображения, а также верхний и левый отступы, чтобы изображение не смещалось в сторону, и при увеличении располагалось по центру.

Далее аналогично описываем функцию для второго клика, только при этом меняем правила css-стилей, которые передаем в методы css() и animate().

Итак, переходим в браузер и посмотрим, что у нас получилось:

jquery ui slider

Вот, что у меня получилось при клике по центральному изображению, соответственно при втором клике изображение возвращается на место, и обратите внимание, что с довольно неплохой анимацией.

На этом наша небольшая и простенькая галерея изображений завершена, она получилась, на мой взгляд, очень даже неплохой и удобной. Галерея не занимает много места, притом, что картинок в ней можно расположить сколько угодно, очень удобно листать изображения, используя при этом предварительный просмотр, а также очень красиво отображается исходная величина изображения.

Итак, на этом урок можно заканчивать, надеюсь, урок был Вам интересен, и вы подчеркнули для себя много нового и полезного, научились создавать слайдер для сайта. Если Вам понравился данный виджет используйте его по своему усмотрению, он очень полезен, и на его основе можно реализовать много интересных вещей. А у меня пока все, будут вопросы, пишите – постараемся на них ответить.

Удачного Вам кодирования и до новых встреч!

JavaScript&jQuery с нуля до профи

Пройдите пошаговый видеокурс по JavaScript&jQuery

Научиться

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (4)

  1. Александр

    Ну, мне понравилось смотреть фильм :)
    Все доходчиво, внятно и понятно. Спасибо че :)

  2. Iryna

    Отличный урок!
    Всё теперь понятно и, как оказалось, совсем несложно)
    Большое-пребольшое Вам спасибо.

  3. Анатолий

    Добрый день!
    Вы мне очень помогли.
    Доходчиво разъяснили и показали.

    С уважением,
    Анатолий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree