Как перетаскивать элементы в мобильном браузере?

Вопрос: Я пытаюсь создать изображение, которое должно работать на мобильных устройствах; Большое изображение содержится внутри элемента контейнера, который его обрезает, пользователь может перетаскивать изображение внутри этого контейнера и зажимать для увеличения. Функция перетаскивания работает на настольном браузере, но когда я тестирую мобильный браузер (Android-хром, интернет-браузер Android, iphone safari), он работает неправильно: он не плавный или

Вопрос:

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

Функция перетаскивания работает на настольном браузере, но когда я тестирую мобильный браузер (Android-хром, интернет-браузер Android, iphone safari), он работает неправильно: он не плавный или вообще не тянет. Он перемещает только крошечные, очень маленькие кусочки при попытке пронести или коснуться движения.

Были некоторые тесты с сенсорным, touchstart, touchmove без большой удачи:

У меня есть демо в следующей ссылке (http://jsbin.com/cokil/1/). Не уверен, могу ли я получить несколько советов или советов о том, как это сделать?

  • было сообщено, что исходная ссылка github не загружает hammerjs (загружается здесь), поэтому я получил эту другую загрузку с CDN http://jsbin.com/cokil/3/

  • пожалуйста, помните, что проблема связана с мобильными браузерами

Спасибо, что посмотрели!

Лучший ответ:

Ваш jsbin не включает Hammer js правильно. Заменить:

https://raw.github.com/EightMedia/hammer.js/master/hammer.min.js

с

//cdnjs.cloudflare.com/ajax/libs/hammer.js/1.0.6/hammer.min.js

и ваш скрипт отлично работает.

в скрипте нет необходимости в jQuery. Вы можете использовать собственный DOMContentLoaded и удалить $(document).ready если хотите.

Вам также нужно добавить ‘px’ в конец ваших верхних и левых объявлений

imgEl.style.top = (y + parseFloat(event.gesture.deltaY))+’px’; imgEl.style.left = (x + parseFloat(event.gesture.deltaX))+’px’;

DEMO

Ответ №1

После долгого изучения тишины, слушая, что другие люди говорили об этом и пытаясь сохранить все просто, я придумал следующее решение и надеюсь, что это полезно для кого-то еще в будущем:

document.addEventListener(‘touchstart’, function(event) { event.preventDefault(); var e = new Event(‘dragstart’); element.dispatchEvent(e); }, false); document.addEventListener(‘touchmove’, function(event) { event.preventDefault(); var e = new Event(‘drag’); element.dispatchEvent(e); }, false);

Это работает путем запуска исходного кода, который работает на рабочем столе:

Hammer(element).on(«dragstart», function(event) { imgEl = document.querySelectorAll(«img»)[0]; y = parseFloat(imgEl.style.top) || 0; x = parseFloat(imgEl.style.top) || 0; }); Hammer(element).on(«drag», function(event) { imgEl.style.top = y + parseFloat(event.gesture.deltaY); imgEl.style.left = x + parseFloat(event.gesture.deltaX); });

Оцените статью
Добавить комментарий