Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.07.2013, 15:28
Аспирант
Отправить личное сообщение для IVAAAAN Посмотреть профиль Найти все сообщения от IVAAAAN
 
Регистрация: 04.07.2013
Сообщений: 47

Drag-n-Drop тормозит
Пишу свой Drag-n-Drop, вот сделал, но как-то когда перетаскиваю то элемент идет не плавно, прерывисто
var drag = false;
	var dragElem = document.getElementById('drag');
	var x,y;
	dragElem.addEventListener('mousedown', function(e){
		drag = true;


	});
	dragElem.addEventListener('mouseup', function(){
		drag = false;
	});
	dragElem.addEventListener('mousemove', function(e){
		if(drag){
		x = e.pageX;
		y = e.pageY;
     	$("#drag").css({'left':x, 'top':y});

	}
	});


почему так?
Ответить с цитированием
  #2 (permalink)  
Старый 09.07.2013, 15:39
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

правельней не через флаг делать, а сброс события при отпускании
т.е. приблизительно так:
dragElem.addEventListener('mouseup', function(){
dragElem.mousemove = undefined;
});
а когда идет клик по элементу то необходимо привязывать эту функцию.. и привязывать желательно не к текущему элементу а к объекту document
Ответить с цитированием
  #3 (permalink)  
Старый 09.07.2013, 15:42
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от IVAAAAN
dragElem.addEventListener('mousemove', function(e){
13 if(drag){
14 x = e.pageX;
15 y = e.pageY;
16 $("#drag").css({'left':x, 'top':y});
18 }
а чего уж там ? сдвинули на 20 пикселов за пару милесекунд , заставили 20 раз перерисоваться в то в то время как глаз различает http://ru.wikipedia.org/wiki/%D0%9A%...BE%D1%82%D0%B0
Ответить с цитированием
  #4 (permalink)  
Старый 09.07.2013, 15:45
Аспирант
Отправить личное сообщение для IVAAAAN Посмотреть профиль Найти все сообщения от IVAAAAN
 
Регистрация: 04.07.2013
Сообщений: 47

Сообщение от dmitriymar Посмотреть сообщение
а чего уж там ? сдвинули на 20 пикселов за пару милесекунд , заставили 20 раз перерисоваться в то в то время как глаз различает http://ru.wikipedia.org/wiki/%D0%9A%...BE%D1%82%D0%B0
ну а как тогда делать то правильно?
Ответить с цитированием
  #5 (permalink)  
Старый 09.07.2013, 15:46
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от IVAAAAN
ну а как тогда делать то правильно?
гугл. если в пределлах 15 -30 мс было множество мувов запущенно -отрисовать последний
Ответить с цитированием
  #6 (permalink)  
Старый 09.07.2013, 15:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

IVAAAAN,
Drag and drop
Ответить с цитированием
  #7 (permalink)  
Старый 09.07.2013, 15:49
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

<div onmouserdown="drag(event, this)" style="background:red; height:100px; width:100px"></div>


function drag(a, b)
{
   a = a || window.event;
   b.clicked = true;
   b.mousePosX = a.clientX;
   b.mousePosY = a.clientY;
   if(a.preventDefault) a.preventDefault(); 
   else a.returnValue = false;
   document.onmouseup = function()
   {
      b.clicked = false;
   }
   document.onmousemove = function(a)
   {
      a = a || window.event;
      if(b.clicked)
      {
         posLeft = !b.style.marginLeft ? b.offsetLeft : parseInt(b.style.marginLeft);
         posTop = !b.style.marginTop ? b.offsetTop : parseInt(b.style.marginTop);
         mousePosX = a.clientX;
         mousePosY = a.clientY;
         b.style.marginLeft = posLeft + mousePosX - b.mousePosX + 'px';
         b.style.marginTop = posTop + mousePosY - b.mousePosY + 'px';
         b.mousePosX = mousePosX;
         b.mousePosY = mousePosY;
      }
   }
}

Последний раз редактировалось ruslan_mart, 09.07.2013 в 15:51.
Ответить с цитированием
  #8 (permalink)  
Старый 09.07.2013, 15:54
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Ruslan_xDD
posLeft = !b.style.marginLeft ? b.offsetLeft : parseInt(b.style.marginLeft);
угу , всякий раз дёргать dom спрашивая у элемента его позицию parseInt(b.style.marginLeft) ....
Ответить с цитированием
  #9 (permalink)  
Старый 09.07.2013, 15:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

drag and drop
Сообщение от IVAAAAN
но как-то когда перетаскиваю то элемент идет не плавно, прерывисто
зачем вам jquery если вы не используите его Drag-n-Drop
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
 div{
   background-color: #CC0000;
   height: 100px;
   width: 100px;
   position: relative;
   cursor: pointer;
 }

  </style>
</head>
<body>
 <div id="drag"></div>
<script>
var drag = false;
	var dragElem = document.getElementById('drag');
	var x,y;
	dragElem.addEventListener('mousedown', function(e){
		drag = true;


	});
	dragElem.addEventListener('mouseup', function(){
		drag = false;
	});
	document.addEventListener('mousemove', function(e){
		if(drag){
		x = e.pageX;
		y = e.pageY;
        dragElem.style.left = x-50+'px'
        dragElem.style.top = y-50+'px'
	}
	});
</script>
</body>
</html>

Последний раз редактировалось рони, 06.12.2018 в 18:54.
Ответить с цитированием
  #10 (permalink)  
Старый 09.07.2013, 16:02
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

мой варик:
<html>
	<head>
		<style type="text/css">
div
{
width: 100px;
height: 100px;
background-color: red;
position: absolute;
cursor: pointer;
}
		</style>

	</head>
	<body>
		<div id="div" style="left: 0px; top: 0px;"></div>
		<script type="text/javascript">
var div = document.getElementById('div');

var x, y;

function mousePageXY(e)
	{
	var x = 0, y = 0;
	if (!e) e = window.event;
	if (e.pageX || e.pageY)
		{
		x = e.pageX;
		y = e.pageY;
		}
	else 
		if (e.clientX || e.clientY)
		{
		x=e.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)-document.documentElement.clientLeft;
		y=e.clientY+(document.documentElement.scrollTop||document.body.scrollTop)-document.documentElement.clientTop;
		}
	return {"x":x, "y":y};
	}

var move = function(e)
	{
	var k = mousePageXY(e);
	div.style.left = -x + k.x + 'px';
	div.style.top = -y + k.y + 'px';
	//console.log(k);
	}

div.onmousedown = function(e)
	{
	var k = mousePageXY(e);
	x = k.x - parseInt(this.style.left);
	y = k.y - parseInt(this.style.top);
	document.onmousemove = move;
	//console.log(k);
	}

document.onmouseup = function(e)
	{
	document.onmousemove = undefined;
	}
		</script>
	</body>
</html>

Последний раз редактировалось skrudjmakdak, 09.07.2013 в 20:57.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Drag and Drop Antistas jQuery 0 07.12.2012 14:41
drag & drop , html 5 cyber Events/DOM/Window 1 30.06.2012 15:16
Помогите с drag and drop shtopor jQuery 1 20.02.2012 13:26
Разбираюсь с drag and drop uaNikita Events/DOM/Window 4 22.09.2011 11:25
Drag & Drop с несколькими элементами Katz Общие вопросы Javascript 1 29.07.2011 13:01