echarts图表鼠标悬停时图例错位的解决方案

今天要分享的是前两天在项目中遇到一个问题:页面中有金额比例图表,前端用的是Echarts实现的,测试同学在饼图中鼠标悬停时没有显示tooltip信息窗。如下图所示:

但是我在自己的电脑上的本地环境和测试环境均测试没有问题。后来沟通后发现测试同学的电脑缩放比例不是100%,而是125%。然后我将我的浏览器在右上角的三个点对应的下拉框中设置缩放为125%,发现如上图,确实存在鼠标悬浮时无法展示弹窗。

后来我在其他的前端工程中通过Echarts画了一个饼图,然后调整浏览器的缩放比例125%,惊奇地发现没有问题!如下图所示:

很神奇,这是为什么呢?后来就自己去查资料,最终找到了原因所在:不展示是因为前端工程中通过zoom做了自适应,当我们调整浏览器缩放时,body元素会被添加一个zoom属性,如下图:

缩放比例为125%


*

缩放比例为150%

不同的缩放比例,zoom的值也不同。当body元素style中加上zoom后,鼠标滑过Echarts图表时,触发位置发生了变化,导致无法展示tooltip

解决方案

为Echarts图表容器再加上 zoomtransform:scaletransform-origin这三个属性即可。原理:body元素被缩放了,那么渲染echarts图表的容器我们需要再给他缩放回去就好了,这个问题类似之前项目中使用到了地图,然后地图中有点位,鼠标悬浮展示点位信息。当页面通过zoom缩放后,弹窗位置也是出现了错位,这两个问题的原因是一样的,同样的解决方案也是一样的。无论外层如何缩放,内部元素容器要缩放回1/zoom即可。

代码如下
vue 复制代码
<template>
	<div
		class="pie-chart"
		:style="{
			zoom: `${1 / zoomValue}`,
			transform: `scale${zoomValue}`,
			transformOrigin: '0,0',
		}"
		ref="pieChart"
	></div>
</template>

<script>
import * as echarts from "echarts";

export default {
	name: "pieChart",
	components: {},
	props: {
		chartOption: {
			type: Object,
			required: true,
		},
	},
	data() {
		const bodyZoomVal = document.body.style.zoom;
		return {
			zoomValue: bodyZoomVal,
		};
	},
	watch: {
		chartOption: {
			handler() {
				if (this.chartOption) this.initChart();
			},
			deep: true,
		},
	},
	computed: {},
	methods: {
		initChart() {
			const chartDom = this.$refs.pieChart;
			const myChart = echarts.init(chartDom);
			myChart.setOption(this.chartOption);
		},
		handleResize() {
			this.$nextTick(() => {
				const chartDom = this.$refs.pieChart;
				const myChart = echarts.getInstanceByDom(chartDom);
				myChart.resize();
			});
		},
	},
	created() {},
	mounted() {
		window.addEventListener("resize", this.handleResize);
		if (this.chartOption) this.initChart();
	},
};
</script>

<style lang="scss" scoped>
.pie-chart {
	height: 100%;
	width: 100%;
}
</style>
注意

如果你的echarts图表容器设置的固定的宽高,那么在设置zoom之后会出现图表被放大失真的情况,所以需要给图表设置百分比的宽高。

相关推荐
江城开朗的豌豆1 分钟前
在写vue公用组件的时候,怎么提高可配置性
前端·javascript·vue.js
江城开朗的豌豆2 分钟前
Vue路由跳转的N种姿势,总有一种适合你!
前端·javascript·vue.js
江城开朗的豌豆2 分钟前
Vue路由玩法大揭秘:三种路由模式你Pick谁?
前端·javascript·vue.js
江城开朗的豌豆3 分钟前
Vue路由守卫全攻略:给页面访问装上'安检门'
前端·javascript·vue.js
小磊哥er10 分钟前
【前端工程化】前端组件模版构建那些事
前端
前端 贾公子11 分钟前
monorepo + Turborepo --- 开发应用程序
java·前端·javascript
江城开朗的豌豆15 分钟前
Vue路由传参避坑指南:params和query的那些猫腻
前端·javascript·vue.js
十里青山23 分钟前
超好用的vue图片预览插件更新啦,hevue-img-preview 7.0.0版本正式发布,支持vue2/vue3/移动/pc,增加缩略图、下载、自定义样式等
前端·javascript·vue.js
lichenyang45332 分钟前
css模块化以及rem布局
前端·javascript·css
小熊哥^--^34 分钟前
条件渲染 v-show与v-if
前端