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

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

一、自适应方法
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)
})
相关推荐
然我7 分钟前
不用 Redux 也能全局状态管理?看我用 useReducer+Context 搞个 Todo 应用
前端·javascript·react.js
前端小巷子12 分钟前
Web 实时通信:从短轮询到 WebSocket
前端·javascript·面试
神仙别闹16 分钟前
基于C#+SQL Server实现(Web)学生选课管理系统
前端·数据库·c#
web前端神器22 分钟前
指定阿里镜像原理
前端
枷锁—sha27 分钟前
【DVWA系列】——CSRF——Medium详细教程
android·服务器·前端·web安全·网络安全·csrf
枷锁—sha28 分钟前
跨站请求伪造漏洞(CSRF)详解
运维·服务器·前端·web安全·网络安全·csrf
群联云防护小杜44 分钟前
深度隐匿源IP:高防+群联AI云防护防绕过实战
运维·服务器·前端·网络·人工智能·网络协议·tcp/ip
DanB241 小时前
html复习
javascript·microsoft·html
汉得数字平台1 小时前
【鲲苍提效】全面洞察用户体验,助力打造高性能前端应用
前端·前端监控
花海如潮淹1 小时前
前端性能追踪工具:用户体验的毫秒战争
前端·笔记·ux