组件
<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)
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)
}
const resizeHandler = () => {
calcScale()
}
onMounted(() => {
window.addEventListener('resize', resizeHandler)
calcScale()
})
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeHandler)
})
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>
</div>
</ScaleScreen>
</template>
<script setup>
import ScaleScreen from './components/ScaleScreen.vue'
</script>