当前位置: 首页 > article >正文

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

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

一、自适应方法
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)
})

http://www.kler.cn/a/389845.html

相关文章:

  • LabVIEW开发相机与显微镜自动对焦功能
  • uni-app移动端与PC端兼容预览PDF文件
  • JAVA题目笔记(十五)经典算法题
  • ctfshow-web入门-SSTI(web361-web368)上
  • ABC334
  • VMware虚拟机安装Win7专业版保姆级教程(附镜像包)
  • Verilog基础知识-逻辑值
  • LINUX下的Myql:库的操作
  • mysql查询语句(基础)
  • python开发桌面应用步骤
  • 在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换
  • ctfshow-web入门-反序列化(web271-web278)
  • android studio导入OpenCv并改造成.kts版本
  • 【大数据学习 | kafka高级部分】kafka中的选举机制
  • Docker安装部署单机版高斯数据库gaussdb
  • 【项目开发】RESTful架构及RESTful API设计指南
  • 《数学学报》
  • c和cpp的异常处理
  • 【Linux】常用命令(2.6万字汇总)
  • QT-column小节一下
  • 从2D到3D:MoGe——微软的单目3D几何重建模型
  • 为 5G 应用设计天线阵列和 MIMO 系统
  • STM32完全学习——存储器映像
  • Java全栈体系路线
  • 【Java】—— 函数式编程:Lambda表达式、方法引用
  • 如何在 CentOS 6 上设置 NFS 挂载