From cece9deb234ac179095ead3bacbcc93638d43c5d Mon Sep 17 00:00:00 2001 From: fangsmile <892739385@qq.com> Date: Thu, 13 Nov 2025 18:05:11 +0800 Subject: [PATCH 1/7] feat: add labelHoverOnAxis for axis component --- .../examples/axis-hoverOn-label-bottom.ts | 179 +++++++++++++++ .../examples/axis-hoverOn-label-left.ts | 178 +++++++++++++++ .../__tests__/browser/index.html | 2 +- .../__tests__/browser/main.ts | 8 + .../vrender-components/src/axis/constant.ts | 1 + packages/vrender-components/src/axis/line.ts | 210 ++++++++++++++++-- packages/vrender-components/src/axis/type.ts | 39 ++++ 7 files changed, 602 insertions(+), 15 deletions(-) create mode 100644 packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-bottom.ts create mode 100644 packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-left.ts diff --git a/packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-bottom.ts b/packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-bottom.ts new file mode 100644 index 000000000..339d9e5b9 --- /dev/null +++ b/packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-bottom.ts @@ -0,0 +1,179 @@ +import { LinearScale, PointScale } from '@visactor/vscale'; +import '@visactor/vrender'; +import { GroupFadeIn, GroupFadeOut } from '@visactor/vrender'; +import { LineAxis, GroupTransition } from '../../../src'; +import render from '../../util/render'; + +const axis = new LineAxis({ + orient: 'bottom', + title: { + // space: 0, + // padding: 0, + // textStyle: { + // fontSize: 12, + // fill: '#363839', + // fontWeight: 'normal', + // fillOpacity: 1, + // textAlign: 'center', + // textBaseline: 'bottom' + // }, + visible: true, + autoRotate: true, + // angle: 1, + // shape: {}, + // background: { + // visible: true, + // style: { + // fill: 'red' + // } + // }, + // state: { + // text: null, + // shape: null, + // background: null + // }, + text: '细分' + // maxWidth: null + }, + label: { + visible: true, + inside: false, + space: 10, + padding: 0, + style: { + fontSize: 12, + fill: '#6F6F6F', + fontWeight: 'normal', + fillOpacity: 1, + angle: 0, + textAlign: 'center' + }, + formatMethod: null, + state: null, + autoRotate: false, + autoHide: false, + autoLimit: false, + containerAlign: 'center' + }, + labelHoverOnAxis: { + autoRotate: true, + position: 10, + space: 0, + padding: 2, + textStyle: { + fontSize: 12, + fill: '#363839', + fontWeight: 'normal', + fillOpacity: 1, + textAlign: 'center', + textBaseline: 'top' + }, + visible: true, + background: { + visible: true, + style: { + fill: 'red' + } + }, + text: '细分 rewqutiREWITrewt范德萨发', + maxWidth: 100 + }, + // tick: { + // visible: true, + // inside: false, + // alignWithLabel: true, + // length: 2, + // style: { + // lineWidth: 1, + // stroke: '#D9DDE4', + // strokeOpacity: 1 + // }, + // state: null + // }, + // subTick: { + // visible: true, + // inside: false, + // count: 4, + // length: 2, + // style: { + // lineWidth: 10, + // stroke: '#D9DDE4', + // strokeOpacity: 1 + // }, + // state: null + // }, + line: { + visible: true, + style: { + lineWidth: 1, + stroke: '#989999', + strokeOpacity: 1 + }, + startSymbol: {}, + endSymbol: {} + }, + x: 0, + y: 0, + // start: { + // x: 0, + // y: 0 + // }, + // end: { + // x: 0, + // y: 427 + // }, + start: { x: 0, y: 200 }, + end: { x: 500, y: 200 }, + items: [ + [ + { + id: '消费者', + label: '消费者', + value: 0.8333333333333334, + rawValue: '消费者' + }, + { + id: '公司', + label: '公司', + value: 0.4999999999999999, + rawValue: '公司' + }, + { + id: '小型企业', + label: '小型企业', + value: 0.1666666666666666, + rawValue: '小型企业' + } + ] + ], + visible: true, + pickable: true, + hover: true, + select: true, + panel: { + visible: true, + state: { + // hover: { + // fillOpacity: 0.08, + // fill: 'red' + // }, + selected: { + fillOpacity: 0.08, + fill: 'blue' + }, + selected_reverse: { + fillOpacity: 0.08, + fill: 'red' + } + // hover_reverse: { + // fillOpacity: 0.08, + // fill: '#141414' + // } + } + }, + verticalFactor: 1, + horizontalLimitSize: 150, + horizontalMinSize: 150 +}); +window.axis = axis; +render([axis], 'main'); diff --git a/packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-left.ts b/packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-left.ts new file mode 100644 index 000000000..e6222d82a --- /dev/null +++ b/packages/vrender-components/__tests__/browser/examples/axis-hoverOn-label-left.ts @@ -0,0 +1,178 @@ +import { LinearScale, PointScale } from '@visactor/vscale'; +import '@visactor/vrender'; +import { GroupFadeIn, GroupFadeOut } from '@visactor/vrender'; +import { LineAxis, GroupTransition } from '../../../src'; +import render from '../../util/render'; + +const axis = new LineAxis({ + title: { + space: -30, + padding: 0, + textStyle: { + fontSize: 12, + fill: '#363839', + fontWeight: 'normal', + fillOpacity: 1, + textAlign: 'center', + textBaseline: 'bottom' + }, + visible: true, + autoRotate: false, + // angle: 1.7, + shape: {}, + background: { + visible: true, + style: { + fill: 'red' + } + }, + state: { + text: null, + shape: null, + background: null + }, + text: '细分', + maxWidth: null + }, + label: { + visible: true, + inside: false, + space: 0, + padding: 0, + style: { + fontSize: 12, + fill: '#6F6F6F', + fontWeight: 'normal', + fillOpacity: 1, + angle: 0, + textAlign: 'center' + }, + formatMethod: null, + state: null, + autoRotate: false, + autoHide: false, + autoLimit: false, + containerAlign: 'center' + }, + labelHoverOnAxis: { + visible: true, + position: 50, + autoRotate: false, + space: 10, + padding: 2, + textStyle: { + fontSize: 12, + fill: '#363839', + fontWeight: 'normal', + fillOpacity: 1, + textAlign: 'right', + textBaseline: 'middle' + }, + background: { + visible: true, + style: { + fill: 'red' + } + }, + text: '细分' + // maxWidth: 100 + }, + tick: { + visible: true, + inside: false, + alignWithLabel: true, + length: 2, + style: { + lineWidth: 1, + stroke: '#D9DDE4', + strokeOpacity: 1 + }, + state: null + }, + subTick: { + visible: true, + inside: false, + count: 4, + length: 2, + style: { + lineWidth: 10, + stroke: '#D9DDE4', + strokeOpacity: 1 + }, + state: null + }, + line: { + visible: true, + style: { + lineWidth: 1, + stroke: '#989999', + strokeOpacity: 1 + }, + startSymbol: {}, + endSymbol: {} + }, + x: 140, + y: 0, + start: { + x: 0, + y: 0 + }, + end: { + x: 0, + y: 427 + }, + items: [ + [ + { + id: '消费者', + label: '消费者', + value: 0.8333333333333334, + rawValue: '消费者' + }, + { + id: '公司', + label: '公司', + value: 0.4999999999999999, + rawValue: '公司' + }, + { + id: '小型企业', + label: '小型企业', + value: 0.1666666666666666, + rawValue: '小型企业' + } + ] + ], + visible: true, + pickable: true, + orient: 'left', + hover: true, + select: true, + panel: { + visible: true, + state: { + // hover: { + // fillOpacity: 0.08, + // fill: 'red' + // }, + selected: { + fillOpacity: 0.08, + fill: 'blue' + }, + selected_reverse: { + fillOpacity: 0.08, + fill: 'red' + } + // hover_reverse: { + // fillOpacity: 0.08, + // fill: '#141414' + // } + } + }, + verticalFactor: 1, + verticalLimitSize: 150, + verticalMinSize: 150 +}); +window.axis = axis; +// axis.showLabelHoverOnAxis(130); +render([axis], 'main'); diff --git a/packages/vrender-components/__tests__/browser/index.html b/packages/vrender-components/__tests__/browser/index.html index 96e24d285..f5585af3b 100644 --- a/packages/vrender-components/__tests__/browser/index.html +++ b/packages/vrender-components/__tests__/browser/index.html @@ -8,7 +8,7 @@