Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.10.2023, 11:27
Кандидат Javascript-наук
Отправить личное сообщение для sashgera Посмотреть профиль Найти все сообщения от sashgera
 
Регистрация: 20.09.2011
Сообщений: 140

Скролл дива при перетаскивании в нем элементов
Здравствуйте

Есть див с id "dragContainer", в котором динамически создается список li. Список можно перетаскивать мышью.
При перетаскивании элемента li вверх/вниз, нужно начать скроллить див, если li перемещен за пределы высоты дива.
На данный момент скролл работает медленнее, чем перетаскивается элемент.
Пожалуйста, помогите.
JS выполняется не в браузере, а в гаджете Windows. Вот видео - https://youtube.com/shorts/P1FI2xN2Trk
var Drag = {

	obj : null,

	init : function(obj){
		obj.onmousedown	= Drag.start;
		obj.style.pixelTop = 0;
		obj.onDragStart = new Function();
		obj.onDragEnd = new Function();
		obj.onDrag = new Function();
	},

	start : function(e){
		Drag.obj = this;
		e = Drag.fixE(e);
		Drag.obj.lastMouseY = e.clientY;
		document.onmousemove = Drag.drag;
		document.onmouseup = Drag.end;
		return false;
	},

	drag : function(e){
		e = Drag.fixE(e);
		var ey	= e.clientY;
		var y = parseInt(Drag.obj.style.pixelTop);
		var ny = parseInt(y + ey - Drag.obj.lastMouseY);
		Drag.obj.style.pixelTop = ny;
		Drag.obj.style.pixelLeft = 15;
		Drag.obj.lastMouseY	= ey;
		Drag.obj.onDrag(ny, Drag.obj);
		// скролл------------------------------------------------------------------------------------------
		dragContainerHeight = document.getElementById("dragContainer").offsetHeight;
		
		if (dragContainerHeight < Drag.obj.lastMouseY){
			document.getElementById("dragContainer").scrollTop = Drag.obj.lastMouseY - dragContainerHeight;
		}
		// ------------------------------------------------------------------------------------------------
		return false;
	},

	end : function(){
		document.onmousemove = null;
		document.onmouseup = null;
		Drag.obj.onDragEnd(Drag.obj);
		Drag.obj = null;
	},

	fixE : function(e){
		if (typeof e == 'undefined') e = window.event;
		return e;
	}
};
Ответить с цитированием
  #2 (permalink)  
Старый 13.10.2023, 22:10
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,748

Сообщение от sashgera
На данный момент скролл работает медленнее, чем перетаскивается элемент.
Скролл работает с той скоростью, с которой может.
Просто надо поменять логику скролла.
Скролить окно надо не в том случае, когда мышь двигается, а когда нижняя граница перетаскиваемого элемента достигла нижней границы элемента в котором производится скролл, независимо от того, движется мышь или нет. Главное, что бы кнопка мыши была нажата.
Оставить курсор мыши в пределах окна вы все равно не сможете. Это общесистемный ресурс и браузеру он не подчиняется. Если мышь двигается, то будет двигаться и курсор.
Ответить с цитированием
  #3 (permalink)  
Старый 15.10.2023, 01:53
Кандидат Javascript-наук
Отправить личное сообщение для sashgera Посмотреть профиль Найти все сообщения от sashgera
 
Регистрация: 20.09.2011
Сообщений: 140

Сообщение от voraa Посмотреть сообщение
Скролить окно надо не в том случае, когда мышь двигается, а когда нижняя граница перетаскиваемого элемента достигла нижней границы элемента в котором производится скролл
voraa, начал делать, но возникли проблемы, которые не могу решить. Не поможете?

- если полоса прокрутки равна 0, все хорошо - скролл начинается когда перетаскиваемый элемент достиг нижней границы дива
- если полоса прокрутки больше нуля, проблема - при начале перетаскивания элемента, полоса прокрутки из начального положения уменьшается на растояние, которое равно: от текущего положения перетаскиваемого элемента до нижней границы дива
- если перетаскивать снизу вверх - скролл начинается сразу, а не когда элемент достигает верхней части дива
// переменная dragContainer - див, в котором находятся элементы
// переменная myElem - перетаскиваемый элемент
if (myElem.offsetTop > (dragContainer.offsetHeight + dragContainer.offsetTop)){
  dragContainer.scrollTop = (myElem.offsetHeight + myElem.offsetTop) - (dragContainer.offsetHeight + dragContainer.offsetTop);
}
Ответить с цитированием
  #4 (permalink)  
Старый 15.10.2023, 09:26
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,748

Нет. Не помогу.
Нужен весь код, что бы разбираться, что там происходит и иметь возможность тестировать.
Но я смутно представляю, что такое "гаджет" в виндовс 7, какой там js, да и 7 у меня нет.
Ответить с цитированием
  #5 (permalink)  
Старый 16.10.2023, 10:15
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,748

А почему не использовать обычный нативный drag n drp?
Там проблем со скроллингом нет - все делается автоматически.
Хоть и не полностью он поддерживается даже в старых IE
Ответить с цитированием
  #6 (permalink)  
Старый 16.10.2023, 11:27
Кандидат Javascript-наук
Отправить личное сообщение для sashgera Посмотреть профиль Найти все сообщения от sashgera
 
Регистрация: 20.09.2011
Сообщений: 140

voraa, я уже пробовал что-то типа этого - https://stackoverflow.com/questions/...nding-on-mouse но ничего не получилось, для работы в старых ie менял метод addEventListener на attachEvent
Ответить с цитированием
  #7 (permalink)  
Старый 16.10.2023, 18:00
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

sashgera,
Подключи jquery просто, и плагин какой-нибудь, например, есть jquery-ui, там есть sortable. Все версии можешь скачать здесь: jquery, jquery-ui. Начинай с jquery 1.12.4 и jquery-ui 1.12.1, если что-то не работает понижай версию. Иногда можно по годам что-то подгонять, например, windows 7 вышла в 2009-м, значит jquery близкого года выпуска точно должна поддерживаться, год выпуска указан в uncompressed версиях, ну это так, windows 7 здесь просто для примера, в целом это всего касается, на будущее тебе совет просто, а поддерживаться на самом деле могут и более позднии версии.
Ответить с цитированием
  #8 (permalink)  
Старый 16.10.2023, 23:47
Кандидат Javascript-наук
Отправить личное сообщение для sashgera Посмотреть профиль Найти все сообщения от sashgera
 
Регистрация: 20.09.2011
Сообщений: 140

Rise, первое, что я пытался сделать, это подключить jquery. Но при подключении гаджет перестает работать
Ответить с цитированием
  #9 (permalink)  
Старый 17.10.2023, 07:53
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,748

Сообщение от sashgera
Но при подключении гаджет перестает работать
У вас там $ используется для каких то других целей.
Используйте jQuery.noConflict()
https://api.jquery.com/jquery.noconflict/
Ответить с цитированием
  #10 (permalink)  
Старый 18.10.2023, 13:22
Кандидат Javascript-наук
Отправить личное сообщение для sashgera Посмотреть профиль Найти все сообщения от sashgera
 
Регистрация: 20.09.2011
Сообщений: 140

Скролл при перетаскивании элементов сделал. Скажите, при скролле, расстояние между перетаскиваемым элементом и курсором увеличивается - это нормальное состояние? так и должно быть? Вот видео https://youtube.com/shorts/VbGXOzoyZ_0
Во вложении файл js с функциями drag, событие скролла отметил комментом
Вложения:
Тип файла: zip dom-drag_.zip (1.4 Кб, 0 просмотров)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как убрать скролл при клике на кнопку? marki1404 Элементы интерфейса 1 03.01.2019 19:42
Появление/исчезновение дива при клике на ссылку nickostyle jQuery 5 18.01.2016 03:03
Удаление событий при удалении DOM элементов nextdrift Events/DOM/Window 4 23.11.2015 01:07
Изменение содержимого дива при нажатии Alex351960 Элементы интерфейса 2 21.09.2013 00:37
Смена картинки (бекграунд дива ) при событии (нажатие клавиш или клавиши и мыши) Monster Events/DOM/Window 5 01.11.2009 01:16