Drag - лёгкий плагин для перетаскивания элементов

Сегодняшний плагин призван заменить плагин Draggable в тех проектах, где не требуется довольно тяжелый jQuery UI. Плагин с незамыслыватым названием Drag весит всего 400 байт и может выполнять те же действия, что и его старший собрат.

Примеры

Простой вызов плагина

$('#ex1').drag();

Функции, срабатывающие при начале и окончании передвижения

$('#ex2').drag({
	start:function(elem){
		elem.html('Блок удерживается');
	}, stop:function(elem){
		elem.html('Блок отпущен');
}});
В плагине есть два события - start и stop, которые сраватывают при старте и окончании передвижения соответственно. Через переменную elem можно обращаться к элементу, который передвигается в данный момент.

Теперь рассмотрим код плагина с пояснениями:
(function($){
	$.fn.drag = function(o){
		var o = $.extend({
			start:function(){},   // при начале перетаскивания
			stop:function(){} // при завершении перетаскивания
		}, o);
		return $(this).each(function(){
		    var d = $(this); // получаем текущий элемент
		    d.mousedown(function(e){ // при удерживании мыши
                            $(document).unbind('mouseup'); // очищаем событие при отпускании мыши
			    o.start(d); // выполнение пользовательской функции
			    d.css('position','absolute');
			    var f = d.offset(), // находим позицию курсора относительно элемента
			    x = e.pageX - f.left,  // слева
			    y = e.pageY - f.top;  // и сверху
                            $(document).mousemove(function(a){ // при перемещении мыши
			        d.css({'top' : a.pageY - y + 'px','left' : a.pageX - x + 'px'}); // двигаем блок
			    });
			    return false;
		    });
		    $(document).mouseup(function(){  // когда мышь отпущена
			$(document).unbind('mousemove'); // убираем событие при перемещении мыши
			o.stop(d); // выполнение пользовательской функции
		    });
              });
	}
})(jQuery);
Надеюсь, что данный плагин окажется кому-то полезным. Мне он уже помогает в небольших собственных проектах, в которых не нужна вся мощь jQuery UI.


Комментарии

15 июня 2010, 20:48 (Ответить)
Спасибо автору за данный плагин. Очень интересный. Пойду поюзаю...
4 сентября 2010, 4:54 (Ответить)
Надо добавить еще функцию перетаскивания не за весь блок а лишь за его часть. Попробуйте выделить текст "блок отпущен".
4 сентября 2010, 21:50 (Ответить)
Была такая идея.
Если будет время, доработаю.
1 ноября 2010, 9:19 (Ответить)
Спасибо за плагин.
Только хорошо бы пример в отдельном окне.
У меня есть див с панелью инструментов, который надо перемещать по всему окну, что-то он у меня убегает при перемещении вашим плагином
1 ноября 2010, 9:24 (Ответить)
Дело здесь в том, что панель инструментов должна быть постоянна в поле зрения, т.е. position "fixed", а не "absolute" как в примерах.
Возможна ли работа плагина в данном случае?
1 ноября 2010, 10:09 (Ответить)
Да, если вы замените следующие две строки
x = e.pageX - f.left,  // слева
y = e.pageY - f.top;  // и сверху
на эти
x = $(document).scrollLeft() + e.pageX - f.left,  // слева
y = $(document).scrollTop() + e.pageY - f.top;  // и сверху
и установите position в значение fixed.
4 ноября 2011, 23:07 (Ответить)
Сделал так, но когда страница уже прокручена глюки начинаются - смещение передвигаемого элемента относительно курсора.
28 июля 2011, 12:07 (Ответить)
А что за формат плагина .download ?
23 сентября 2011, 0:39 (Ответить)
Отлично, спасибо за урок!
6 декабря 2011, 10:24 (Ответить)
Допилил под себя, чтобы можно было таскать блок только за его шапку

шапка

что-нибудь



$('#block .head').grag({obj: $('#block')});




$.fn.drag = function(o){
var o = $.extend({
start:function(){}, // при начале перетаскивания
stop:function(){}, // при завершении перетаскивания
obj:$(this)
}, o);
return $(this).each(function(){
var d = $(this); // получаем текущий элемент
c = o.obj;
d.mousedown(function(e){ // при удерживании мыши
c.css('position','absolute');
$(document).unbind('mouseup'); // очищаем событие при отпускании мыши
o.start(c); // выполнение пользовательской функции
var f = c.offset(), // находим позицию курсора относительно элемента
x = e.pageX - f.left, // слева
y = e.pageY - f.top; // и сверху

$(document).mousemove(function(a){ // при перемещении мыши
c.css({'top' : a.pageY - y + 'px','left' : a.pageX - x + 'px'}); // двигаем блок
});
$(document).mouseup(function(){ // когда мышь отпущена
$(document).unbind('mousemove'); // убираем событие при перемещении мыши
o.stop(c); // выполнение пользовательской функции
});
return false;
});
});
}
15 марта, 22:31 (Ответить)
Подскажите пожалуйста как можно остановить (запретить) перетаскивание по достижению определенной позиции? Задача сделать блок который сначала прячется за верхней границей окна, его можно вытащить вниз. Я попробовал с помощью setInterval определять позицию блока во время перетаскивания и останавливать setInterval и unbind mousedown функции когда позиция достигнута. Однако толку не хватило сделать

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