@@ -282,7 +282,7 @@ function addEventListener(target, event, callback, options) {
282282 target . addEventListener ( event , callback , options ) ;
283283 return ( ) => target . removeEventListener ( event , callback , options ) ;
284284}
285- function enableDragAndZoom ( element , container , callback ) {
285+ function enableDragAndZoom ( element , container , onUpdateCallback ) {
286286 // set style
287287 const className = "ufs-drag-and-zoom" ;
288288 element . classList . add ( className ) ;
@@ -306,7 +306,6 @@ function enableDragAndZoom(element, container, callback) {
306306 ( container || element ) . appendChild ( style ) ;
307307
308308 // config
309- let dragging = false ;
310309 const lerpSpeed = 0.3 ;
311310 const last = { x : 0 , y : 0 } ;
312311 const mouse = { x : 0 , y : 0 } ;
@@ -317,20 +316,31 @@ function enableDragAndZoom(element, container, callback) {
317316 height : parseFloat ( element . style . height ) ,
318317 } ;
319318
320- let animationId ;
319+ let run = true ;
321320 function animate ( ) {
321+ let updated = false ;
322+ let updatedValue = { } ;
322323 for ( let prop in animTarget ) {
323- element . style [ prop ] =
324- lerp ( parseFloat ( element . style [ prop ] ) , animTarget [ prop ] , lerpSpeed ) +
325- "px" ;
324+ const currentValue = parseFloat ( element . style [ prop ] ) ;
325+ const targetValue = animTarget [ prop ] ;
326+ let del = Math . abs ( targetValue - currentValue ) ;
327+
328+ if ( del > 0 ) {
329+ const newValue =
330+ del < 1 ? targetValue : lerp ( currentValue , targetValue , lerpSpeed ) ;
331+ element . style [ prop ] = newValue + "px" ;
332+ updatedValue [ prop ] = newValue ;
333+ updated = true ;
334+ }
326335 }
327-
328- animationId = requestAnimationFrame ( animate ) ;
336+ if ( updated ) onUpdateCallback ?. ( updatedValue ) ;
337+ if ( run ) requestAnimationFrame ( animate ) ;
329338 }
330339
331340 animate ( ) ;
332341
333342 // Mouse down event listener
343+ let dragging = false ;
334344 let _down = addEventListener ( container || element , "mousedown" , function ( e ) {
335345 e . preventDefault ( ) ;
336346 dragging = true ;
@@ -349,7 +359,6 @@ function enableDragAndZoom(element, container, callback) {
349359
350360 animTarget . left += delX ;
351361 animTarget . top += delY ;
352- callback ?. ( { ...animTarget , type : "move" } ) ;
353362
354363 last . x = e . clientX ;
355364 last . y = e . clientY ;
@@ -372,34 +381,30 @@ function enableDragAndZoom(element, container, callback) {
372381 let _wheel = addEventListener ( container || element , "wheel" , function ( e ) {
373382 e . preventDefault ( ) ;
374383
375- let curScale = parseFloat ( element . style . width ) / element . width ;
376- let delta = - e . wheelDeltaY || - e . wheelDelta ;
377- let factor = Math . abs ( ( 0.3 * delta ) / 120 ) ;
378- let newScale =
384+ const curScale = parseFloat ( element . style . width ) / element . width ;
385+ const delta = - e . wheelDeltaY || - e . wheelDelta ;
386+ const factor = Math . abs ( ( 0.3 * delta ) / 120 ) ;
387+ const newScale =
379388 delta > 0 ? curScale * ( 1 - factor ) : curScale * ( 1 + factor ) ;
380389
381- let newWidth = element . width * newScale ;
382- let newHeight = element . height * newScale ;
390+ const newW = element . width * newScale ;
391+ const newH = element . height * newScale ;
383392
384- if ( newWidth < 10 || newHeight < 10 ) {
393+ if ( newW < 10 || newH < 10 ) {
385394 return ;
386395 }
387396
388- let left = parseFloat ( element . style . left ) ;
389- let top = parseFloat ( element . style . top ) ;
390- let offsetX = mouse . x - left ;
391- let offsetY = mouse . y - top ;
392-
393- let newLeft = left - ( newWidth - element . width ) * ( offsetX / element . width ) ;
394- let newTop =
395- top - ( newHeight - element . height ) * ( offsetY / element . height ) ;
397+ const left = parseFloat ( element . style . left ) ;
398+ const top = parseFloat ( element . style . top ) ;
399+ const offsetX = mouse . x - left ;
400+ const offsetY = mouse . y - top ;
401+ const newLeft = left - ( newW - element . width ) * ( offsetX / element . width ) ;
402+ const newTop = top - ( newH - element . height ) * ( offsetY / element . height ) ;
396403
397404 animTarget . left = newLeft ;
398405 animTarget . top = newTop ;
399- animTarget . width = newWidth ;
400- animTarget . height = newHeight ;
401-
402- callback ?. ( { type : "scale" } ) ;
406+ animTarget . width = newW ;
407+ animTarget . height = newH ;
403408 } ) ;
404409
405410 let listeners = [ _down , _move , _up , _leave , _wheel ] ;
@@ -412,7 +417,7 @@ function enableDragAndZoom(element, container, callback) {
412417 animTarget . height = h ;
413418 } ,
414419 destroy : ( ) => {
415- cancelAnimationFrame ( animationId ) ;
420+ run = false ;
416421 style . remove ( ) ;
417422 element . classList . remove ( className ) ;
418423 listeners . forEach ( ( l ) => l ?. ( ) ) ;
0 commit comments