首页 > 其他分享 >vue2、vue3适配大屏。分辨率变化,样式不变

vue2、vue3适配大屏。分辨率变化,样式不变

时间:2023-12-08 15:34:19浏览次数:30  
标签:scale const 适配 width window vue2 vue3 toFixed appRef

一、vue3适配大屏的,创建一个叫 useDraw.js

export default function () {
  const scale = {
    width: '1',
    height: '1',
  }
  const baseWidth = 1920
  const baseHeight = 1080
  const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
  let drawTiming = $ref(0)
  let appRef = null
  const calcRate = () => {
    if (!appRef) {
      appRef = document.getElementById('appRef')
    }
    // 当前宽高比
    const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5))
    if (appRef) {
      if (currentRate > baseProportion) {
        // 表示更宽
        scale.width = (window.innerWidth / 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%)`
      }
    }
  }
  const resize = () => {
    clearTimeout(drawTiming)
    drawTiming = setTimeout(() => {
      calcRate()
    }, 200)
  }

  onMounted(() => {
    calcRate()
    window.addEventListener('resize', resize)

    // 临时解决有滚动条的问题
    const app = document.getElementById('app').children[0]

    if (app) {
      app.style.width = '99vw'

      setTimeout(() => {
        app.style.width = '100vw'
      })
    }
  })
  onBeforeUnmount(() => {
    window.removeEventListener('resize', resize)
  })
}

 在vue3中这样使用

<script setup>
import useDraw from "./utils/useDraw";
// 大屏适配
useDraw();
</script>

 

二、vue2适配大屏的,创建一个叫 useDraw.js

// 屏幕适配 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)
  },
  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.innerWidth / 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 () {
      clearTimeout(this.drawTiming)
      this.drawTiming = setTimeout(() => {
        this.calcRate()
      }, 200)
    }
  },
}

 在vue2项目中引用

<script>
import drawMixin from "./utils/useDraw.js";
export default {
  mixins: [useDraw],
}
</script>                    

 

标签:scale,const,适配,width,window,vue2,vue3,toFixed,appRef
From: https://www.cnblogs.com/haiyang-/p/17888257.html

相关文章

  • vue3组件通信
    子传父$emit在vue框架中事件分为两种:一种是原生的DOM事件,另外一种自定义事件。原生DOM事件可以让用户与网页进行交互,比如click、change、mouseenter、mouseleave...自定义事件可以实现子组件给父组件传递数据。vue2中的@click绑定的是自定义事件,可以通过.native修饰符变为原生DOM......
  • Vue学习计划-Vue2--Vue核心(五)条件、列表渲染、表单数据
    1.条件渲染v-ifv-if="表达式"v-else-if="表达式"v-else="表达式"适用于:切换频率较低的场景特点:不显示dom元素,直接被删除注意:v-if和v-else-if、v-else一起使用,但要求结构不能被打断v-if和template一起使用,v-show不可以v-showv-show="表达式"适用于:切换频......
  • CSS 网页适配 iPhone全面屏
    前言iPhoneX取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我们只需要关注底部与小黑条的适配问题即可(即常见的吸底导航、返回顶部等各种相对底部fixed定位的元素)。 适配之前需要......
  • 前端大屏适配几种方案
    一、方案一:rem+font-size动态设置HTML根字体大小和body字体大小,会使用到lib-flexible.js插件(functionflexible(window,document){vardocEl=document.documentElementvardpr=window.devicePixelRatio||1//adjustbodyfontsizefunctionsetBodyFontSize(......
  • vue2项目打包dist文件后如何部署访问(本地部署和网络部署)
    1.本地部署前提:1.注意端口的占用,防火墙的放行;2.注意后端服务的请求链接3.记得不要关闭运行4.记得elementui的引入要放在vue版本导入的后面1.1.新建一个文件夹打开之后打开终端编辑1.2.npmiexpress-s是用于在Node.js项目中安装Express框架的命令编辑1.3.将项目打包好的dist......
  • vue3视频播放器组件vue-video-player
    1、安装npmivue3-video-play--save2、全局注册importvue3videoPlayfrom'vue3-video-play'//引入组件import'vue3-video-play/dist/style.css'//引入cssapp.use(vue3videoPlay)3、使用<vue3VideoPlaywidth="1210px"......
  • 基于vue2开发的html5页面实现微信分享卡片(微信好友+朋友圈+qq好友+qq空间)
    首先附上文档链接:1.微信官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#1112.免费生成二维码的草料官网:https://cli.im/text/other 需求:在浏览器分享链接时携带用户id(因为是拉人活动,需要给用户积分),并且在微信中分享为卡片模式 具体......
  • vue3组件通信Props()
    vue3组件通信父传子defineProps()在使用 <scriptsetup> 的单文件组件中,props可以使用 defineProps() 宏来声明://父<HelloWorldmsg="Youdidit!"/><!--根据一个变量的值动态传入-->//<BlogPost:title="post.title"/>//子<scriptsetup>//写法1......
  • uni-app 基础架构搭建 ts+vue3 命令行
    1. 安装全局degitnpminstall-gdegit2.创建工程my-vue3-ts-project#创建以javascript开发的工程npxdegitdcloudio/uni-preset-vue#vitemy-vue3-ts-project#创建以ts开发的工程npxdegitdcloudio/uni-preset-vue#vite-tsmy-vue3-ts-project3进入目录cdmy-v......
  • VUE3引入pinia配置使用
    文档:https://pinia.vuejs.org/zh/introduction.html1.引入pinnanpminstallpinia-S2.在src文件里面创建store文件article.js在main.js中引用pinnaimport{defineStore}from'pinia'//你可以对`defineStore()`的返回值进行任意命名,但最好使用store的名字,同时以......