Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.09.2022, 11:16
Интересующийся
Отправить личное сообщение для borzik2h Посмотреть профиль Найти все сообщения от borzik2h
 
Регистрация: 12.03.2022
Сообщений: 15

Drag-and-drop. Замедлить перетаскивание элемента
Приветствую. Мне нужно замедлить перетаскивание блока. На данный момент сделал так:
<div id="block" style="width: 100px; height: 100px; background:green"></div>

<script>
const block = document.querySelector('#block');

block.addEventListener('mousedown', function(e) {
  const shiftX = e.clientX - this.getBoundingClientRect().left;
  const self = this;
  let speed = 1;

  this.style.position = 'absolute';
  this.style.left = e.pageX - shiftX + 'px';

  function onMouseMove(e) {
    speed = (speed <= 0.5) ? 0.5 : speed - 0.01;
    self.style.left = (e.pageX - shiftX) * speed + 'px';
  }

  function onMouseUp() {
    document.removeEventListener('mousemove', onMouseMove);
    document.removeEventListener('mouseup', onMouseUp);
  }

  document.addEventListener('mousemove', onMouseMove);
  document.addEventListener('mouseup', onMouseUp);
});

block.addEventListener('dragstart', (e) => {
  e.preventDefault();
});
</script>

Но это решение кажется мне каким-то костыльным... Не знаю почему. Как можно еще решить этот вопрос?
Ответить с цитированием
  #2 (permalink)  
Старый 07.09.2022, 20:46
Интересующийся
Отправить личное сообщение для borzik2h Посмотреть профиль Найти все сообщения от borzik2h
 
Регистрация: 12.03.2022
Сообщений: 15

Друзья, есть какие-нибудь идеи?
Ответить с цитированием
  #3 (permalink)  
Старый 08.09.2022, 15:00
Аватар для Alikberov
Кандидат Javascript-наук
Отправить личное сообщение для Alikberov Посмотреть профиль Найти все сообщения от Alikberov
 
Регистрация: 16.08.2018
Сообщений: 109

Eсть вариант, но Вам он не понравится.
<div id="block" style="width: 100px; height: 100px; background:green; position:absolute"></div>

<script>
const block = document.querySelector('#block');
block.addEventListener('mousedown', function(e) {
	var	src = e.srcElement;
	var	offset = {x: e.clientX - src.offsetLeft, y: e.clientY - src.offsetTop};
	var	timer = setInterval(MoveElement.bind(this), 100);
	var	stack = [];
	document.addEventListener("mouseup", DragFinish.bind(this));
	document.addEventListener("mousemove", DragElement.bind(this));
	e.preventDefault();
	function DragElement(e) {
		e.preventDefault();
		var	coords = {
			x: e.clientX - offset.x,
			y: e.clientY - offset.y
		};
		// Игнорируем слишком короткие перемещения
		if(stack.length == 0 || Math.max(Math.abs(coords.x - stack[0].x), Math.abs(coords.y - stack[0].y)) > 8)
			stack.unshift(coords);
	}
	function MoveElement() {
		if(stack.length > 0) {
			var pos = stack.pop();
			src.style.top = pos.y + "px";
			src.style.left = pos.x + "px";
		}
	}
	function DragFinish(e) {
		src.style.top = (e.clientY - offset.y) + "px";
		src.style.left = (e.clientX - offset.x) + "px";
		document.removeEventListener("mouseup", DragFinish.bind(this));
		document.removeEventListener("mousemove", DragElement.bind(this));
		clearInterval(timer);
	}
});
</script>
Ответить с цитированием
  #4 (permalink)  
Старый 08.09.2022, 15:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

<div id="block" style="width: 100px; height: 100px; background:green; transition: left 1s"></div>
<script src="https://unpkg.com/debounce"></script>
<script>
const block = document.querySelector('#block');

block.addEventListener('mousedown', function(e) {
  const shiftX = e.clientX - this.getBoundingClientRect().left;
  const self = this;
  let speed = 1;

  this.style.position = 'absolute';
  this.style.left = e.pageX - shiftX + 'px';

  const onMouseMove = debounce((e) => {
    self.style.left = e.pageX - shiftX + 'px';
  }, 300);

  function onMouseUp() {
    document.removeEventListener('mousemove', onMouseMove);
    document.removeEventListener('mouseup', onMouseUp);
  }

  document.addEventListener('mousemove', onMouseMove);
  document.addEventListener('mouseup', onMouseUp);
});

block.addEventListener('dragstart', (e) => {
  e.preventDefault();
});
</script>
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 08.09.2022, 19:10
Интересующийся
Отправить личное сообщение для borzik2h Посмотреть профиль Найти все сообщения от borzik2h
 
Регистрация: 12.03.2022
Сообщений: 15

Благодарю.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ищу Drag & drop плагин для построения плана помещения Den Brown Элементы интерфейса 0 31.07.2015 19:23
drag & drop , html 5 cyber Events/DOM/Window 1 30.06.2012 15:16
drag and drop Родительского элемента путем перетаскивания дочернего l-liava-l Элементы интерфейса 0 01.04.2012 20:28
Drag & Drop с несколькими элементами Katz Общие вопросы Javascript 1 29.07.2011 13:01
Плавный Drag & drop div элемента rootking Events/DOM/Window 10 07.09.2010 13:03