大屏使用自适应后,地图点位偏移问题

大屏使用自适应后,点位偏移问题

一、自适应方法
ts 复制代码
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%)`;
}

页面中使用:

vue 复制代码
<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引入要加载的地图页面
vue 复制代码
    <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)
ts 复制代码
const routes = [
  {
    path: '/iframe-page',
    name: 'iframe-page',
    component: IframePage,  // Vue 组件渲染的页面
  },
];
三、iframe 与父组件进行通信遇到问题

遇到的问题:在 Vue 3 中,onMounted 钩子会在组件挂载到 DOM 后触发,但此时 iframe 内容可能还没有完全加载完成。因此,postMessage 发送的数据可能会在 iframe 页面完全准备好接收前发送,导致数据未能成功接收。

vue 复制代码
<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:

vue 复制代码
const handleMessage = (event) => {
  if (event.data && event.data.message) {
    message.value = event.data.message
  }
}

onMounted(() => {
  // 监听来自父页面的消息
  window.addEventListener('message', handleMessage)
})

onUnmounted(() => {
  // 在组件卸载时移除事件监听器
  window.removeEventListener('message', handleMessage)
})
相关推荐
IT_陈寒28 分钟前
SpringBoot自动配置这个坑,我踩进去又爬出来了
前端·人工智能·后端
铁皮饭盒2 小时前
Bun 哪比 Node.js 快?
javascript·后端
JieE2129 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
runnerdancer10 小时前
LLM是怎么处理messages数组的,提示词缓存又是什么
前端·agent
陈随易11 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人12 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong12 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
IT_陈寒15 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
Jackson__15 小时前
分享一个横向滚动案例,带悬停暂停,通用性很强
前端
MariaH16 小时前
git rebase的使用
前端