关于echarts鼠标悬浮位置不准确的问题

当我们在为了适配一些小屏幕笔记本为了优化显示效果进行屏幕缩放后,会做一些适配性处理,比如使用transform的scale处理,亦或者使用devicePixelRatio处理自动化处理缩放,但是有时候会在项目中有echarts图表的时候会导致echarts图表上悬浮位置不准确

window.devicePixelRatio方案伪代码如下:

<template>
   <div class="xxx" :style="{zoom: 1/zoom}">
   </div>
</template>

<script>
export default {
  name: 'App',
  created () {
    const devicePixelRatio = window.devicePixelRatio // 获取下载的缩放 125% -> 1.25    150% -> 1.5
    if (devicePixelRatio !== 1) {
    // 如果在笔记本中用IE浏览器打开 则弹出提示
      if (!! window.ActiveXObject || 'ActiveXObject' in window) {
        alert('您的设备对显示进行放大导致页面显示不完全,请调整后打开/或用其他浏览器')
      } else {
        const c = document.querySelector('body')
        c.style.zoom = 1 / devicePixelRatio// 修改页面的缩放比例
      }
    }
  }
}
</script>

如何解决这个问题呢,那是因为开发者直接放大了body,如果只在body添加zoom缩放页面,会导致echarts图表的悬浮位置不准确, 故在echars外部容器添加zoom,
在使用图表的父组件也同步放大即可。

utils等工具函数文件中写个获取body zoom属性的函数:

// 获取当前body下的zoom的值
export const zoom = () => {
  const zoom = document.getElementsByTagName('body')[0].style.zoom
  return zoom
}

组件页面:

import { zoom } from '@/utils/toolsFuncxxxx'
export default {
  components: { },
  data () {
    return {
      zoom: '1'
    }
  },
  mounted () {
    // 备注,如果只在body添加zoom缩放页面,会导致echarts图表的悬浮位置不准确, 故在echars外部容器添加zoom
    // 由于挂载之后,才会有dom节点,所以最好在此时调用zoom()
    this.$nextTick(() => {
      this.setZoom()
      window.addEventListener('resize', this.setZoom)
    })
  },
  methods: {
    setZoom () {
      this.zoom = zoom()
    }
  } //methods
}

这样使用addEventListener就可以动态监听window的resize事件然后自动适配大小了

2.根据调整页面的canvas元素进行调整

mounted () {
    // 备注,如果只在body添加zoom缩放页面,会导致echarts图表的悬浮位置不准确, 故在echars外部容器添加zoom
    // 由于挂载之后,才会有dom节点,所以最好在此时调用zoom()
    this.$nextTick(() => {
      this.setZoom()
      window.addEventListener('resize', this.setZoom)
    })
  },

  methods: {
    setZoom () {
      this.zoom = zoom()
      // 处理缩放导致canvas定位异常
      var size = window.screen.width / 1920
      document.styleSheets[document.styleSheets.length - 1].insertRule('canvas {zoom: ' + 1 / size + '}')
      document.styleSheets[document.styleSheets.length - 1].insertRule('canvas {transform: scale(' + size + ')}')
      document.styleSheets[document.styleSheets.length - 1].insertRule('canvas {transform-origin: 0 0}')
    }
  }

现在流行使用‘postcss-px2rem’配合‘px2rem-loader’的方案来解决,px2rem顾名思义是将基础px转换为rem来显示视图内容。后面我会专门写一篇关于这种方案的使用

详见另一篇技术博客:关于Vue项目下页面自适应pc端不同分辨率尺寸的方法

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kirinlau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值