logo 范 · 拾光录
网址收集 关于作者 Github Gitee
杂文随笔4
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置
前端编程3
前端基础知识16
UniApp15
Vue框架19
Java编程7
Java基础知识14
SpringBoot31
SpringMVC14
MyBatis8
SpringCloud15
RocketMQ1
MyCat1
数据库4
MySQL6
Redis7
MongoDB10
H21
Java技术栈4
知识整理分布式锁的实现方案MySQL事务MySQL的锁
软件工具箱14
IDEAGitMavenGradleNginx安装Nginx配置JMeter压测OllamaPicGoRustFSVSCodeDockerObsidianObs录制
Linux知识11
树莓派安装及使用ArchLinux:常用软件ArchLinux:基础系统安装ArchLinux:深度优化ArchLInux:图形化界面安装ArchLinux:Nirifrp内网穿透Jar启动脚本Linux常用命令VirtualBox安装CentOSVirtualBox安装Ubuntu
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv
创意设计2
Blender:入门知识UI设计基础知识
AI相关9
Claude CodeHermes AgentOpenAI基本使用OpenAI工具调用OpenAI记忆管理OpenAI推理执行OpenAI开发框架Langchainllama.cpp

组件

<template>
  <div class="screen-container" ref="screenRef">
    <div class="screen-content" :style="transformStyle">
      <!-- 你的内容 -->
      <slot />
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onMounted, onBeforeUnmount } from 'vue'

const screenRef = ref(null)

// 设计稿尺寸(默认 1920x1080)
const designWidth = 1920
const designHeight = 1080

// 缩放值
const scale = ref(1)

// 计算缩放比例
const calcScale = () => {
  if (!screenRef.value) return

  const { clientWidth: w, clientHeight: h } = screenRef.value

  // 按照设计稿宽高比等比缩放
  const screenRatio = w / h
  const designRatio = designWidth / designHeight

  let scaleX, scaleY

  if (screenRatio > designRatio) {
    // 宽屏更高,按高度缩放
    scaleY = h / designHeight
    scaleX = scaleY
  } else {
    // 高屏更高,按宽度缩放
    scaleX = w / designWidth
    scaleY = scaleX
  }

  scale.value = Math.min(scaleX, scaleY)
}

// 监听 resize
const resizeHandler = () => {
  calcScale()
}

onMounted(() => {
  window.addEventListener('resize', resizeHandler)
  calcScale()
})

onBeforeUnmount(() => {
  window.removeEventListener('resize', resizeHandler)
})

// transform 样式
const transformStyle = computed(() => {
  return {
    transform: `scale(${scale.value})`,
    transformOrigin: 'left top',
    width: `${designWidth}px`,
    height: `${designHeight}px`,
    position: 'relative'
  }
})
</script>

<style scoped>
.screen-container {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  position: relative;
}

.screen-content {
  width: 1920px;
  height: 1080px;
}
</style>

使用

<template>
  <ScaleScreen>
    <div style="width: 1920px; height: 1080px;">
      <h1>这是我的全屏大屏</h1>
      <!-- 放置 ECharts 图表等内容 -->
    </div>
  </ScaleScreen>
</template>

<script setup>
import ScaleScreen from './components/ScaleScreen.vue'
</script>
组件
使用