vue+echarts 实现地图tooltip点击事件;toolTip数据动态渲染;同时鼠标滑过涟漪点时实现地图多区域联动

这篇具有很好参考价值的文章主要介绍了vue+echarts 实现地图tooltip点击事件;toolTip数据动态渲染;同时鼠标滑过涟漪点时实现地图多区域联动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最终做出来的效果是这样的:

vue+echarts 实现地图tooltip点击事件;toolTip数据动态渲染;同时鼠标滑过涟漪点时实现地图多区域联动

最近做项目时,遇到这样的需求:

        1、toolTip上的数据根据后台动态渲染

        2、鼠标移入地图涟漪点时显示tootTip,点击toolTip上的文字,携带动态数据id进行路由跳转

        3、鼠标移入地图涟漪点,与涟漪点相关的省份多区域联动高亮

   这么多问题,不要慌,办法都是人想出来的,我们先从第一个问题来开整:

一、众所周知,echart的toolTip有自己的显示样式,但是在实际开发中需要自定义html结构才能满足需求,如我遇到的动态渲染,于是我这样做:

let initOption = {
tooltip: {
          show: false, // 提示框
          triggerOn: "mousemove|click", //必须使用这种方式,因为tooltip需要有点击事件,同时移入effectScatter点区域联动
          extraCssText: "border:none;",//清除tooltip自带的边框颜色
          // alwaysShowContent: true,//提示框不消失
          hideDelay: 2000, //提示框移出或点击2秒后消失
     },
       //使用这种方式添加tooltip的formatter,便于点击事件的获取
      initOption.tooltip.formatter = function (params) {
        if (params.seriesType === `effectScatter`) {
          this.proviesName = [];
          const theData = params.data?.theData;
          //省份集合value
          let provies = [];
          theData.map((item) => {
            provies.push(...item.businessArea.split(","));
          });
          //遍历匹配得到省份合集
          provies?.map((item) => {
            mapCenterData.map((ite) => {
              if (item == ite.value) this.proviesName.push(ite.name);
            });
          });
          //数组去重
          this.proviesName = Array.from(new Set(this.proviesName));

          let before = "";
          let center = "";
          // 格式化提示框信息
          theData.map((item) => {
            item.recruitmentInfoList.map((ite) => {
              center += `
                      <div style="width: 15vw;display: flex;justify-content: space-between;padding: 0 10px; font-size: 14px; margin: 10px 0;">
                          ${ite.title}
                      </div> 
                `;
            });
            before +=
              `
                  <div style="position: relative;z-index: 100000000000000000000000;">
                    <div style="font-weight: bold;display: flex;padding: 0 5px;justify-content: space-between;margin-bottom: 20px;">
                      <div style="font-weight: bold;color: #348df2;font-size: 16px;z-index:100;">${item.shortName}</div>
                      </div>` +
              center +
              `
                      <div style="width: 15vw;display: flex;justify-content: flex-end;padding: 0 10px; font-size: 14px;" >
                          <div style="align-items: flex-end;display: flex;align-items: center;color:#3da2ff;pointer-events: auto;" class="toJoin-${
                            item.id
                          }">
                            <p οnclick="${this.getMoreJob(item.id)}">更多</p>
                            <svg style="width:20px;height:20px;margin-left: 10px;" t="1672020296882" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2518" width="200" height="200"><path d="M1024.2048 512c0 6.656-2.4576 13.2608-7.5264 18.2784l-325.8368 325.8368a25.6 25.6 0 1 1-36.1984-36.1984l282.5216-282.5216H25.8048a25.6 25.6 0 1 1 0-51.2h910.9504l-282.112-282.112a25.6 25.6 0 1 1 36.1984-36.1984l325.8368 325.8368c4.608 4.608 7.5264 11.008 7.5264 18.0736V512z" fill="#3ca1fe" p-id="2519"></path></svg>
                          </div>
                        </div>
                      </div>
                        `;
          });

          return before;
        }
      }.bind(this);
}

tooTip对象是放在初始化的echart对象中,相信聪明的你肯定知道。这样写就能实现toolTip中html自定义。

二、点击文字,携带参数的路由跳转,由于tooltip中不能使用vue语法,只能使用原生点击事件(onclick),大家可以参考上面代码

<p οnclick="${this.getMoreJob(item.id)}">更多</p> //这里可以获取到定义在vue中的方法

三、移入地图涟漪点省份区域联动,实现思路就是在initOption对象中添加:

let initOption = {
    // 设置高亮颜色
        dataRange: {
          show: false,
          x: "left",
          y: "bottom",
          splitList: [
            { start: 5, end: 5, color: "#007aff" }, //当值为5时,区域背景(值随便设置)
          ],
        },
}

然后在ehcart的移入事件中这么写:

       //移入显示区域联动
      this.chart.on("mouseover", (params) => {
        if (params.seriesType == "effectScatter") {
          this.seriesData = [];
          this.proviesName.map((item) => {
            this.seriesData.push({
              name: item + "省",//这里名字得与联动的省份的名字对应,不然没效果
              value: 5, //随便写的值,主要是与dataRange中设置的值相对应,这样就能实现区域联动高亮
            });
            this.chart.setOption({ series: [{}, { data: this.seriesData }] });
          });
        }
      });

鼠标移出还得操作一手,为了除高亮:

//鼠标移出,清除联动高亮
      this.chart.on("mouseout", (params) => {
        if (params.seriesType == "effectScatter") {
          this.seriesData = [];
          this.chart.setOption({ series: [{}, { data: this.seriesData }] });
        }
      });

最后,废话不多说,上完整代码:文章来源地址https://www.toymoban.com/news/detail-486412.html

 //初始化图表
    initChart() {
      this.chart = echarts.init(this.$refs.map);
      let initOption = {
        grid: {
          bottom: "0%",
          top: "10%",
          left: "10%",
          right: "10%",
        },
        // 设置高亮颜色
        dataRange: {
          show: false,
          x: "left",
          y: "bottom",
          splitList: [
            { start: 5, end: 5, color: "#007aff" }, //当值为5时,区域背景
          ],
        },
        tooltip: {
          show: false, // 提示框
          triggerOn: "mousemove|click", //必须使用这种方式,因为tooltip需要有点击事件,同时移入effectScatter点区域联动
          extraCssText: "border:none;",//清除tooltip自带颜色
          // alwaysShowContent: true,//提示框不消失
          hideDelay: 2000, //提示框2秒后小时
        },
        geo: {
          show: true,
          map: "china",
          zoom: 1.1, // 地图比例
          label: {
            normal: {
              show: false,
            },
            emphasis: {
              show: false,
            },
          },

          roam: false,
          itemStyle: {
            normal: {
              areaColor: "#01215c",
              borderWidth: 5, //设置外层边框
              borderColor: "transparent",
              shadowColor: "#add7ff",
              shadowBlur: 30,
              shadowOffsetX: 0,
              shadowOffsetY: 15,
            },
          },
        },
        series: [
          {
            type: "effectScatter",
            coordinateSystem: "geo",
            showEffectOn: "render",
            rippleEffect: {
              brushType: "stroke",
              scale: 5,
              period: 2, // 秒数
            },
            symbolSize: 12,
            hoverAnimation: true,
            label: {
              normal: {
                formatter: "{b}",
                position: "right",
                show: true,
              },
            },
            zlevel: 1,
            tooltip: {
              show: true, // 提示框
              triggerOn: "click",
            },
          },

          {
            type: "map",
            map: "china",
            aspectScale: 0.75,
            zoom: 1.1, // 地图比例
            itemStyle: {
              normal: {
                areaColor: "#ebf6fd",
                borderColor: "#a1cffb",
                shadowColor: "rgba(255, 230, 175,0.5)",
                borderWidth: 1,
              },
              emphasis: {
                areaColor: "#52C5F7",
              },
            },
            emphasis: {
              label: {
                show: true,
              },
            },
          },
        ],
      };
      //添加tooltip对象
      initOption.tooltip.formatter = function (params) {
        if (params.seriesType === `effectScatter`) {
          this.proviesName = [];
          const theData = params.data?.theData;
          //省份集合value
          let provies = [];
          theData.map((item) => {
            provies.push(...item.businessArea.split(","));
          });
          //遍历匹配得到省份合集
          provies?.map((item) => {
            mapCenterData.map((ite) => {
              if (item == ite.value) this.proviesName.push(ite.name);
            });
          });
          //数组去重
          this.proviesName = Array.from(new Set(this.proviesName));

          let before = "";
          let center = "";
          // 格式化提示框信息
          theData.map((item) => {
            item.recruitmentInfoList.map((ite) => {
              center += `
                      <div style="width: 15vw;display: flex;justify-content: space-between;padding: 0 10px; font-size: 14px; margin: 10px 0;">
                          ${ite.title}
                      </div> 
                `;
            });
            before +=
              `
                  <div style="position: relative;z-index: 100000000000000000000000;">
                    <div style="font-weight: bold;display: flex;padding: 0 5px;justify-content: space-between;margin-bottom: 20px;">
                      <div style="font-weight: bold;color: #348df2;font-size: 16px;z-index:100;">${item.shortName}</div>
                      </div>` +
              center +
              `
                      <div style="width: 15vw;display: flex;justify-content: flex-end;padding: 0 10px; font-size: 14px;" >
                          <div style="align-items: flex-end;display: flex;align-items: center;color:#3da2ff;pointer-events: auto;" class="toJoin-${
                            item.id
                          }">
                            <p οnclick="${this.getMoreJob(item.id)}">更多</p>
                            <svg style="width:20px;height:20px;margin-left: 10px;" t="1672020296882" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2518" width="200" height="200"><path d="M1024.2048 512c0 6.656-2.4576 13.2608-7.5264 18.2784l-325.8368 325.8368a25.6 25.6 0 1 1-36.1984-36.1984l282.5216-282.5216H25.8048a25.6 25.6 0 1 1 0-51.2h910.9504l-282.112-282.112a25.6 25.6 0 1 1 36.1984-36.1984l325.8368 325.8368c4.608 4.608 7.5264 11.008 7.5264 18.0736V512z" fill="#3ca1fe" p-id="2519"></path></svg>
                          </div>
                        </div>
                      </div>
                        `;
          });

          return before;
        }
      }.bind(this);
      this.chart.setOption(initOption);
      //移入显示区域联动
      this.chart.on("mouseover", (params) => {
        if (params.seriesType == "effectScatter") {
          this.seriesData = [];
          this.proviesName.map((item) => {
            this.seriesData.push({
              name: item + "省",
              value: 5,
            });
            this.chart.setOption({ series: [{}, { data: this.seriesData }] });
          });
        }
      });
      //鼠标移出,清除联动高亮
      this.chart.on("mouseout", (params) => {
        if (params.seriesType == "effectScatter") {
          this.seriesData = [];
          this.chart.setOption({ series: [{}, { data: this.seriesData }] });
        }
      });
    },

        注意:初始化图表的数据都来原于后台接口请求,涟漪点的数据,与地图每个区域的数据,需要各位根据实际情况渲染到地图上,然后才会有上面的3个问题的出现

        最后:原创不易,转载请注明出处

到了这里,关于vue+echarts 实现地图tooltip点击事件;toolTip数据动态渲染;同时鼠标滑过涟漪点时实现地图多区域联动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • echarts——实现自动轮播展示tooltips——技能提升

    最近在做 echarts 看板的时候,经常会遇到下面的这种情况,给出的数值比较相近,所以在页面的展示上会出现重叠的情况。但是又无法保证数值能够有很大程度的分开。(如何数值有很大的分离,必须10以下,200以上这种的,就不会有这种问题出现)。 如果遇到这种数值相近

    2024年02月03日
    浏览(32)
  • echarts自定义x轴和tooltip数据格式

    x轴和y轴数据格式如下 修改后xy轴数据格式如下 需求: 将json数据转成折线图需要的数据格式,并且x轴始终为0 - 23 点,并且折线图上的点数不会缺失,对应时间有点位的就展示,没有就空

    2024年01月19日
    浏览(37)
  • echarts地图,选中颜色设置;取消鼠标默认事件,点击选中地图实现颜色变化,选择高亮,选中高亮,取消选中(再次点击取消选中),以下面地图为例

    echarts地图,选中颜色设置;取消鼠标默认事件,点击选中地图实现颜色变化,选择高亮,选中高亮,取消选中(再次点击取消选中),下面以四川部分地图为例 针对选择模式,非点击(click),选择事件,可以获取相关地图数据,使用echarts地图的事件方法 mapselectchanged

    2024年02月11日
    浏览(38)
  • echarts雷达图图例自定义以及tooltip动态展示一维数据

     实现效果: 虽然上面实现了图例自定义,但是仔细看会发现图例与文字不在一条水平线上,利用富文本配置,对height进行调整,实现图例图片与文字对齐。 实现效果: 官方文档中默认显示该维度的所有数据 而遇到的需求是显示鼠标悬浮该轴的数据对比 实现:   虽然实现

    2024年02月16日
    浏览(32)
  • echarts散点图自定义tooltip,鼠标放上去展示多行数据

    先放效果图 如图,就是鼠标悬停在散点上(这里的散点我替换成了图片,具体做法参考这篇文章:echarts散点图的散点用自定义图片替代-CSDN博客)时,可以展示多行数据。之前查找资料的时候,很多用字符串模板的,即{a}{b}{c}之类的,但是经过实践之后发现这种方法对于散点

    2024年04月24日
    浏览(29)
  • vue echarts kline 在tooltip trigger: ‘axis‘时 自定义参数名已经加振幅参数

    1 trigger: \\\'axis\\\' 报错 Cannot read properties of undefined (reading \\\'1\\\') TypeError: Cannot read properties of undefined (reading \\\'1\\\') at formatter (webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/HelloWorld.vue?vuetype=scriptlang=js:3

    2024年02月13日
    浏览(37)
  • 详解:当鼠标放上echarts图形时,显示数据、名称,或者自定义tooltip弹窗

     主要知识点:tooltip{}该配置项为:提示框组件相关设置 写入代码的位置如下,tooltip与xAxis同级 效果一实现代码 效果二实现代码: 更加灵活的自定义弹窗,可以自己写html,其中 params[0].marker 是柱形颜色的圆形,其他参数可以打印 params查看一下 然后拼接进html里 写入代码的位

    2024年02月11日
    浏览(28)
  • echarts自定义tooltip,给tooltip增加百分号%

    支持返回 HTML 字符串或者创建的 DOM 实例。 (params: Object|Array, ticket: string, callback: (ticket: string, html: string)) = string | HTMLElement | HTMLElement[] 在 trigger 为 ‘axis’ 的时候,或者 tooltip 被 axisPointer 触发的时候,params 是多个系列的数据数组。其中每项内容格式同上,并且, { componentT

    2024年02月15日
    浏览(47)
  • 修改echarts的tooltip样式 折线图如何配置阴影并实现渐变色和自适应

    图片展示 这里不用多解释 vue里使用 import echarts from “echarts”; html页面引用js文件或用script标签引用 tooltip里的 模板字符串 dom结构 前端不方便调试效果图 可以先在dom里写好,调试好效果之后 在复制粘贴到 tooltip里的模板字符串 配置阴影和渐变色 在series里配置 normal: { color:

    2024年02月07日
    浏览(35)
  • vue大屏开发系列—使用echart开发省市地图数据,并点击省获取市地图数据

    1. 本文在基础上进行改进,后端使用若依后端 IofTV-Screen: 🔥一个基于 vue、datav、Echart 框架的物联网可视化(大屏展示)模板,提供数据动态刷新渲染、屏幕适应、数据滚动配置,内部图表自由替换、Mixins注入等功能,持续更新.... - Gitee.com 2.效果:将系统大屏显示地图 3. 使

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包