Перемещение/Передвижение с помощью класса Drag.Move – Урок 12


Drag.Move – Перемещение с помощью Mootools 1.2

С 10-го урока я начал публиковать уроки, посвященные спец. эффектам, которые можно создавать с помощью библиотеки Mootools. Если Вы еще не взглянули в эти уроки, очень рекомендую посмотреть.

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

Используется этот класс также, как и все остальные плагины библиотеки: создается новый («new») объект Drag.Move и назначается переменной. Далее назначаются параметры и события объекта. В принципе, это и есть вся основа. Кстати, объекты Drag и Drag.Move не определены в основной библиотеке, потом нужно будет создавать свою собственную сборку Mootools с помощью онлайн инструмента на сайте разработчиков.

Основы

Drag.Move

Установка перетаскиваемого элемента довольно проста. Давайте рассмотрим пример ниже. Обратите внимание, как отделяются параметры и события класса Drag.Move от событий и параметров класса Drag. Drag.Move расширяет и дополняет класс Drag, потому он будет принимать не только свои параметры и события, но и те, что относятся к классу Drag. Сегодня мы не будем углубляться в работу Drag, но мы взглянем на несколько его интересных параметров и событий.

var myDrag = new Drag.Move(dragElement, {

	        // параметры класса Drag.Move
		droppables: dropElement,
		container: dragContainer,

		// параметры класса Drag
		handle: dragHandle,
		// событие класса Drag.Move
		onDrop: function(el, dr) {

                        // вызовет предупреждение с атрибутом id сброшенного элемента
                        // в элемент, принимающий сброшенные элементы
                        // (это может показаться запутанным, на первый взглад, но, надеюсь,
                        // далее все проясниться
                        alert(dr.get('id'));

		},
                // События Drag
                // передаются перетаскиваемому элементу
                onComplete: function(el) {

			alert(el.get('id'));
		}
	});

Разберем всё это по полочкам…

Параметры Drag.Move

Параметры Drag.Move позволяют назначить два основных типа элементов:

  • droppables – опеределяет элементы, которые будут способны «принять» сброшенный элемент
  • container – установить контейнер перетаскиваемого элемента (будет удерживать элемент внутри этого элемента-контейнера)

Установка параметров доволно проста:

//определяем один элемент по id, который можно будет перетаскивать
var dragElement = $('drag_element');
//определяем массив элементов по их классу, которые смогут принят сброшенный элемент

var dropElements = $$('.drag_element');
//определяем контейнер
var dragContainer = $('drag_container');

//определяем объект Drag.Move
var myDrag = new Drag.Move(dragElement , {

	        // Параметры Drag.Move
                // назначаем элементу droppables массив элементов, определённых немного выше
		droppables: dropElements ,
               // назначаем элементу container элемент, определенный немного выше
		container: dragContainer
	});

Теперь наш перетаскиваемый элемент имеет свой контейнер, а также у нас имеется класс элементов, который будет принимать сбросы других элементов. Тут можно провести аналогию с современными аэропортами: не все аэропорты предназначены для принятия и обслуживания определенных типов самолётов. Так и в нашем случае: необходимо определить, какой класс сможет принимать «на посадку» перетаскиваемые элементы.

События объекта Drag.Move

События этого объекта дают возможность запускать определенные заранее функции в определенные этапы существования объекта, как например в тот момент, когда пользователь «совершил захват» передвигаемого элемента, когда он начинает его передвигать или когда он его сбрасывает. События объекта Drag.Move передаются каждому перетаскиваемому и сбрасывамому элементу в качестве параметров.

  • onDrop – запускается при сбросе элемента в соответствующий принимающий элемент;
  • onLeave – запускается когда перетаскиваемый элемент покидает границы элемента, способного принимать перетаскиваемые элементы;
  • onEnter – запускается при входе перетаскиваемого элемента в зону принимающего элемента.

Как и любые другие события, которые мы до этого обсуждали, события объекта Drag.Move вызывают функцию, которая выполняется когда событие исполняется.

var dragContainer = $('drag_container');

 
var myDrag = new Drag.Move(dragElement , {
	// Параметры Drag.Move

	droppables: dropElements ,
	container: dragContainer ,
	// События Drag.Move

	// функции Drag.Move передадут перетаскиваемый элемент (в данном случае 'el')
	// принимающему элементу, с которым перетаскиваемый взаимодействует (у нас 'dr')
	onDrop: function(el, dr) {

		// на русском: "если элемента, на который происходит сброс НЕ ЯВЛЯЕТСЯ принимающий"
		if (!dr) {
			//ничего не делать
		}

		// в противном случае, т.е. элемент принимающий
		// делать то-то, то-то
		else {
			// действия, который произойдут,
			// когда элемента будет сброшен на принимающий элемент

		};
	},
	onLeave: function(el, dr) {

		// эта функция будет запущена, когда перетаскиваемый элемент
		// покинет границы принимающего элемента
	},
	onEnter: function(el, dr) {

		// эта функция будет запущена, когда перетаскиваемый элемент
		// входит в границы принимающего элемента
	}
});

Несколько событий объекта Drag

У объекта Drag есть совсем немного событий и параметров, но и я не все буду рассматривать:

Параметр – snap

Параметр snap позволяет определить, на сколько пикселей пользователь должен передвинуть курсор прежде чем начнется сам процесс перемещения элемента. Значение по умолчанию – 6, но можно указать любое число или переменную, содержащую число. Конечно же, существуют некие логические рамки (установив это значение на 1000, никакой пользы не принесешь своему приложению), но все-таки этот параметр может сослужить хорошую службу разработчику при улучшении своего приложения.

var myDrag = new Drag.Move(dragElement , {

	        // Параметры Drag
		snap: 10
	});

Параметр – handle

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

// определяет массив элементов по классу
// это позволит нам добавить несколько "ручек",
// если нам нужно будет определять несколько передвигаемых элементов
var dragHandle = $('drag_handle');

var myDrag = new Drag.Move(dragElement , {
	        // параметры Drag

		handle: dragHandle
	});

Событие onStart

Событие onStart определяет функцию, которая будет запускаться при начале перетаскивания. Если значение параметра snap установлено большое, то событие не начнется до тех пор, пока заданное количество пикселей не будет пройдено.

var myDrag = new Drag.Move(dragElement , {

	        // Параметры Drag
		onStart: function(el) {
                    // сюда вставляем всё, что должно произойти вначале перетаскивания

               }
	});

Событие – onDrag

Событие onDrag будет работать постоянно во время перетаскивания элемента.

var myDrag = new Drag.Move(dragElement , {
	        // Параметры Drag

		onDrag: function(el) {
                    // сюда вставляем всё, что должно происходить во время перетаскивания
               }

	});

Событие onComplete

Событие onComplete запускается когда происходит сброс перетаскиваемого элемента и оно будет запущено вне зависимости от того, будет этот элемент приземлен в элементе droppable или нет.

var myDrag = new Drag.Move(dragElement , {

	        // Параметры Drag
		onComplete: function(el) {
                    // сюда вставляем всё, что должно произойти при сбросе элемента

               }
	});

Примеры

Снова подошло время моей любимой части любого урока: Пример!

Давайте, для упрощения процесса переваривания всей информации этого урока, соорудим пример, который бы содержал максимум из представленных параметров, событий и т.д. Поехали!

window.addEvent('domready', function() {

	var dragElement = $('drag_me');
	var dragContainer = $('drag_cont');

	var dragHandle = $('drag_me_handle');
	var dropElement = $$('.draggable');

	var startEl = $('start');
	var completeEl = $('complete');

	var dragIndicatorEl = $('drag_ind');
	var enterDrop = $('enter');

	var leaveDrop = $('leave');
	var dropDrop = $('drop_in_droppable'); 

 
	var myDrag = new Drag.Move(dragElement, {

	    // Параметры Drag.Move
		droppables: dropElement,
		container: dragContainer,

		// Параметры Drag
		handle: dragHandle,
		// События Drag.Move
		onDrop: function(el, dr) {

			if (!dr) { }
 
        	        else {

				dropDrop.highlight('#FB911C'); //мигает оранжевым
				el.highlight('#fff'); //мигает белым

				dr.highlight('#667C4A'); //мигает зеленым
			};
		},

		onLeave: function(el, dr) {
			leaveDrop.highlight('#FB911C'); //мигает оранжевым

		},
		onEnter: function(el, dr) {

			enterDrop.highlight('#FB911C'); //мигает оранжевым
		},
		// Drag Events

		onStart: function(el) {
			startEl.highlight('#FB911C'); //мигает оранжевым

		},
		onDrag: function(el) {
			dragIndicatorEl.highlight('#FB911C'); //мигает оранжевым

		},
		onComplete: function(el) {
			completeEl.highlight('#FB911C'); //мигает оранжевым

		}
	});
});

В этом примере, в отличие от большинства ранее представленных, мы будем серьезно использовать CSS, потому нужно добавить некоторые пояснения к таблице CSS. Для того, чтобы контейнер Drag.Move нормально определялся в IE, нужно будет подробно объяснить позиционирование элементов этому популярному браузеру. Очень важно определить элементу-контейнеру «position:relative», а перетаскиваемому элементу «position:absolute». Далее нужно удостовериться в том, что знаяения «left» и «top» для этого элемента тажке установлены. Ну, а если вы создаете приложение с перетаскиваемыми элементами, которое никоим образом не предназначается для IE, можете вообще не обращать внимание на эту часть.

body {

	margin: 0;
	padding: 0;
}
 

/* убедитесь в том, что перетаскиваемый элемент умеет "position: absolute"
 а параметры top и left установлены на значения для первоначального положения элемента*/
#drag_me {
	width: 100px;
	height: 100px;

	background-color: #333;
	position: absolute;
	top: 0;

	left: 0;
}
 
#drop_here {
	width: 200px;

	height: 200px;
	background-color: #eee;
}
 

/* убедитесь в том, что элемент-контейнер имеет "position:relative" */
#drag_cont {
	background-color: #ccc;
	height: 600px;

	width: 500px;
	position: relative;
	margin-top: 100px;

	margin-left: 100px;
}
 
#drag_me_handle {
	width: 100%;

	height: auto;
	background-color: #666;
	cursor:move;

}
 
#drag_me_handle span {
	display: block;
	padding: 5px;

}
 
.indicator {
	width: 100%;
	height: auto;

	background-color: #0066FF;
	border-bottom: 1px solid #eee;

}
 
.indicator span {
	padding: 10px;
	font-size:14px;

	display: block;
}
 
.draggable {
	width: 200px;

	height: 200px;
	background-color: blue;
}

Далее следует HTML код, который создаст нам плацдарм для восхощения возможностями Mootools.

<div id="drag_cont">
<div id="start" class="indicator"><span>Начало</span></div>

<div id="drag_ind" class="indicator"><span>Перетаскивание</span></div>
<div id="complete" class="indicator"><span>Завершен</span></div>

<div id="enter" class="indicator"><span>Вход в принимающий элемент</span></div>
<div id="leave" class="indicator"><span>Выход из принимающего элемента</span></div>

<div id="drop_in_droppable" class="indicator"><span>Сброшен в принимающий элемент</span></div>
<div id="drag_me">

<div id="drag_me_handle"><span>ручка</span></div>
</div>
<div id="drop_here" class="draggable"></div>

</div>

Начало
Перетаскивание
Завершен
Вход в принимающий элемент
Выход из принимающего элемента
Сброшен в принимающий элемент
ручка

, , ,

  1. #1 by Александр on 16.11.2011 - 7:07 am

    Спасибо за уроки. Маленькое замечание. Не совсем очевидно, что кроме стандартной библиотеки нужно взять еще и дополнительную с сайта mootools. Да, вы указываете “Кстати, объекты Drag и Drag.Move не определены в основной библиотеке…” Однако все равно для “новичка” не слишком прозрачно, что нужно сделать, чтобы примеры заработали. Было бы идеально если бы вы дали ссылку на уже готовые файлы mootools-а. Спасибо.

    • #2 by proglammer on 21.11.2011 - 6:50 pm

      спасибо за совет! в ближайшее время попробую разъяснить… единственное “но”, а mootools.net нет просто ссылок для скачивания, а есть конструктор, с помощью которого можно собрать библиотеку Mootools именно для вашего сайта. Может, попробую просто добавлять файлы для скачивания к каждому уроку :) в любом случае, спасибо за совет!

(никто не узнает)

Код на картинке: