红着眼 2024-04-28 18:35 采纳率: 27.8%
浏览 8
已结题

echarts动画效果失效的问题。官网下载的例子。

代码是我在echarts官网上下载的。代码可以直接运行。但是遇到以下2个问题,希望能帮我修改代码,直接达成我想要的效果。不胜感激。

1,我想在这个报表中加入一个动画的效果。效果图如下。希望将这个圆圈以呼吸灯式的动画闪烁起来。

img

2,在没有添加自定义tooltip显示时,鼠标移动到项目上会有一个背景显示,而且只要移动到该区域就会显示提示。
但是添加了自定义tooltip显示时这个效果就不见了,而且必须要鼠标移动到柱状上才会显示提示。
怎么修改成鼠标移动到该区域时就提示tooltip呢,且包括背景变化的动画。
(没添加tooltip显示时效果如下)

img

(添加了tooltip显示时效果如下)

img

完整的代码,可直接运行。

<!DOCTYPE html>
<html lang="zh-cn" xmlns="http://www.w3.org/1999/xhtml">
    <!-- saved from url=(0013)about:internet -->
    <head>
        <meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=5,6,7,8,9,10,11, chrome=1"/>
    </head>
    <body style="background-color: #081234;">
        <div id="container" style="width:700px;height:300px;">
        </div>
        <script type="text/javascript" src="https://cdn.staticfile.net/jquery/3.7.1/jquery.min.js">
        </script>
        <script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.5.0/files/dist/echarts.min.js">
        </script>
        <script type="text/javascript">
            var dom = document.getElementById('container');
            var myChart = echarts.init(dom, null, {
                renderer: 'canvas',
                useDirtyRect: false
            });
            var app = {};
            var option;

            // 添加虚拟数据
            let category = [];
            let dottedBase = +new Date();
            let lineData = [];
            let barData = [];
            for (let i = 0; i < 7; i++) {
              let date = new Date((dottedBase += 3600 * 24 * 1000));
              category.push(
                [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-')
              );
              let b = Math.floor(Math.random() * 20) * 200;
              let d = b;
              barData.push(b);
              lineData.push(d + b);
            }
            // option
            option = {
                backgroundColor: '#0f375f',
                grid: {
                    left: '5px',
                    right: '5px',
                    top: '10px',
                    bottom: '25px'
                },
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'shadow'
                    }
                },
                legend: {
                    show: false,
                    data: ['line', 'bar'],
                    textStyle: {
                        color: '#ccc'
                    }
                },
                xAxis: {
                    data: category,
                    axisLine: {
                        lineStyle: {
                            color: '#ccc'
                        }
                    }
                },
                yAxis: {
                    splitLine: {
                        show: false
                    },
                    axisLine: {
                        lineStyle: {
                            color: '#ccc'
                        }
                    }
                },
                tooltip: {
                    axisPointer: {
                        type: 'shadow',
                        width: 100, 
                        height: 50
                    },
                    formatter: function(params) {
                        let date = params.name;
                        let value = params.value;
                        let index = params.dataIndex;
                        let compareValue = barData[index - 1];
                        let percentage = ((value - compareValue) / compareValue * 100).toFixed(2);
                        
                        if (index == 0) {
                            return '<table>' +
                                '<tr><td td colspan="3">日期&nbsp;'+ date +' </td></tr>' +
                                '<tr><td>&#9679;</td><td>当日用电</td><td>' + value + '</td>' +
                                '</table>';
                        } else {
                            let color = (value - compareValue) > 0 ? 'red' : 'green';
                            let arrow = '&#8595;';
                            if (percentage > 0) {
                                arrow = '&#8593;';
                            }
                            if (percentage < 0) {
                                percentage = Math.abs(percentage);
                            }
                            return '<table>' +
                                '<tr><td td colspan="3">日期&nbsp;'+ date +' </td></tr>' +
                                '<tr><td>&#9679;</td><td>当日用电</td><td>' + value + '</td></tr>' +
                                '<tr><td>&#9679;</td><td>环比昨日</td><td style="color:' + color + '">' + percentage +  arrow +'</td></tr>' +
                                '</table>';
                        }
                    }
                },
                series: [{
                    name: 'line',
                    type: 'line',
                    smooth: true,
                    showAllSymbol: true,
                    symbol: 'emptyCircle',
                    symbolSize: 15,
                    data: lineData
                },
                {
                    name: 'bar',
                    type: 'bar',
                    barWidth: 10,
                    itemStyle: {
                        borderRadius: 5,
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                            offset: 0,
                            color: '#14c8d4'
                        },
                        {
                            offset: 1,
                            color: '#14c8d4'
                        }])
                    },
                    data: barData,
                    symbol: 'circle',
                    symbolSize: 15
                },
                {
                    name: 'line',
                    type: 'bar',
                    barGap: '-100%',
                    barWidth: 10,
                    itemStyle: {
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                            offset: 0,
                            color: 'rgba(20,200,212,0.5)'
                        },
                        {
                            offset: 0.2,
                            color: 'rgba(20,200,212,0.2)'
                        },
                        {
                            offset: 1,
                            color: 'rgba(20,200,212,0)'
                        }])
                    },
                    z: -12,
                    data: lineData
                },
                {
                    name: 'dotted',
                    type: 'pictorialBar',
                    symbol: 'rect',
                    itemStyle: {
                        color: '#0f375f'
                    },
                    symbolRepeat: true,
                    symbolSize: [12, 4],
                    symbolMargin: 1,
                    z: -10,
                    data: lineData
                }]
            };

            if (option && typeof option === 'object') {
                myChart.setOption(option);
            }
            window.addEventListener('resize', myChart.resize);
        </script>
    </body>
</html>
  • 写回答

8条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-28 18:35
    关注

    引自免费微信小程序:皆我百晓生

    为了解决你的问题,我将逐一进行说明并提供修改后的代码。

    1. 呼吸灯式动画闪烁效果

    要在图表中的圆圈(即线形图的点)上实现呼吸灯式的动画闪烁效果,我们可以利用echartsanimation配置项以及setOption方法来动态更新数据,从而产生动画效果。这里我们通过定时器来不断更新圆圈的大小,模拟呼吸效果。

    修改代码如下:

    // 在初始化图表后,添加以下代码实现动画效果
    function startBreathingEffect() {
        let scale = 1; // 初始缩放比例
        const duration = 2000; // 动画周期时间
        const direction = 1; // 缩放方向,1为放大,-1为缩小
        const animationInterval = setInterval(() => {
            scale += 0.05 * direction;
            if (scale >= 1.2 || scale <= 1) {
                direction *= -1; // 到达边界时改变方向
            }
            myChart.setOption({
                series: [{ // 修改线性图系列,调整symbolSize以实现呼吸效果
                    name: 'line',
                    symbolSize: [Math.max(5, 15 * scale), Math.max(5, 15 * scale)]
                }]
            }, true, true); // true, true 表示不合并本次更新,并且静默更新,避免触发其他动画
        }, duration / 10);
    
        // 如果需要停止动画,可以调用 clearInterval(animationInterval)
    }
    
    startBreathingEffect(); // 启动呼吸灯动画
    

    2. 鼠标移入图表区域显示Tooltip

    为了使鼠标移入图表区域(而非仅限于柱状图)时就显示tooltip,并且带有背景动画,我们需要调整tooltip的触发方式为 'axis' 并确保axisPointer的设置正确。实际上,你的原始代码已经设置了tooltipaxis触发,但为了确保背景动画,我们需要确保axisPointer的样式被正确应用。

    检查并确认axisPointertype设置为'shadow',这应该已经满足要求,但如果背景动画未出现,可能是因为样式或其他配置问题。由于你提到的背景变化动画具体效果不明确,通常echartsaxisPointer自带阴影效果作为背景变化的基础,但更复杂的动画效果可能需要自定义。这里先不额外添加代码,因为原始配置理论上应已满足需求。如果实际效果不符,可能是其他配置影响了默认行为。

    综上,将呼吸灯动画代码加入到你的项目中,即可实现第一个需求。对于第二个需求,如果你在应用上述建议后仍然遇到问题,请提供更具体的描述或截图,以便进一步分析和提供针对性的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月28日
  • 创建了问题 4月28日

悬赏问题

  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥15 怎么生成确定数目的泊松点过程
  • ¥15 layui数据表格多次重载的数据覆盖问题
  • ¥15 python点云生成mesh精度不够怎么办
  • ¥15 QT C++ 鼠标键盘通信
  • ¥15 改进Yolov8时添加的注意力模块在task.py里检测不到
  • ¥50 高维数据处理方法求指导
  • ¥100 数字取证课程 关于FAT文件系统的操作
  • ¥15 如何使用js实现打印时每页设置统一的标题
  • ¥15 安装TIA PortalV15.1报错