summaryrefslogtreecommitdiff
path: root/src/animation.js
diff options
context:
space:
mode:
authorEltrac <hi@guhub.cn>2025-09-16 14:29:26 +0800
committerEltrac <hi@guhub.cn>2025-09-16 14:29:26 +0800
commit0971f24549ea47868a8c0c207680a7bdcacfd05b (patch)
treef180237ddb58d61aff58a5ff4b7d511bc39477d3 /src/animation.js
parentb0204119949adf3bb273473c605e1c8696023e11 (diff)
refactor: move animation logic to individual module
Diffstat (limited to 'src/animation.js')
-rw-r--r--src/animation.js49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/animation.js b/src/animation.js
new file mode 100644
index 0000000..b62fc21
--- /dev/null
+++ b/src/animation.js
@@ -0,0 +1,49 @@
+export default class Animation {
+ static calculateFinalState(element) {
+ let finals = {}
+
+ const margin = 50
+ const ratio = element.naturalWidth / element.naturalHeight;
+ const ww = window.innerWidth - 2*margin;
+ const wh = window.innerHeight - 2*margin;
+
+ if (element.naturalWidth > ww) {
+ finals.width = ww;
+ finals.height = ww / ratio;
+ if (finals.height > wh) {
+ finals.height = wh;
+ finals.width = wh * ratio;
+ }
+ } else {
+ finals.width = element.offsetWidth;
+ finals.height = element.offsetHeight;
+ }
+
+ finals.top = (wh - finals.height) / 2 + window.scrollY + margin;
+ finals.left = (ww - finals.width) / 2 + window.scrollX + margin;
+
+ return finals;
+ }
+
+ static transformMatrix(element, starts, finals) {
+ // Calculate scaling factors based on width and height interpolation
+ const scaleX = finals.width / starts.width;
+ const scaleY = finals.height / starts.height;
+
+ // Calculate the center of the starting and final positions
+ const startCenterX = starts.left + starts.width / 2;
+ const startCenterY = starts.top + starts.height / 2;
+ const finalCenterX = finals.left + finals.width / 2;
+ const finalCenterY = finals.top + finals.height / 2;
+
+ const translateX = finalCenterX - startCenterX;
+ const translateY = finalCenterY - startCenterY;
+
+ // Apply the transform with matrix (scale + translate)
+ element.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${translateX}, ${translateY})`;
+ }
+
+ static resetTransformMatrix(element) {
+ element.style.transform = `matrix(1, 0, 0, 1, 0, 0)`;
+ }
+}