sortable examples drop dragging divs and accept jquery jquery-ui scroll draggable jquery-ui-draggable

jquery - examples - ui draggable dragging



Con jquery ui draggable, ¿es posible tener diferentes scrollsensitivity vertical versus horizontal? (2)

Estoy usando jquery ui draggable y me di cuenta de que quiero que la sensibilidad de desplazamiento sea mucho más pequeña cuando estoy arrastrando hacia arriba (en lugar de hacia la izquierda / derecha). ¿Es posible tener una configuración diferente para el arrastre vertical frente al horizontal?

Aquí está mi código actual

$(".myDraggable").draggable( { stack: ".myDraggable", scroll: true, scrollSensitivity: 250, scrollSpeed: 40, revert: function (event, ui) { $(this).data("uiDraggable").originalPosition = { top: 0, left: 0 }; return !event; } } );


Respuesta actualizada

Ejemplo de trabajo: http://jsfiddle.net/22bpbsrw/3/

Creo que detecta cuándo funciona un evento de desplazamiento en la ventana gráfica. Puede establecer la velocidad de desplazamiento y la sensibilidad a continuación.

var lastScrollTop = 0, lastScrollLeft = 0, delta = 5; $(''#viewPort'').scroll(function (event) { var st = $(this).scrollTop(); var sl = $(this).scrollLeft(); if (Math.abs(lastScrollTop - st) > delta) { $("#draggable").draggable("option", "scrollSensitivity", 5); $("#draggable").draggable("option", "scrollSpeed", 10); (st > lastScrollTop) ? console.log(''scroll down'') : console.log(''scroll up''); lastScrollTop = st; } if (Math.abs(lastScrollLeft - sl) > delta) { $("#draggable").draggable("option", "scrollSensitivity", 100); $("#draggable").draggable("option", "scrollSpeed", 40); sl > lastScrollLeft ? console.log(''scroll right'') : console.log(''scroll left''); lastScrollLeft = sl; } });

Vieja respuesta

Izquierda por si acaso podría ayudar a otros.

No puede tener explícitamente diferentes valores de scrollSensitivity para cada dirección. ¿Tal vez podría enviar un ticket para esa mejora?

Es posible que pueda cambiarlo mediante la función de arrastre ( según esta respuesta ). Vea el ejemplo de trabajo aquí: http://codepen.io/anon/pen/mbups?editors=001

drag: function(e) { console.log($("#drag1").draggable( "option", "scrollSensitivity")); if(prevX == -1) { prevX = e.pageX; } // dragged left or right if(prevX > e.pageX || prevX < e.pageX) { // dragged right $("#drag1").draggable( "option", "scrollSensitivity", 100 ); } prevX = e.pageX; if(prevY == -1) { prevY = e.pageY; } // dragged up or down if(prevY > e.pageY || prevY < e.pageX) { // dragged down $("#drag1").draggable( "option", "scrollSensitivity", 1 ); } prevY = e.pageY; }

Puede establecer la scrollSensitivity función de la dirección del elemento arrastrado.


Aunque parece que la solución de JSuar funciona, también quiero intentarlo.

Resolviendo el problema con jQuery UI El widget arrastrable no es posible.

No hay una función explícita para obtener información sobre si el objeto se mueve vertical u horizontalmente. De hecho, en la mayoría de los casos, el objeto se mueve en ambas direcciones . Pero podríamos definir nuestra propia función para ver cómo se movió el cursor

Use una función personalizada para obtener información sobre el objeto arrastrado

La idea es disparar un evento en mousemove y verificar la posición del cursor cada vez. Después de un cierto intervalo de movimientos de mouse, verificamos el movimiento general para establecer la sensibilidad de desplazamiento. En este caso, simplemente suponemos que el usuario probablemente arrastre en la misma dirección para los siguientes movimientos.

Aquí hay un ejemplo de trabajo de JSFiddle.

HTML

<div id="viewPort"> <div id="draggable">drag me</div> </div>

CSS

#viewPort { width: 300px; height: 300px; background: #fff; overflow:scroll; border:1px solid #ccc; } #draggable { color: #fff; width: 75px; height: 75px; padding: 10px; background: #333399; border:1px solid #ccc; margin:5px; }

JS

//current count of how often we got the mouse positon var count = 0; //position of mouse at last function call var lastPositionX; var lastPositionY; //how often we moved in one direction in the last intervall var movedX; var movedY; //intervall to check movement again var countIntervall = 30; $("#draggable").draggable({ scrollSensitivity: 1000, scrollSpeed: 40, revert: function (event, ui) { $("#draggable").originalPosition = { top: 0, left: 0 }; return !event; }, drag: function (e) { setScrollSensivity(); } }); //init first mousepostion $("#draggable").on(''click'', function() { lastPositionX = event.pageX; lastPositionY = event.pageY; }); function setScrollSensivity(){ count++; //get current mousepostion var currentPositionX = event.pageX; var currentPositionY = event.pageY; //increase if moved on chose axis if ( currentPositionX != lastPositionX ){ movedX++; } if ( currentPositionY != lastPositionY ){ movedY++; } //if moved more on x axis decrease sensivity, else increase. if (count == countIntervall){ if (movedX > movedY){ console.log("moving on X axis"); $( "#draggable" ).draggable( "option", "scrollSensitivity", 10 ); } else { console.log("moving on Y axis"); $( "#draggable" ).draggable( "option", "scrollSensitivity", 200 ); } //reset all the counters and start again count = 0; movedX = 0; movedY = 0; } //set last position for our next function call lastPositionX = currentPositionX; lastPositionY = currentPositionY; }