UNPKG

tdesign-mobile-vue

Version:
1 lines 8.24 kB
{"version":3,"file":"transform.mjs","sources":["../../../../src/_common/js/image-viewer/transform.ts"],"sourcesContent":["import { positiveAdd, positiveSubtract } from '../input-number/number';\nimport type { ZoomOptions, ZoomResult, TranslateOffset, ImageScale } from './types';\n\nexport type { ZoomOptions, ZoomResult, TranslateOffset, ImageScale };\n\n/** ImageScale 的默认值,所有使用处应引用此常量,避免多处声明不一致 */\nexport const DEFAULT_IMAGE_SCALE: ImageScale = {\n max: 2,\n min: 0.5,\n step: 0.2,\n defaultScale: 1,\n};\n\n/**\n * 检测图片是否超出视口(容器)边界\n * @param container 外层容器元素\n * @param modalBox 图片包裹元素\n */\nexport const isImageExceedsViewport = (container: HTMLElement, modalBox: HTMLElement): boolean => {\n const containerRect = container.getBoundingClientRect();\n const modalRect = modalBox.getBoundingClientRect();\n return (\n modalRect.left < containerRect.left ||\n modalRect.right > containerRect.right ||\n modalRect.top < containerRect.top ||\n modalRect.bottom > containerRect.bottom\n );\n};\n\n/** 镜像默认值(未镜像) */\nexport const MIRROR_DEFAULT = 1;\n\n/** 切换镜像状态:1 → -1,-1 → 1 */\nexport const toggleMirror = (current: number): number => (current > 0 ? -1 : 1);\n\n/** 每次旋转的角度(逆时针 90°) */\nexport const ROTATE_DEG = -90;\n\n/**\n * 计算最短路径归零的旋转补偿值\n * 用于 resetRotate 场景:避免 CSS transition 时图片\"倒转一大圈\"\n *\n * @param currentDeg 当前累计旋转角度\n * @returns 需要减去的补偿值(rotate.value -= 返回值 即可归零)\n *\n * @example\n * // currentDeg = -270 → return 90(-270 - 90 = -360 ≡ 0°)\n * // currentDeg = -180 → return -180(-180 - (-180) = 0)\n * // currentDeg = 0 → return 0(无需旋转)\n */\nexport function calcResetRotation(currentDeg: number): number {\n const degreeToRotate = currentDeg % 360;\n if (degreeToRotate === 0) return 0;\n // 找最短方向旋转回 0°\n return Math.abs(degreeToRotate) > 180 ? (degreeToRotate + 360) % 360 : degreeToRotate;\n}\n\n/** 将缩放值限制在 [min, max] 范围内 */\nexport function clampScale(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * 计算放大后的新 scale 值(使用精确浮点数加法)\n * @returns clamp 后的新 scale 值\n */\nexport function calcZoomInScale(oldScale: number, step: number, min: number, max: number): number {\n return clampScale(positiveAdd(oldScale, step), min, max);\n}\n\n/**\n * 计算缩小后的新 scale 值(使用精确浮点数减法)\n * @returns clamp 后的新 scale 值\n */\nexport function calcZoomOutScale(oldScale: number, step: number, min: number, max: number): number {\n return clampScale(positiveSubtract(oldScale, step), min, max);\n}\n\n/**\n * 计算缩放后的位移补偿\n * 公式:newTranslate = scaleRatio * T + (1 - scaleRatio) * Z\n * 其中 Z 为缩放中心,T 为当前位移,scaleRatio = newScale / oldScale\n */\nexport function calculateTranslateOffset(\n oldScale: number,\n newScale: number,\n options?: ZoomOptions\n): TranslateOffset | undefined {\n if (options?.mouseOffsetX == null || options?.mouseOffsetY == null) {\n return undefined;\n }\n\n const scaleRatio = newScale / oldScale;\n const { translateX = 0, translateY = 0 } = options?.currentTranslate ?? {};\n const { mouseOffsetX, mouseOffsetY } = options;\n\n return {\n translateX: scaleRatio * translateX + (1 - scaleRatio) * mouseOffsetX,\n translateY: scaleRatio * translateY + (1 - scaleRatio) * mouseOffsetY,\n };\n}\n\n/**\n * 执行一次 zoom in 并计算位移补偿\n * @returns { newScale, zoomResult }\n */\nexport function zoomIn(\n oldScale: number,\n step: number,\n min: number,\n max: number,\n options?: ZoomOptions\n): { newScale: number; zoomResult: ZoomResult } {\n const newScale = calcZoomInScale(oldScale, step, min, max);\n return {\n newScale,\n zoomResult: { newTranslate: calculateTranslateOffset(oldScale, newScale, options) },\n };\n}\n\n/**\n * 执行一次 zoom out 并计算位移补偿\n * @returns { newScale, zoomResult }\n */\nexport function zoomOut(\n oldScale: number,\n step: number,\n min: number,\n max: number,\n options?: ZoomOptions\n): { newScale: number; zoomResult: ZoomResult } {\n const newScale = calcZoomOutScale(oldScale, step, min, max);\n return {\n newScale,\n zoomResult: { newTranslate: calculateTranslateOffset(oldScale, newScale, options) },\n };\n}\n"],"names":["DEFAULT_IMAGE_SCALE","max","min","step","defaultScale","isImageExceedsViewport","container","modalBox","containerRect","getBoundingClientRect","modalRect","left","right","top","bottom","MIRROR_DEFAULT","toggleMirror","current","ROTATE_DEG","calcResetRotation","currentDeg","degreeToRotate","Math","abs","clampScale","value","calcZoomInScale","oldScale","positiveAdd","calcZoomOutScale","positiveSubtract","calculateTranslateOffset","newScale","options","_options$currentTrans","mouseOffsetX","mouseOffsetY","scaleRatio","_ref","currentTranslate","_ref$translateX","translateX","_ref$translateY","translateY","zoomIn","zoomResult","newTranslate","zoomOut"],"mappings":"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"}