当前位置: 首页 > news >正文

vue3 可视化大屏自适应屏幕组件

首先定义了一个名叫ScreenContainerOptions的组件,需要传的参数如下

export type ScreenContainerOptions = {width?: string | numberheight?: string | numberscreenFit?: boolean // 是否开启屏幕自适应,不然会按比例显示
}

组件的主要代码如下

onMounted(async () => {await initSize()updateSize()updateScale()window.addEventListener('resize', onResize)isReady.value = true // 执行完上面的方法后再渲染slot插槽
})// 初始化宽高
const initSize = () => {return new Promise((resolve) => {nextTick(() => {dom = refName.valueparentDom = refNameParent.value// 获取大屏的真实尺寸(不传值就是dom元素的宽高)widthRef.value = props.options?.width || dom.clientWidthheightRef.value = props.options?.height || dom.clientHeight// 获取屏幕尺寸,避免重复计算if (!screenWidthRef.value || !screenHeightRef.value) {screenWidthRef.value = window.screen.widthscreenHeightRef.value = window.screen.height}resolve(true)})})
}
// 更新宽高
const updateSize = () => {dom.style.width = `${widthRef.value || screenWidthRef.value}px`dom.style.height = `${heightRef.value || screenHeightRef.value}px`
}
// 更新缩放比例
const updateScale = () => {// window.innerWidth 获取当前展示区域的宽度const currentWidth = window.innerWidth// 获取大屏最终真实的宽度const realWidth = widthRef.value || screenWidthRef.value// 是否开启屏幕适配,不会按照比例const { screenFit } = props.options// 如果不想屏幕留白,而是自适应宽高的话let heightScale = 1// window.innerWidth 获取当前展示区域的宽度const currentHeight = window.innerHeight// 获取大屏最终真实的宽度const realHeight = heightRef.value || heightRef.valueif (screenFit) {heightScale = currentHeight / realHeight// if (parentDom) {//   parentDom.style.height = dom.style.height = `${window.innerHeight}px` // 父容器宽度设置为原屏幕的宽度// }}// 算出缩放比例并赋值// 只需要根据宽度计算即可const scale = currentWidth / realWidthdom && (dom.style.transform = `scale(${scale}, ${screenFit ? heightScale : 1})`) // 不开启screenFit的话高度不需要缩放if (parentDom) {parentDom.style.width = `${window.innerWidth}px` // 父容器宽度设置为原屏幕的宽度screenFit && (parentDom.style.height = `${window.innerHeight}px`) // 父容器宽度设置为原屏幕的宽度}
}// 浏览器resize事件触发回调
const onResize = async () => {await initSize()await nextTick()updateScale()
}

组件完整代码地址

https://github.com/jimchou-h/vue-study/blob/dev/src/components/ScreenContainer.vue

相关文章:

  • error: object ‘FastMNNIntegration‘ not found
  • 159基于matlab的基于密度的噪声应用空间聚类(DBSCAN)算法对点进行聚类
  • 【echarts】入门示例
  • 基于微信小程序的新生报到系统的研究与实现,附源码
  • dolphinDB使用select筛选时间字段
  • PKI - 03 密钥管理(如何进行安全的公钥交换)
  • Bert与ChatGPT
  • Python程序员面试题精选及解析(2)
  • STM32F1 引脚重映射功能
  • Nginx访问控制模块详解
  • openkylin(Debian系)安装nginx及安装前需要的准备
  • 【计算机网络】协议层次及其服务模型
  • spring boot和spring cloud项目中配置文件application和bootstrap加载顺序
  • 2024年华为OD机试真题-灰度图恢复-Java-OD统一考试(C卷)
  • dockerfile 详细讲解
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 5、React组件事件详解
  • canvas 五子棋游戏
  • Centos6.8 使用rpm安装mysql5.7
  • CentOS7简单部署NFS
  • JavaWeb(学习笔记二)
  • Java比较器对数组,集合排序
  • SpiderData 2019年2月23日 DApp数据排行榜
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 多线程 start 和 run 方法到底有什么区别?
  • 翻译:Hystrix - How To Use
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 配置 PM2 实现代码自动发布
  • 驱动程序原理
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 栈实现走出迷宫(C++)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Linux(权限管理)
  • #LLM入门|Prompt#3.3_存储_Memory
  • $forceUpdate()函数
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (6)设计一个TimeMap
  • (Java数据结构)ArrayList
  • (译) 函数式 JS #1:简介
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Google的Objective-C编码规范
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net Signalr 使用笔记
  • .net 受管制代码
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)