javascript
// 屏幕适配 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,
}
},
computed: {
isScale(){
return this.$store.state.setting.isScale
}
},
mounted () {
if(!this.isScale){
return
}
this.calcRate()
window.addEventListener('resize', this.resize)
},
beforeDestroy () {
window.removeEventListener('resize', this.resize)
},
methods: {
calcRate () {
const appRef = this.$refs["appRef"]
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)
appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
} else {
// 表示更高
scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5)
scale.width = (window.innerWidth / baseWidth).toFixed(5)
appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
}
}
},
resize () {
if(!this.isScale){
return
}
clearTimeout(this.drawTiming)
this.drawTiming = setTimeout(() => {
this.calcRate()
}, 200)
}
},
}
这段代码是一个 Vue 组件的 mixin 函数,主要用于屏幕适配。下面是对代码的详细解释:
-
常量定义:
scale
: 一个对象,用于存储宽度和高度的缩放值。baseWidth
和baseHeight
: 设计稿的尺寸,单位是像素。baseProportion
: 设计稿的宽高比,通过baseWidth
除以baseHeight
计算得出。
-
data:
drawTiming
: 一个定时器的引用,用于在窗口大小改变时延迟执行calcRate
方法,以避免频繁的计算。
-
computed:
isScale
: 一个计算属性,从 Vuex 的setting
模块中读取isScale
的值,用于判断是否需要进行屏幕适配。
-
mounted:
- 在组件挂载后,如果
isScale
为真,则调用calcRate
方法进行初始的屏幕适配,并给window
对象添加resize
事件监听器,以便在窗口大小改变时执行resize
方法。
- 在组件挂载后,如果
-
beforeDestroy:
- 在组件销毁前,移除之前添加到
window
对象上的resize
事件监听器,避免内存泄漏。
- 在组件销毁前,移除之前添加到
-
methods:
- calcRate :
- 获取当前窗口的宽高比。
- 根据当前宽高比与设计稿宽高比的比较,决定是宽度更宽还是高度更高。
- 根据比较结果,计算新的缩放值,并应用到组件的
transform
样式上,实现屏幕的适配。
- resize :
- 当窗口大小改变时,清除之前的定时器(如果有的话),然后设置一个新的定时器,延迟执行
calcRate
方法。这是为了避免在窗口大小改变时频繁地进行屏幕适配计算。
- 当窗口大小改变时,清除之前的定时器(如果有的话),然后设置一个新的定时器,延迟执行
- calcRate :
总结:这段代码的主要功能是,在组件挂载后,根据当前窗口的宽高比与设计稿的宽高比进行比较,然后动态地调整组件的缩放值,以实现屏幕适配。同时,它还考虑了窗口大小改变的情况,并在窗口大小改变时重新进行屏幕适配。