大屏使用自适应后,地图点位偏移问题
大屏使用自适应后,点位偏移问题
一、自适应方法
export default function handleScreenAuto() {
const designDraftWidth = 1920;//设计稿的宽度
const designDraftHeight = 1080;//设计稿的高度
//根据屏幕的变化适配的比例
const scale = document.documentElement.clientWidth / document.documentElement.clientHeight < designDraftWidth / designDraftHeight ?
(document.documentElement.clientWidth / designDraftWidth) :
(document.documentElement.clientHeight / designDraftHeight);
//缩放比例
(document.querySelector('#screen') as any).style.transform = `scale(${scale}) translate(-50%)`;
}
页面中使用:
<script lang="ts" setup>
import { onMounted } from "vue";
import handleScreenAuto from "@/utils/show/screenAuto";
onMounted(() => {
handleScreenAuto();
//绑定自适应函数 ---防止浏览器栏变化后不再适配
window.onresize = () => handleScreenAuto();
});
</script>
<template>
<div class="screen-wrapper">
<div id="screen" class="smart">
<div class="smart-content">
<div class="smart-content-left">
</div>
<div class="smart-content-center">
</div>
<div class="smart-content-right">
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.screen-wrapper {
height: 100%;
width: 100%;
position: relative;
overflow: hidden;
}
.smart {
display: inline-block;
width: 1920px;
height: 1080px;
transform-origin: 0 0;
position: absolute;
left: 50%;
background-color: rgba(0, 0, 0, 0.01);
overflow: hidden;
}
</style>
大屏适配原理用的transform,导致里面的地图点位有偏差,全屏展示问题会消失
二、解决办法,使用iframe引入要加载的地图页面
<div class="content-map">
<iframe
src="/iframe-page"
width="100%"
height="100%"
style="border: none"
ref="iframe"
></iframe>
</div>
- 使用 Vue 路由动态渲染
iframe
内容,需要在Vue 路由配置 (router/index.js
)
const routes = [
{
path: '/iframe-page',
name: 'iframe-page',
component: IframePage, // Vue 组件渲染的页面
},
];
三、iframe 与父组件进行通信遇到问题
遇到的问题:在 Vue 3 中,onMounted
钩子会在组件挂载到 DOM 后触发,但此时 iframe
内容可能还没有完全加载完成。因此,postMessage
发送的数据可能会在 iframe
页面完全准备好接收前发送,导致数据未能成功接收。
<template>
<div>
<iframe
ref="myIframe"
src="iframePage.html" <!-- iframe的目标页面 -->
@load="onIframeLoad"
width="600"
height="400"
></iframe>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const myIframe = ref(null)
const onIframeLoad = () => {
if (myIframe.value && myIframe.value.contentWindow) {
setTimeout(() => {
myIframe.value.contentWindow.postMessage({ message: 'Hello from parent!' }, '*')
}, 500) // 延迟 500 毫秒发送消息
}
}
onMounted(() => {
// 确保组件加载完成,绑定 load 事件以便 iframe 加载完成时传值
if (myIframe.value) {
myIframe.value.addEventListener('load', onIframeLoad)
}
})
</script>
iframe:
const handleMessage = (event) => {
if (event.data && event.data.message) {
message.value = event.data.message
}
}
onMounted(() => {
// 监听来自父页面的消息
window.addEventListener('message', handleMessage)
})
onUnmounted(() => {
// 在组件卸载时移除事件监听器
window.removeEventListener('message', handleMessage)
})