vue3项目大屏适配方案(scale)及vue-tv-focusable库使用

server/2025/1/15 15:12:34/

一. 适配方案代码(scale)

公共代码

javascript">export const useAdjustScale = () => {// * 指向最外层容器const pageRef = ref();// * 默认缩放值const scale = {width: '1',height: '1',};// * 需保持的比例(默认1.77778)
const designWidth = 1920
const designHeight = 1080const baseProportion = parseFloat((designWidth / designHeight).toFixed(5));const adjustScale = () => {// 当前宽高比const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5));if (pageRef.value) {if (currentRate > baseProportion) {// 表示更宽scale.width = ((window.innerHeight * baseProportion) / designWidth).toFixed(5);scale.height = (window.innerHeight / designHeight).toFixed(5);pageRef.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;console.log(scale.width, scale.height, 'moreWidth');} else {// 表示更高scale.height = (window.innerWidth / baseProportion / designHeight).toFixed(5);scale.width = (window.innerWidth / designWidth).toFixed(5);pageRef.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;}}};onMountedOrActivated(() => adjustScale());useWindowSizeFn(() => adjustScale());return { pageRef, adjustScale };
};

onMountedOrActivated

javascript">import { nextTick, onMounted, onActivated } from 'vue';export function onMountedOrActivated(hook: Fn) {let mounted: boolean;onMounted(() => {hook();nextTick(() => {mounted = true;});});onActivated(() => {if (mounted) {hook();}});
}

useWindowSizeFn

javascript">import { tryOnMounted, tryOnUnmounted, useDebounceFn } from '@vueuse/core';interface WindowSizeOptions {once?: boolean;immediate?: boolean;listenerOptions?: AddEventListenerOptions | boolean;
}export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOptions) {let handler = () => {console.log('resizeHander');try {fn();} catch (error) {console.error(`${new Date().toLocaleTimeString()}🔥 -> useWindowSizeFn -> error:`, error);}};const handleSize = useDebounceFn(handler, wait);handler = handleSize;const start = () => {if (options && options.immediate) {handler();}window.addEventListener('resize', handler);};const stop = () => {window.removeEventListener('resize', handler);};tryOnMounted(() => {start();});tryOnUnmounted(() => {stop();});return [start, stop];
}

使用核心举例

javascript">  <div id="dashboard" ref="pageRef"></div>
// * 适配处理const { pageRef } = useAdjustScale();

二.vue-tv-focusable

用途:主要用于大屏项目在tv中显示时,利用遥控器控制dom元素的聚焦
使用示例

javascript"><divclass="secure"ref="secureRef"v-focusable="true"@up="secureFocus('up')"@right="secureFocus('right')"@click="secureClick"></div>
javascript"> const secureFocus = (e) => {if (e == 'up') {proxy.$tv.requestFocus(introduceRef.value);} else if (e == 'right') {proxy.$tv.requestFocus(qualityRef.value);}};
javascript"> import { getCurrentInstance } from 'vue';const { proxy } = getCurrentInstance();const introduceRef = ref<HTMLFrameElement>();const qualityRef = ref<HTMLFrameElement>();

详细使用方法可参考vue-tv-focusable


http://www.ppmy.cn/server/158587.html

相关文章

python检测gitlab中某个标签在一个月内添加和移除了多少次

可以通过 Python 脚本和 GitLab API 检测一个标签在一个月内被添加和移除的次数。以下是实现的步骤和示例代码&#xff1a; 步骤 获取 GitLab API 访问令牌&#xff1a;在 GitLab 中生成一个 Personal Access Token。设置时间范围&#xff1a;确定一个月的时间范围。调用 Git…

Pyinstaller打包部署在Win2008上的Bug排查之路

1.前言 python项目的部署工作基本是属于算法的最后阶段&#xff0c;同样也是最容易出现问题的阶段&#xff0c;毕竟IDE中的运行甚至debug都是可以直接给出问题&#xff0c;再加上开发机器的版本较新&#xff0c;也很少会出现各种各样的dll系统问题。win和linux部署相比&#x…

【maptalks】加载SVG和GIF

加载SVG和GIF 一、加载SVG方法一&#xff1a;直接载入SVG文件&#xff0c;类似载入图片方法二&#xff1a;载入SVG路径 二、加载GIFVUEmaptalks实现GIF可拖拽点VUEmaptalks实现GIF跟随线条动画 一、加载SVG 方法一&#xff1a;直接载入SVG文件&#xff0c;类似载入图片 缺点&…

Redisson和可重入锁初认

文章目录 Redisson 简介Redisson 的主要特点Redisson 的核心模块Redisson的优势使用示例Maven 引入依赖配置 Redisson 客户端分布式锁使用示例 Redisson 使用场景总结 可重入锁关键特性为什么需要可重入锁可重入锁的实现方式可重入锁的实现原理可重入锁的优缺点优点缺点 可重入…

【Python】使用python 对excel文件进行加密

最近在跟同事对接工作的时候&#xff0c;我需要把Excel文件发给对方。 但是由于文件内容的私密性&#xff0c;需要对Excel文件进行加密&#xff0c;保护文件以免给第三方看到&#xff0c;保障数据的安全。 在Python中&#xff0c;有多种方法可以对Excel文件进行加密。以下是几…

好用的php商城源码有哪些?

选择一个优秀的商城工具&#xff0c;能更好地帮助大家建立一个好用的商城系统。目前比较流行的都是开源PHP商城系统&#xff0c;那么现实中都有哪些好用的PHP商城源码值得推荐呢&#xff1f;下面就带大家一起来了解一下。 1.TigShop 【推荐指数】&#xff1a;★★★★★☆ 【推…

day08_Kafka

文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列&#xff08;了解&#xff09;**为什么消息队列就像是“数据的快递员”&#xff1f;****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…

springboot基于安卓的反诈APP

Spring Boot基于安卓的反诈APP是一个结合了Spring Boot后端技术和安卓前端技术的反诈骗应用程序&#xff0c;旨在为用户提供全面、高效的反诈防护服务。 一、技术架构 后端&#xff1a;采用Spring Boot框架&#xff0c;利用其自动配置、简化依赖管理等功能&#xff0c;构建…