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

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

一、自适应方法
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)
})
相关推荐
无责任此方_修行中1 小时前
每周见闻分享:杂谈AI取代程序员
javascript·资讯
Σίσυφος19002 小时前
halcon 条形码、二维码识别、opencv识别
前端·数据库
学代码的小前端2 小时前
0基础学前端-----CSS DAY13
前端·css
dorabighead3 小时前
JavaScript 高级程序设计 读书笔记(第三章)
开发语言·javascript·ecmascript
css趣多多3 小时前
案例自定义tabBar
前端
姑苏洛言4 小时前
DeepSeek写微信转盘小程序需求文档,这不比产品经理强?
前端
林的快手4 小时前
CSS列表属性
前端·javascript·css·ajax·firefox·html5·safari
匹马夕阳5 小时前
ECharts极简入门
前端·信息可视化·echarts
bug总结5 小时前
新学一个JavaScript 的 classList API
开发语言·javascript·ecmascript
网络安全-老纪5 小时前
网络安全-js安全知识点与XSS常用payloads
javascript·安全·web安全