echarts自动滚动(无缝衔接,划入停止,划出滚动,鼠标滚动)

echarts柱状图自动滚动效果+无缝衔接滚动+鼠标划入停止+鼠标滚动+鼠标划出从最新位置滚动

效果

在这里插入图片描述

demo

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <li>无缝滚动</li>
        <li>鼠标划入暂停</li>
        <li>鼠标滚轮滚动</li>
    </div>
    <div id="chatDom" style="width: 500px; height: 500px; background-color: #525659;"></div>
</body>

</html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.0/echarts.min.js"></script>
<script>
    //数据
    const list = [
        {
            label: '设备1',
            chatData: [
                { label: '2016', value: 1 },
                { label: '2017', value: 2 },
                { label: '2018', value: 3 },
                { label: '2019', value: 4 },
                { label: '2020', value: 5 },
                { label: '2021', value: 6 },
                { label: '2022', value: 7 },
                { label: '2023', value: 8 },
            ]
        },
        {
            label: '设备2',
            chatData: [
                { label: '2016', value: 2 },
                { label: '2017', value: 3 },
                { label: '2018', value: 4 },
                { label: '2019', value: 5 },
                { label: '2020', value: 6 },
                { label: '2021', value: 7 },
                { label: '2022', value: 8 },
                { label: '2023', value: 9 },
            ]
        },
        {
            label: '设备3',
            chatData: [
                { label: '2016', value: 3 },
                { label: '2017', value: 4 },
                { label: '2018', value: 5 },
                { label: '2019', value: 6 },
                { label: '2020', value: 7 },
                { label: '2021', value: 8 },
                { label: '2022', value: 9 },
                { label: '2023', value: 10 },
            ]
        },
        {
            label: '设备4',
            chatData: [
                { label: '2016', value: 4 },
                { label: '2017', value: 5 },
                { label: '2018', value: 6 },
                { label: '2019', value: 7 },
                { label: '2020', value: 8 },
                { label: '2021', value: 9 },
                { label: '2022', value: 10 },
                { label: '2023', value: 11 },
            ]
        },
    ];
    //可视窗口范围的结束数值(一次性展示几个) 从0开始
    const dataZoomEndValue = 6;

    //截取滚动条数以切换动画的方式实现无缝滚动
    if (list.length && list[0].chatData?.length > dataZoomEndValue + 1) {
        list.forEach((item) => {
            item.chatData = item.chatData.concat(
                item.chatData.slice(0, dataZoomEndValue + 1)
            );
        });
    }
    //数据整合
    let chatObj = list.reduce((x, y, z) => {
        if (!x.legendData) {
            x.legendData = [];
        }
        if (!x.series) {
            x.series = [];
        }
        if (!x.xAxisData) {
            x.xAxisData = [];
        }
        if (y.chatData.length) {
            x.xAxisData = y.chatData.map((item) => item.label);
        }
        x.legendData.push(y.label);
        x.series.push({
            name: y.label,
            type: "bar",
            smooth: true,
            symbol: "none",
            stack: "total",
            label: {
                show: false,
            },
            emphasis: {
                focus: "series",
            },
            data: y.chatData.map((item) => item.value),
            barMaxWidth: 10,
            animation: true,
        });
        return x;
    }, {});
    chatObj.dataZoomEndValue = dataZoomEndValue;
    const chartDom = document.getElementById("chatDom");
    if (chartDom) {
        const myChart = echarts.init(chartDom);
        const option = {
            tooltip: {
                trigger: "axis",
                axisPointer: {
                    type: "shadow",
                },
            },
            legend: {
                type: "scroll",
                top: "2%",
                right: "5%",
                left: "5%",
                data: chatObj.legendData,
                textStyle: {
                    color: "#FFF",
                    fontFamily: "youshebiaotihei",
                },
                itemGap: 20,
                formatter: function (labelName) {
                    return labelName.length > 10
                        ? labelName.slice(0, 10) + "..."
                        : labelName;
                },
            },
            grid: {
                top: "12%",
                left: "3%",
                right: "4%",
                bottom: "3%",
                containLabel: true,
            },
            xAxis: {
                type: "value",
                splitLine: {
                    show: true,
                    lineStyle: {
                        type: "dashed",
                        color: "rgba(255, 255, 255, 0.25)",
                    },
                },
                axisLabel: {
                    color: "#FFFFFF",
                    fontFamily: "youshebiaotihei",
                },
            },
            yAxis: {
                type: "category",
                data: chatObj.xAxisData,
                boundaryGap: true,
                axisTick: {
                    show: false,
                },
                axisLabel: {
                    color: "#FFFFFF",
                    fontFamily: "youshebiaotihei",
                },
                axisLine: {
                    lineStyle: {
                        color: "rgba(255, 255, 255, 0.25)",
                    },
                },
            },
            dataZoom: [
                {
                    yAxisIndex: 0,
                    show: false,
                    type: "inside",
                    startValue: 0,
                    endValue: chatObj.dataZoomEndValue,
                    zoomOnMouseWheel: false,
                    moveOnMouseWheel: true,
                    moveOnMouseMove: false,
                },
            ],
            series: chatObj.series,
        };
        option && myChart.setOption(option, true);

        //滚动
        if (list.length && list[0].chatData?.length > dataZoomEndValue + 1) {
            let pollTime = null;
            let isFocus = false;
            let IntervalTime = 1000 * 1;
            chartDom.addEventListener("mouseover", (() => {
                isFocus = true;
            }));
            chartDom.addEventListener("mouseout", (() => {
                option.dataZoom[0].startValue =
                    myChart.getModel().option.dataZoom[0].startValue;
                option.dataZoom[0].endValue =
                    myChart.getModel().option.dataZoom[0].endValue;
                isFocus = false;
            }));
            if (chatObj.xAxisData?.length > 0) {
                function Interval() {
                    if (isFocus == false) {
                        option.dataZoom[0].startValue += 1;
                        option.dataZoom[0].endValue += 1;
                        if (option.dataZoom[0].endValue === chatObj.xAxisData.length) {
                            setTimeout(() => {
                                option.dataZoom[0].startValue = 0;
                                option.dataZoom[0].endValue = chatObj.dataZoomEndValue;
                                option.series.forEach((item) => (item.animation = false));
                                myChart.setOption(option);
                                option.series.forEach((item) => (item.animation = true));
                                Interval();
                            });
                        }
                        myChart.setOption(option);
                    }
                }
                clearInterval(pollTime);
                pollTime = setInterval(Interval, IntervalTime);
            }
        }
    }
</script>
  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现图片的垂直滚动无缝衔接,可以使用Java Swing中的JLabel和Timer类。具体实现步骤如下: 1. 将图片加载到JLabel中,使用JScrollPane来实现滚动效果。 2. 创建一个Timer对象,每隔一定时间就将JLabel向上移动一个固定距离。 3. 当JLabel的底部移出可视区域时,将其移动到JScrollPane的最下方,保证图片的无缝衔接。 下面是实现代码的示例: ```java import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ImageVerticalScroll extends JFrame implements ActionListener { private JLabel imageLabel; private Timer timer; private JScrollPane scrollPane; private int moveDistance = 1; // 每次移动的距离 public ImageVerticalScroll() { setTitle("Image Vertical Scroll"); // 加载图片到JLabel中 ImageIcon image = new ImageIcon("image.png"); imageLabel = new JLabel(image); // 将JLabel添加到JScrollPane中 scrollPane = new JScrollPane(imageLabel); getContentPane().add(scrollPane); // 创建Timer对象 timer = new Timer(50, this); // 50ms移动一次 // 设置窗口属性 setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); // 启动Timer timer.start(); } @Override public void actionPerformed(ActionEvent e) { // 获取JScrollPane的垂直滚动条 JScrollBar scrollBar = scrollPane.getVerticalScrollBar(); // 计算JLabel需要移动的距离 int newY = imageLabel.getY() - moveDistance; // 判断JLabel是否移出了可视区域 if (newY + imageLabel.getHeight() < scrollPane.getHeight()) { // 移动到最下方,保证无缝衔接 newY = scrollPane.getHeight() - imageLabel.getHeight(); } // 设置JLabel的新位置 imageLabel.setLocation(imageLabel.getX(), newY); // 重新绘制JScrollPane scrollPane.repaint(); } public static void main(String[] args) { new ImageVerticalScroll(); } } ``` 注意:为了保证图片的无缝衔接,需要确保图片的高度大于JScrollPane的高度。如果图片太小,可以将其复制多次来实现无缝滚动的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值