import throttle from 'lodash/throttle' // 拆出来是为了更好的分离单独复用 // * 屏幕缩放适配(两边留白) export const usePreviewFitScale = ( width: number, height: number, scaleDom: HTMLElement | null, callback?: (scale: { width: number; height: number; }) => void ) => { // * 画布尺寸(px) const baseWidth = width const baseHeight = height // * 默认缩放值 const scale = { width: 1, height: 1, } // * 需保持的比例 const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5)) const calcRate = () => { // 当前屏幕宽高比 const currentRate = parseFloat( (window.innerWidth / window.innerHeight).toFixed(5) ) if (scaleDom) { if (currentRate > baseProportion) { // 表示更宽 scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5)) scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5)) scaleDom.style.transform = `scale(${scale.width}, ${scale.height})` } else { // 表示更高 scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5)) scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5)) scaleDom.style.transform = `scale(${scale.width}, ${scale.height})` } if (callback) callback(scale) } } const resize = throttle(() => { calcRate() }, 200) // * 改变窗口大小重新绘制 const windowResize = () => { window.addEventListener('resize', resize) } // * 改变窗口大小重新绘制 const unWindowResize = () => { window.removeEventListener('resize', resize) } return { calcRate, windowResize, unWindowResize, } } // * X轴撑满,Y轴滚动条 export const usePreviewScrollYScale = ( width: number, height: number, scaleDom: HTMLElement | null, callback?: (scale: { width: number; height: number; }) => void ) => { // * 画布尺寸(px) const baseWidth = width const baseHeight = height // * 默认缩放值 const scale = { width: 1, height: 1, } // * 需保持的比例 const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5)) const calcRate = () => { if (scaleDom) { scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5)) scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5)) scaleDom.style.transform = `scale(${scale.width}, ${scale.height})` if (callback) callback(scale) } } const resize = throttle(() => { calcRate() }, 200) // * 改变窗口大小重新绘制 const windowResize = () => { window.addEventListener('resize', resize) } // * 改变窗口大小重新绘制 const unWindowResize = () => { window.removeEventListener('resize', resize) } return { calcRate, windowResize, unWindowResize, } } // * Y轴撑满,X轴滚动条 export const usePreviewScrollXScale = ( width: number, height: number, scaleDom: HTMLElement | null, callback?: (scale: { width: number; height: number; }) => void ) => { // * 画布尺寸(px) const baseWidth = width const baseHeight = height // * 默认缩放值 const scale = { height: 1, width: 1, } // * 需保持的比例 const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5)) const calcRate = () => { if (scaleDom) { scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5)) scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5)) scaleDom.style.transform = `scale(${scale.width}, ${scale.height})` if (callback) callback(scale) } } const resize = throttle(() => { calcRate() }, 200) // * 改变窗口大小重新绘制 const windowResize = () => { window.addEventListener('resize', resize) } // * 改变窗口大小重新绘制 const unWindowResize = () => { window.removeEventListener('resize', resize) } return { calcRate, windowResize, unWindowResize, } } // * 变形内容,宽高铺满 export const usePreviewFullScale = ( width: number, height: number, scaleDom: HTMLElement | null, callback?: (scale: { width: number; height: number; }) => void ) => { // * 默认缩放值 const scale = { width: 1, height: 1, } const calcRate = () => { if (scaleDom) { scale.width = parseFloat((window.innerWidth / width).toFixed(5)) scale.height = parseFloat((window.innerHeight / height).toFixed(5)) scaleDom.style.transform = `scale(${scale.width}, ${scale.height})` if (callback) callback(scale) } } const resize = throttle(() => { calcRate() }, 200) // * 改变窗口大小重新绘制 const windowResize = () => { window.addEventListener('resize', resize) } // * 改变窗口大小重新绘制 const unWindowResize = () => { window.removeEventListener('resize', resize) } return { calcRate, windowResize, unWindowResize, } }