jQuery draggable и -webkit-transform: scale();
У меня есть ситуация, когда внутри div
Есть перетаскиваемые предметы. Тем не менее, когда родитель div
масштабируется с использованием -webkit-transform
перетащить, очевидно, перестает работать должным образом.
Я воспроизвел сценарий здесь.
Как видите, перетаскиваемый элемент перемещается относительно документа, даже если родительский элемент находится в совершенно другом масштабе.
У меня есть шкала (1.5
в примере) как переменная в JS, так что я могу использовать это, но где? Мне нужно разделить расстояние перемещения по шкале, верно? Где я мог это сделать?
Изменить: я попытался установить функцию drag
- событие, но не удалось выяснить, как на самом деле изменить расстояние перемещения.
Edit2: я копал исходный код jQuery UI, и кажется, что нет никакого способа сделать это из события drag
:
if(this._trigger('drag', event, ui) === false) {
this._mouseUp({});
return false;
}
Как видите, возвращаемое значение callback-функции никак не сохраняется. Положение элемента изменяется после срабатывания обратного вызова, поэтому изменение CSS внутри обратного вызова не работает.
Вы можете увидеть соответствующий код здесь, используя поиск в браузере с этой строкой:
_mouseDrag: function(event, noPropagation) {
3 ответа
Из-за моего небольшого опыта работы с JavaScript я не осознавал, что обратный вызов может фактически изменить позицию, даже если это не так return
что-нибудь. Это связано с тем, что в JS параметры по умолчанию передаются по ссылке.
Вот рабочий код:
// Couldn't figure out a way to use the coordinates
// that jQuery also stores, so let's record our own.
var click = {
x: 0,
y: 0
};
$('.draggable').draggable({
start: function(event) {
click.x = event.clientX;
click.y = event.clientY;
},
drag: function(event, ui) {
// This is the parameter for scale()
var zoom = 1.5;
var original = ui.originalPosition;
// jQuery will simply use the same object we alter here
ui.position = {
left: (event.clientX - click.x + original.left) / zoom,
top: (event.clientY - click.y + original.top ) / zoom
};
}
});
Я знаю, что мой ответ так поздно, эта проблема опубликована 8 лет назад, но я столкнулся с ней только вчера, и я не смог найти никакого решения в Интернете.
Вот мое решение на
var element_inside_the_scaled_container = $('#element');
$(element_inside_the_scaled_container).draggable({
drag: function (event, ui) {
var constants = normalize_ui_position('#elem_container', UI);
console.log(constants); // They could be useful!
}
});
Вызванная мною функция доступна на моем GitHubgithub
Я думаю, что вам нужен плагин Transformable (http://plugins.jquery.com/project/transformable) jQuery, чтобы "нормализовать" масштабирование WebKit. Тогда перетаскивание будет работать как в Firefox.
Вот плагин - http://flin.org/js/jquery.transformable.js. Я думаю, что это должно решить вашу проблему. Вот моя версия вашего кода: http://jsfiddle.net/vMaXm/4/
$("#parent").setTransform("scalex", 1.5);
//$("#parent").setTransform("scaley", 1.5);
$('.draggable').draggable({ containment: "parent" });
Однако в этот момент, если я раскомментирую среднюю строку, я получу ту же проблему, о которой вы сообщаете.