一个vue mixin 小案例,实现等比例缩放
创始人
2024-12-07 05:34:02
0

mixin.js

/*  * @Author: jinjianwei  * @Date: 2024-07-24 16:17:16  * @Description: 等比例缩放,屏幕适配 mixin 函数  */  // * 默认缩放值 const scale = {   width: '1',   height: '1', } // * 设计稿尺寸(px) const baseWidth = 1920 const baseHeight = 1080 // * 需保持的比例(默认1.77778) const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))  export default {   data() {     return {       // * 定时函数       drawTiming: null,     }   },   mounted() {     //进入触发     this.calcRate()     window.addEventListener('resize', this.resize)   },   beforeDestroy() {     window.removeEventListener('resize', this.resize)   },   computed: {     getRef() {       return null     }   },   methods: {     calcRate() {       //拿到整个页面元素       let appRef = this.getRef       //如果没有值就结束       if (!appRef) return       // 当前宽高比       const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5))       //判断:如果有值代表页面变化了       if (appRef) {         //判断当前宽高比例是否大于默认比例         if (currentRate > baseProportion) {           // 如果大于代表更宽了,就是放大了           //那么把默认缩放的宽高改为:同比例放大           scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5)           scale.height = (window.innerHeight / baseHeight).toFixed(5)           console.log(scale.width, scale.height, '放大');           //整个页面的元素样式,缩放宽高用当前同比例放大的宽高           appRef.style.transform = `scale(${scale.width}, ${scale.height})`          } else {           // 如果不大于默认比例代表缩小了。           //那么把默认缩放的宽高改为:同比例缩小           scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5)           scale.width = (window.innerWidth / baseWidth).toFixed(5)           console.log(scale.width, scale.height, '缩小');           //整个页面的元素样式,缩放宽高用当前同比例放大的宽高           appRef.style.transform = `scale(${scale.width}, ${scale.height})`         }         //等dom节点加载完后执行         this.$nextTick(() => {           //appRef.getBoundingClientRect() 为获取当前div容器距离windows视图的上边距与左边距           let appRefBoundingClientRect = appRef.getBoundingClientRect()           // 第一种方式           // let finallyTop = this.prevAppRefBoundingClientRect.top === 0 ? -appRefBoundingClientRect.top : (this.prevAppRefBoundingClientRect.top - appRefBoundingClientRect.top)           // let finallyLeft = this.prevAppRefBoundingClientRect.left === 0 ? -appRefBoundingClientRect.left : (this.prevAppRefBoundingClientRect.left - appRefBoundingClientRect.left)           // appRef.style.top = `${finallyTop}px`           // appRef.style.left = `${finallyLeft}px`           // this.prevAppRefBoundingClientRect.top = finallyTop           // this.prevAppRefBoundingClientRect.left = finallyLeft           // 第二种方式           let finallyTop = 0;           let finallyLeft = 0;           if (this.isFirst) {             // 第一次缩放偏移量             finallyTop = appRefBoundingClientRect.top             finallyLeft = appRefBoundingClientRect.left             this.isFirst = false;           } else {             // 第二次变化后的缩放偏移量             finallyTop = this.prevAppRefBoundingClientRect.top * (1 - scale.height) / (1 - this.scalePrev)             finallyLeft = this.prevAppRefBoundingClientRect.left * (1 - scale.height) / (1 - this.scalePrev)           }           // 设置缩放元素偏移量           appRef.style.top = `${-finallyTop}px`;           appRef.style.left = `${-finallyLeft}px`;           this.scalePrev = scale.width;           this.prevAppRefBoundingClientRect.top = finallyTop           this.prevAppRefBoundingClientRect.left = finallyLeft         });       }      },     resize() {       clearTimeout(this.drawTiming)       this.drawTiming = setTimeout(() => {         this.calcRate()       }, 200)     }   } }; 

这里注意要拿到引用组件的dom元素,需要用计算属性。

引用组件里的代码

// html 
// css #index { color: #d3d6dd; //此处的宽高就是你设计稿的尺寸 width: 1920px; height: 1080px; //绝对定位 脱离标准流 position: absolute; //分别将 div容器向左 和 向下 移动50% top: 50%; left: 50%; // 设置以容器左上角为中心,进行缩放移动 transform-origin: left top; //再将容易往反方向分别移动50%,这样div容器 一直处于可视窗口中心 transform: translate(-50%, -50%); //超出部位隐藏 overflow: hidden; } // js import studioMixin from "../../mixin"; mixins: [studioMixin], computed: { getRef(){ return this.$refs.domRef } },

参考

相关内容

热门资讯

终于清楚!手机脚本辅助软件(普... 终于清楚!手机脚本辅助软件(普及辅助插件)本来有透视手筋1、手机脚本辅助软件辅助软件下载优化,手机脚...
指南辅助!hhpoker有没有... 指南辅助!hhpoker有没有辅助(辅助)总是真的是有辅助工具(有挂方针)1、游戏颠覆性的策略玩法,...
玩家必备科普!微乐小程序免费黑... 您好,微乐小程序免费黑科技这款游戏可以开挂的,确实是有挂的,需要了解加微【485275054】很多玩...
玩家必看科普!欢乐联盟游戏辅助... 玩家必看科普!欢乐联盟游戏辅助(分享辅助app)切实有透视指南1、首先打开欢乐联盟游戏辅助辅助器下载...
要领辅助!wepoker透视脚... 要领辅助!wepoker透视脚本免费app(辅助)都是存在有辅助方法(今日头条)wepoker透视脚...
重大推荐!微乐小程序免费黑科技... 重大推荐!微乐小程序免费黑科技,微乐河北麻将辅助助手,微扑克教程(果真有挂);最新版2026是一款经...
玩家亲测!雀友会广东潮汕苹果(... 玩家亲测!雀友会广东潮汕苹果(详情辅助脚本)确实有透视指南1、完成雀友会广东潮汕苹果有辅助插件,帮助...
诀窍辅助!hhpoker可以控... 诀窍辅助!hhpoker可以控制吗(辅助)本来有辅助挂(果真有挂)1、hhpoker可以控制吗辅助软...
推荐一款!微乐小程序免费黑科技... 推荐一款!微乐小程序免费黑科技,微乐广西麻将辅助工具,必赢方法(有挂解惑);是一款可以让一直输的玩家...
玩家必看秘籍!悟空大厅微信辅助... 玩家必看秘籍!悟空大厅微信辅助(分享辅助神器)真是有透视要领悟空大厅微信辅助是不是有人用挂微扑克wp...