Skip to content

Commit d47ee16

Browse files
author
hoang.tran12
committed
optimize magnify
1 parent e267c13 commit d47ee16

File tree

2 files changed

+142
-194
lines changed

2 files changed

+142
-194
lines changed

scripts/content-scripts/ufs_global.js

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)