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

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

一、自适应方法
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)
})
相关推荐
littleboyck13 分钟前
VSCode 全自动调试Vue/React项目
前端·visual studio code
Jonathan Star1 小时前
跨域处理的核心是解决浏览器的“同源策略”限制,主流方案
javascript·chrome·爬虫
洛小豆1 小时前
她问我::is-logged 是啥?我说:前面加冒号,就是 Vue 在发暗号
前端·vue.js·面试
我有一棵树1 小时前
前端开发中 SCSS 变量与 CSS 变量的区别与实践选择,—— 两种变量别混为一谈
前端·css·scss
麦麦大数据1 小时前
F024 CNN+vue+flask电影推荐系统vue+python+mysql+CNN实现
vue.js·python·cnn·flask·推荐算法
white-persist1 小时前
JWT 漏洞全解析:从原理到实战
前端·网络·python·安全·web安全·网络安全·系统安全
果粒chenl2 小时前
React学习(四) --- Redux
javascript·学习·react.js
IT_陈寒2 小时前
React 性能优化:5个实战技巧让首屏加载提升50%,开发者亲测有效!
前端·人工智能·后端
rising start2 小时前
前端基础一、HTML5
前端·html·html5
Never_Satisfied2 小时前
在JavaScript / HTML中,div容器在内容过多时不显示超出的部分
开发语言·javascript·html