Vue3 数据可视化屏幕大屏适配 页面自适应 响应式 数据大屏 大屏适配

介绍

数据可视化大屏应用时,页面的自适应和响应式设计至关重要。这些技术能够确保应用能够根据不同屏幕尺寸、设备分辨率和窗口变化自动调整布局和显示内容,提升用户体验。

全屏适配

无论大屏还是小屏完美设配

工具

javascript 复制代码
import { onBeforeUnmount, onMounted, ref } from 'vue';

/**
 * useResponsiveScale Hook - 用于实现自适应缩放功能
 * 
 * @param {number} baseWidth 设计稿的宽度,默认值为 1920
 * @param {number} baseHeight 设计稿的高度,默认值为 1080
 * @returns {object} 返回包含 appRef 的对象,appRef 用于绑定需要缩放的元素
 */
export function useResponsiveScale(baseWidth = 1920, baseHeight = 1080) {
    // 定义响应式变量,保存缩放的定时器
    const drawTiming = ref(null);

    // 定义响应式变量,保存缩放的宽度和高度
    const scale = ref({
        width: '1',
        height: '1',
    });

    // 计算设计稿的宽高比
    const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5));

    // 用于绑定需要进行缩放的元素的 ref
    const appRef = ref(null);

    /**
     * 计算并应用缩放比例
     */
    const calcRate = () => {
        if (!appRef.value) return; // 如果 appRef 没有被绑定,直接返回

        // 计算当前窗口的宽高比
        const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5));

        // 如果当前窗口比设计稿更宽,按宽度缩放
        if (currentRate > baseProportion) {
            scale.value.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5);
            scale.value.height = (window.innerHeight / baseHeight).toFixed(5);
            appRef.value.style.transform = `scale(${scale.value.width}, ${scale.value.height}) translate(-50%, -50%)`;
        } else {
            // 如果当前窗口比设计稿更高,按高度缩放
            scale.value.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5);
            scale.value.width = (window.innerWidth / baseWidth).toFixed(5);
            appRef.value.style.transform = `scale(${scale.value.width}, ${scale.value.height}) translate(-50%, -50%)`;
        }
    };

    /**
     * 处理窗口 resize 事件,防止频繁触发
     */
    const resize = () => {
        clearTimeout(drawTiming.value); // 清除上一次的定时器
        drawTiming.value = setTimeout(() => {
            calcRate(); // 在延迟后计算缩放比例
        }, 150);
    };

    // 在组件挂载时执行计算,并监听窗口的 resize 事件
    onMounted(() => {
        calcRate(); // 初始化时计算缩放比例
        window.addEventListener('resize', resize); // 监听 resize 事件
    });

    // 在组件卸载时移除 resize 事件监听器
    onBeforeUnmount(() => {
        window.removeEventListener('resize', resize);
    });

    // 返回 appRef,以便在组件中绑定需要缩放的元素
    return {
        appRef
    };
}

模板

html 复制代码
  <div class="box" ref="appRef">
    <div class="draw"></div>
    <div class="draw"></div>
    <div class="draw"></div>
  </div>

样式

css 复制代码
.box{
  color: #d3d6dd;
  width: 1920px;
  height: 1080px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  transform-origin: left top;
  overflow: hidden;
}

导入

javascript 复制代码
import { useResponsiveScale } from './utils/rsponsiveScale.js';
const { appRef } = useResponsiveScale();
相关推荐
张彦峰ZYF21 分钟前
放行、排队与拒绝:限流设计的算法选型、数据结构与并发代价
后端·架构·滑动窗口·漏桶·令牌桶·高并发+限流
Tokenfree30 分钟前
用户一句「忽略以上指令」,客服机器人就开始骂人:提示词注入的四类入口和四层防线
后端
Bazingga1 小时前
一次线上CPU 100%的问题排查
后端
AskHarries1 小时前
如果人生可以重新投胎一次,你有多大概率出生在富豪家庭?😂
后端
nice_lcj5201 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐1 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
Hespethorn2 小时前
112 个 Valgrind 错误,1 个根因:C++ 多线程服务的关机顺序复盘
后端·架构
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
灿飞2 小时前
Kotlin与Java虚拟机八:控制流与 when:卫语句、上下文相关解析与穷尽性
java·kotlin
小兔子2 小时前
new Date('2024-01-01') 和 new Date('2024/01/01') 差在哪
后端