Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Плавный Drag & drop div элемента (https://javascript.ru/forum/events/11681-plavnyjj-drag-drop-div-ehlementa.html)

rootking 07.09.2010 12:23

Плавный Drag & drop div элемента
 
Доброго времени суток.
Есть такая задача, при перетаскивание div элемента, когда его отпускаешь он должен плавно продолжить движение. Но вот беда в том что setTimeout, в котором вызывается функция перемещения, засунутый в цикл не работает. Подскажите, пожалуйста, как быть.

Kolyaj 07.09.2010 12:26

А зачем setTimeout засовывать в цикл?

rootking 07.09.2010 12:30

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

Skipp 07.09.2010 12:32

ыыы, setInterval - вот вам setTimeout в цикле.

rootking 07.09.2010 12:35

Один фиг не работает. Браузеры просто подвисают и элемент моментально перескакивает на конечную точку.

Skipp 07.09.2010 12:36

rootking,
мдеее, код приведите

Kolyaj 07.09.2010 12:38

А в цикле-то его зачем запускать? Это ж не sleep.

rootking 07.09.2010 12:43

var d;
addEvent(document, 'mousedown', mousedown);

function mousedown(e){
	e = e || event;
	var target = e.target || e.srcElement;
	if (target.className == 'top' && target.parentNode.className == 'drag') {
		d = target.parentNode;
		d.startX = parseInt (getStyle(d, 'left'));
		d.startY = parseInt (getStyle(d, 'top'));
		d.mouseX = e.clientX;
		d.mouseY = e.clientY;
		d.X = document.documentElement.clientWidth;
		d.Y = document.documentElement.clientHeight;
		addEvent(document, 'mousemove', mousemove);
		addEvent(document, 'mouseup', mouseup);
		
	}
	
}

function mousemove(e){
	e = e || event;
	var target = e.target || e.srcElement;
	cancelEvent(e);
	d.style.left = d.startX + (e.clientX - d.mouseX) + 'px';
	d.style.top = d.startY + (e.clientY - d.mouseY) + 'px';
	if (d.startX + e.clientX > d.mouseX) {
		if (d.X - e.clientX > d.offsetWidth + d.startX - d.mouseX) {
			moveX(d.startX + e.clientX - d.mouseX);
		} else {
			moveX(d.X - d.offsetWidth);
		}
	} else {
		moveX(0);
	}
	if (d.startY + e.clientY > d.mouseY) {
		//moveY(d.startY + (e.clientY - d.mouseY));
		if (d.Y - e.clientY > d.offsetHeight + d.startY - d.mouseY) {
			moveY(d.startY + e.clientY - d.mouseY);
		} else {
			moveY(d.Y - d.offsetHeight);
		}
	} else{
		moveY(0);
	}
}

function mouseup(e){
	e = e || event;
	var target = e.target || e.srcElement;
        moveTX();
	removeEvent(document, 'mousemove', mousemove);
	removeEvent(document, 'mouseup', mouseup);
}

function moveX(x){
	d.style.left = x + 'px';
	
}
function moveY(y){
	d.style.top = y + 'px';
}

function moveTX(){
	for (var i=0, b=128; i<5; i++){
        setTimeout(d.style.left = (parseInt(d.style.left)+b) + 'px',1000);
        b=b/2;
        
    }
}

Прошу прощения, если код корявый:-?

Kolyaj 07.09.2010 12:45

http://javascript.ru/setTimeout

rootking 07.09.2010 12:53

Цитата:

Сообщение от Kolyaj (Сообщение 70000)

Так где ошибка? по идеи он должен был выполниться 5 раз, и 5 раз останавливаться, но он не останавливается ни разу и браузер моментально перемещает элемент в конечное положение.


Часовой пояс GMT +3, время: 10:42.