大屏开发
项目
参考开发地址:https://gitee.com/MTrun/vue-big-screen-plugin/tree/master/
import { ref } from 'vue' export default function useDraw() { // * 指向最外层容器 const appRef = ref() // * 定时函数 const timer = ref(0) // * 默认缩放值 const scale = { width: '1', height: '1', } // * 设计稿尺寸(px) const baseWidth = 1920 const baseHeight = 1080 // * 需保持的比例(默认1.77778) const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5)) const calcRate = () => { // 当前宽高比 const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5)) if (appRef.value) { if (currentRate > baseProportion) { // 表示更宽 scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5) scale.height = (window.innerHeight / baseHeight).toFixed(5) appRef.value.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.value.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)` } } } const resize = () => { clearTimeout(timer.value) timer.value = setTimeout(() => { calcRate() }, 200) } // 改变窗口大小重新绘制 const windowDraw = () => { window.addEventListener('resize', resize) } // 改变窗口大小重新绘制 const unWindowDraw = () => { window.removeEventListener('resize', resize) } return { appRef, calcRate, windowDraw, unWindowDraw } }
页面使用src/views/index/index.vue
<template> <div id="index" ref="appRef"> <div class="bg"> <dv-loading v-if="loading">Loading...</dv-loading> <div v-else class="host-body"> <div class="d-flex jc-center"> <dv-decoration-10 class="dv-dec-10" /> <div class="d-flex jc-center"> <dv-decoration-8 class="dv-dec-8" :color="['#568aea', '#000000']" /> <div class="title"> <span class="title-text">{{ title }}</span> <dv-decoration-6 class="dv-dec-6" :reverse="true" :color="['#50e3c2', '#67a1e5']" /> </div> <dv-decoration-8 class="dv-dec-8" :reverse="true" :color="['#568aea', '#000000']" /> </div> <dv-decoration-10 class="dv-dec-10-s" /> </div> <!-- 第二行 --> <div class="d-flex jc-between px-2"> <div class="d-flex aside-width"> <div class="react-left ml-4 react-l-s"> <span class="react-before"></span> <span class="text">{{ subtitle[0] }}</span> </div> <div class="react-left ml-3"> <span class="text">{{ subtitle[1] }}</span> </div> </div> <div class="d-flex aside-width"> <div class="react-right bg-color-blue mr-3"> <span class="text fw-b">{{ subtitle[2] }}</span> </div> <div class="react-right mr-4 react-l-s"> <span class="react-after"></span> <span class="text"> {{ timeInfo.dateYear }} {{ timeInfo.dateWeek }} {{ timeInfo.dateDay }} </span> </div> </div> </div> <div class="body-box"> <!-- 第三行数据 --> <div class="content-box"> <div> <dv-border-box-12> <center-left1 /> </dv-border-box-12> </div> <div> <dv-border-box-12> <center-left2 /> </dv-border-box-12> </div> <!-- 中间 --> <div> <center /> </div> <!-- 中间 --> <div> <center-right1 /> </div> <div> <dv-border-box-13> <center-right2 /> </dv-border-box-13> </div> </div> <!-- 第四行数据 --> <div class="bototm-box"> <dv-border-box-13> <bottom-left /> </dv-border-box-13> <dv-border-box-12> <bottom-right /> </dv-border-box-12> </div> </div> </div> </div> </div> </template> <script lang="ts"> import { defineComponent, ref, reactive, onMounted, onBeforeUnmount, } from 'vue' import { formatTime } from '@/utils/index' import { WEEK } from '@/constant/index' import useDraw from '@/utils/useDraw' import { title, subtitle, moduleInfo } from '@/constant/index' import CenterLeft1 from '../centerLeft1/index.vue' import CenterLeft2 from '../centerLeft2/index.vue' import Center from '../center/index.vue' import CenterRight1 from '../centerRight1/index.vue' import CenterRight2 from '../centerRight2/index.vue' import BottomLeft from '../bottomLeft/index.vue' import BottomRight from '../bottomRight/index.vue' export default defineComponent({ components: { CenterLeft1, CenterLeft2, Center, CenterRight1, CenterRight2, BottomLeft, BottomRight }, setup() { // * 加载标识 const loading = ref<boolean>(true) // * 时间内容 const timeInfo = reactive({ setInterval: 0, dateDay: '', dateYear: '', dateWeek: '' }) // * 适配处理 const { appRef, calcRate, windowDraw, unWindowDraw } = useDraw() // 生命周期 onMounted(() => { cancelLoading() handleTime() // todo 屏幕适应 windowDraw() calcRate() }) onBeforeUnmount(() => { unWindowDraw() clearInterval(timeInfo.setInterval) }) // methods // todo 处理 loading 展示 const cancelLoading = () => { setTimeout(() => { loading.value = false }, 500) } // todo 处理时间监听 const handleTime = () => { timeInfo.setInterval = setInterval(() => { const date = new Date() timeInfo.dateDay = formatTime(date, 'HH: mm: ss') timeInfo.dateYear = formatTime(date, 'yyyy-MM-dd') timeInfo.dateWeek = WEEK[date.getDay()] }, 1000) } // return return { loading, timeInfo, appRef, title, subtitle, moduleInfo } } }) </script> <style lang="scss" scoped> @import '@/assets/scss/index.scss'; </style>