elementHoverScale

概述

elementHoverScale 交互的对象是图表元素 element,当鼠标悬浮在元素上时,将该元素放大并添加阴影效果,提供更强的视觉反馈。这个交互特别适用于饼图、环图等需要突出显示单个元素的场景。

  • 触发:鼠标悬浮在元素上
  • 结束:鼠标移出元素
  • 影响状态:悬浮的元素变为 active 状态
  • 视觉效果:元素放大、提升层级、添加阴影
hover-scale-pie hover-scale-donut hover-scale-group

使用方式

配置 elementHoverScale 交互有两种方式:

第一种,传入 boolean 设置是否开启交互。

({
  type: 'interval',
  interaction: { elementHoverScale: true }, // 采用默认配置
});

第二种,传入 配置项 对交互进行配置。

({
  type: 'interval',
  interaction: {
    elementHoverScale: {
      scale: 1.1,
      shadow: true,
      shadowColor: 'rgba(0, 0, 0, 0.5)',
    },
  },
});

配置层级

交互可以配置在 Mark 层级:

({
  type: 'interval',
  interaction: { elementHoverScale: true },
});

也可以配置在 View 层级,视图上声明的交互会传递给 children 声明的标记,如果该标记有声明对应的交互,就合并;否则不影响。

({
  type: 'view',
  interaction: { elementHoverScale: true },
});

配置项

属性 描述 类型 默认值 必选
scale 缩放比例 number 1.04
shadow 是否显示阴影 boolean true
shadowColor 阴影颜色 string 'rgba(0, 0, 0, 0.4)'
shadowBlur 阴影模糊度 number 10
shadowOffsetX 阴影水平偏移 number 0
shadowOffsetY 阴影垂直偏移 number 2
zIndex 悬浮时的层级 number 10
delay 鼠标移出后延迟重置的时间 number 60 (单位: 毫秒)
createGroup 自定义分组函数 function (d) => d (按数据分组)

配置详解

scale

控制元素悬浮时的放大倍数。值为 1.04 表示放大到原始大小的 104%。缩放默认以元素中心为基准点。

shadow

是否在悬浮时添加阴影效果。阴影可以增强视觉层次感。

createGroup

自定义分组函数,用于控制哪些元素应该一起响应悬浮效果。默认情况下,每个元素独立响应。

// 示例:按 category 字段分组
createGroup: (data) => data.category;

事件

监听事件

支持以下的事件:

  • element:hoverscale - 元素悬浮缩放时触发
  • element:unhoverscale - 元素取消悬浮缩放时触发
chart.on('element:hoverscale', (e) => {
  console.log(e.data.data); // 当前悬浮元素的数据
  console.log(e.data.group); // 同组元素的数据数组
  console.log(e.nativeEvent); // 原生事件
});

chart.on('element:unhoverscale', (e) => {
  console.log(e.nativeEvent);
});

触发交互

支持以下的事件:

  • element:hoverscale - 触发元素缩放
  • element:unhoverscale - 取消元素缩放
chart.emit('element:hoverscale', {
  data: { data: { category: 'A', value: 100 } },
});

chart.emit('element:unhoverscale', {});

示例

饼图悬浮放大

这是 elementHoverScale 最常见的应用场景,在饼图中突出显示悬浮的扇区:

import { Chart } from '@antv/g2';

const chart = new Chart({
  container: 'container',
  autoFit: true,
});

chart.options({
  type: 'interval',
  height: 400,
  data: [
    { item: '事例一', count: 40, percent: 0.4 },
    { item: '事例二', count: 21, percent: 0.21 },
    { item: '事例三', count: 17, percent: 0.17 },
    { item: '事例四', count: 13, percent: 0.13 },
    { item: '事例五', count: 9, percent: 0.09 },
  ],
  coordinate: { type: 'theta', outerRadius: 0.8 },
  transform: [{ type: 'stackY' }],
  encode: {
    y: 'percent',
    color: 'item',
  },
  legend: { color: { position: 'bottom' } },
  labels: [
    {
      text: 'item',
      position: 'outside',
      fontSize: 12,
    },
    {
      text: (d) => `${(d.percent * 100).toFixed(0)}%`,
      position: 'inside',
      fontSize: 14,
      fontWeight: 'bold',
      fill: '#fff',
    },
  ],
  interaction: {
    elementHoverScale: true,
  },
});

chart.render();

环图悬浮效果

环图同样适合使用 elementHoverScale 交互:

import { Chart } from '@antv/g2';

const chart = new Chart({
  container: 'container',
  autoFit: true,
});

chart.options({
  type: 'interval',
  height: 400,
  data: [
    { item: '事例一', count: 40, percent: 0.4 },
    { item: '事例二', count: 21, percent: 0.21 },
    { item: '事例三', count: 17, percent: 0.17 },
    { item: '事例四', count: 13, percent: 0.13 },
    { item: '事例五', count: 9, percent: 0.09 },
  ],
  coordinate: { type: 'theta', innerRadius: 0.5, outerRadius: 0.8 },
  transform: [{ type: 'stackY' }],
  encode: {
    y: 'percent',
    color: 'item',
  },
  legend: { color: { position: 'bottom' } },
  labels: [
    {
      text: 'item',
      position: 'spider',
      fontSize: 12,
    },
  ],
  interaction: {
    elementHoverScale: {
      scale: 1.08,
      shadow: true,
      shadowColor: 'rgba(0, 0, 0, 0.5)',
      shadowBlur: 15,
    },
  },
});

chart.render();

柱状图悬浮效果

柱状图中也可以使用 elementHoverScale 来突出显示:

import { Chart } from '@antv/g2';

const chart = new Chart({
  container: 'container',
  autoFit: true,
});

chart.options({
  type: 'interval',
  height: 300,
  data: {
    type: 'fetch',
    value:
      'https://gw.alipayobjects.com/os/bmw-prod/fb9db6b7-23a5-4c23-bbef-c54a55fee580.csv',
  },
  encode: { x: 'letter', y: 'frequency' },
  transform: [{ type: 'sortX', by: 'y', reverse: true, slice: 6 }],
  axis: { y: { labelFormatter: '.0%' } },
  interaction: {
    elementHoverScale: {
      scale: 1.05,
      shadow: true,
    },
  },
});

chart.render();

自定义缩放配置

通过配置项可以完全自定义悬浮效果:

import { Chart } from '@antv/g2';

const chart = new Chart({
  container: 'container',
  autoFit: true,
});

chart.options({
  type: 'interval',
  height: 400,
  data: [
    { category: 'A', value: 27 },
    { category: 'B', value: 25 },
    { category: 'C', value: 18 },
    { category: 'D', value: 15 },
    { category: 'E', value: 10 },
    { category: 'F', value: 5 },
  ],
  coordinate: { type: 'theta', outerRadius: 0.75 },
  transform: [{ type: 'stackY' }],
  encode: { y: 'value', color: 'category' },
  legend: { color: { position: 'right' } },
  style: {
    stroke: '#fff',
    lineWidth: 2,
  },
  interaction: {
    elementHoverScale: {
      scale: 1.15, // 更大的缩放比例
      shadow: true,
      shadowColor: 'rgba(139, 0, 139, 0.6)', // 自定义阴影颜色
      shadowBlur: 20, // 更大的模糊半径
      shadowOffsetX: 5, // 水平偏移
      shadowOffsetY: 5, // 垂直偏移
      zIndex: 20, // 更高的层级
      delay: 100, // 延迟 100ms 恢复
    },
  },
});

chart.render();

分组悬浮效果

使用 createGroup 可以实现多个元素联动的悬浮效果:

import { Chart } from '@antv/g2';

const chart = new Chart({
  container: 'container',
  autoFit: true,
});

const data = [
  { year: '2018', type: 'A', value: 100 },
  { year: '2018', type: 'B', value: 80 },
  { year: '2019', type: 'A', value: 120 },
  { year: '2019', type: 'B', value: 90 },
  { year: '2020', type: 'A', value: 140 },
  { year: '2020', type: 'B', value: 110 },
  { year: '2021', type: 'A', value: 160 },
  { year: '2021', type: 'B', value: 130 },
];

chart.options({
  type: 'interval',
  height: 300,
  data,
  encode: {
    x: 'year',
    y: 'value',
    color: 'type',
  },
  transform: [{ type: 'dodgeX' }],
  interaction: {
    elementHoverScale: {
      scale: 1.08,
      // 按 type 分组,悬浮时同类型的柱子一起放大
      createGroup: (view) => (d) => d.type,
    },
  },
});

chart.render();
全站搜索
文档与示例输入关键词开始搜索

输入关键词,查找文档、API 与示例

选择打开Esc关闭