Vue 组件的 mixin 函数,用于屏幕适配

// 屏幕适配 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 函数,主要用于屏幕适配。下面是对代码的详细解释:

  1. 常量定义:

    • scale: 一个对象,用于存储宽度和高度的缩放值。
    • baseWidth 和 baseHeight: 设计稿的尺寸,单位是像素。
    • baseProportion: 设计稿的宽高比,通过 baseWidth 除以 baseHeight 计算得出。
  2. data:

    • drawTiming: 一个定时器的引用,用于在窗口大小改变时延迟执行 calcRate 方法,以避免频繁的计算。
  3. computed:

    • isScale: 一个计算属性,从 Vuex 的 setting 模块中读取 isScale 的值,用于判断是否需要进行屏幕适配。
  4. mounted:

    • 在组件挂载后,如果 isScale 为真,则调用 calcRate 方法进行初始的屏幕适配,并给 window 对象添加 resize 事件监听器,以便在窗口大小改变时执行 resize 方法。
  5. beforeDestroy:

    • 在组件销毁前,移除之前添加到 window 对象上的 resize 事件监听器,避免内存泄漏。
  6. methods:

    • calcRate:
      • 获取当前窗口的宽高比。
      • 根据当前宽高比与设计稿宽高比的比较,决定是宽度更宽还是高度更高。
      • 根据比较结果,计算新的缩放值,并应用到组件的 transform 样式上,实现屏幕的适配。
    • resize:
      • 当窗口大小改变时,清除之前的定时器(如果有的话),然后设置一个新的定时器,延迟执行 calcRate 方法。这是为了避免在窗口大小改变时频繁地进行屏幕适配计算。

总结:这段代码的主要功能是,在组件挂载后,根据当前窗口的宽高比与设计稿的宽高比进行比较,然后动态地调整组件的缩放值,以实现屏幕适配。同时,它还考虑了窗口大小改变的情况,并在窗口大小改变时重新进行屏幕适配。

相关推荐

  1. Vue mixin 函数用于屏幕

    2024-04-05 11:20:02       13 阅读
  2. Flutter 屏幕之相对尺寸

    2024-04-05 11:20:02       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-05 11:20:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-05 11:20:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-05 11:20:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-05 11:20:02       18 阅读

热门阅读

  1. 0基础如何进入IT行业

    2024-04-05 11:20:02       15 阅读
  2. C/C++中的static关键字用法总结

    2024-04-05 11:20:02       17 阅读
  3. 梯度反向传播过程是如何处理repeat函数的

    2024-04-05 11:20:02       12 阅读
  4. linux小工具杂记

    2024-04-05 11:20:02       18 阅读
  5. 算法思想 - 贪心算法

    2024-04-05 11:20:02       17 阅读
  6. vue3从精通到入门12:vue3的生命周期和组件

    2024-04-05 11:20:02       15 阅读
  7. 英语写作中“概念”concept 、notion、idea的用法

    2024-04-05 11:20:02       20 阅读
  8. 【数据库】SQLite3 中文存储

    2024-04-05 11:20:02       17 阅读
  9. 快速入门Kotlin⑤协程

    2024-04-05 11:20:02       18 阅读
  10. 速盾:cdn高防御服务器租用有哪些好处

    2024-04-05 11:20:02       16 阅读
  11. Spark面试整理-解释Spark Streaming是什么

    2024-04-05 11:20:02       13 阅读