前端实用案例-借助echarts实现内容自动向上轮播

简介: 最近正好在做一个项目,需要做一个内容向上轮播的部分,奈何时间原因手写轮播不敢搞,网上也有一些组件,但是看起来不可靠,因此我得另找出路,最近正好在学echarts,有感而发,不知道能不能解决这个问题,经过查询,发现echarts还真的可以搞,现将我的成果分享出来,以后有相同需求拿来用即可。

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛。

前言

最近正好在做一个项目,需要做一个内容向上轮播的部分,奈何时间原因手写轮播不敢搞,网上也有一些组件,但是看起来不可靠,因此我得另找出路,最近正好在学echarts,有感而发,不知道能不能解决这个问题,经过查询,发现echarts还真的可以搞,现将我的成果分享出来,以后有相同需求拿来用即可。

思路

在这里插入图片描述在echarts官网有很多示例,选择相似的拿来定制就行,我们需要一个横向的柱状图。
接下来就需要自己参照官网的配置项手册来定制
在这里插入图片描述
在这里插入图片描述
这里面是对所有的options的属性的介绍,一些常见的我们需要记住,其他的需求确定属于那个属性,点开查找看有没有满足需求的属性就行。
好了,接下来说一下我的思路:

先明确需求,要实现内容向上轮播,需要滚动,通过查阅手册,我发现了dataZoom这个属性,可以满足需求

dataZoom: [{
       //滑动条
         yAxisIndex: 0, //这里是从X轴的0刻度开始
         show: false, //是否显示滑动条,不影响使用
         type: "slider", // 这个 dataZoom 组件是 slider 型 dataZoom 组件
         startValue: 0, // 从头开始。
         endValue: 4, // 一次性展示5个。
   },],

发现这个属性后就需要动态改变startValue和endValue来实现轮播,这时就需要一个定时器来了

//自动滚动
var timeOut = setInterval(()=>{
   
   if (barOption.dataZoom[0].endValue == barOption.series[0].data.length ) {
       barOption.dataZoom[0].endValue = 4;
       barOption.dataZoom[0].startValue = 0;
   } else {
       barOption.dataZoom[0].endValue = barOption.dataZoom[0].endValue + 1;
       barOption.dataZoom[0].startValue = barOption.dataZoom[0].startValue + 1;
   }
   //重新把配置项给实例对象
   barChart.setOption(barOption);
},2000)

每一个滚动都需要重新把配置项给实例对象。
完成了向上轮播,我们就需要考虑如何在柱状条里显示内容?
刚开始,我在series属性里的bar柱状图里找到了label属性,这个label属性里有个position属性,可以让内容显示到柱状条里。
在这里插入图片描述
但是,经过我的实验,确实可以将内容放到柱状条里,但只能是数字,因为我们这个柱状图是横的,所以x轴的type是value,所以只能是数字,而且这个数字决定我们的柱状条的长度,我们要将其设置为100,长度拉满。

既然x轴不行,我就将目标转向了y轴,我们的y轴的type是category,内容可以是汉字,因此我在想能否将y轴的刻度标签翻转到柱状条里显示,经过查询配置项手册,发现确实可以。在yAxis里的axisLabel(专门设置刻度标签的属性)里的inside:true可以让y轴的刻度标签显示到柱状图里面,用来做内容显示。到此,我们的两大难点都得到解决。

当我们解决这两点后,运行demo发现还会有点小瑕疵,就是每次加载或者刷新的时候柱状条会有一个从左边到右边变长的动画,我们需要关掉动画,但又要不影响向上轮播,进过查询手册,发现有个动画属性可以关掉初始动画,将初识动画时长设为0即可,即animationDuration: 0。

到此难点全部解决。代码里的其他一些属性想要了解查询手册即可,不在赘述,这个小demo拿来就可以用。

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            width: 500px;
            height: 400px;
            margin: 200px auto;
            border: 1px solid skyblue;
            border-radius: 10%;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
    <script>
         // 1.实例化对象
        var barChart = echarts.init(document.querySelector(".box"));
        // 2.指定数据
        var barOption = {
            // 关掉图例
            legend: {
                show: false,
            },
            // 关掉鼠标滑过的提示 
            tooltip: {
                show:false
            },
            // 图表距离轴线的位置
            grid: {
                left: "3%",
                right: "4%",
                top: "5%",
                bottom: "3%",
                containLabel: true,
            },
            xAxis: {
                type: "value",
                //坐标轴两边留白策略
                boundaryGap: true,
                //是否显示坐标轴刻度
                axisTick: { show: false },
                //坐标轴线线的颜色
                axisLine: {
                    show: false,
                },
                // 关掉x轴的汉字(刻度标签)
                axisLabel: {
                    show: false,
                },
                //是否显示网格线。默认数值轴显示
                splitLine: {
                    show: false,
                },
            },
            dataZoom: [{
                //滑动条
                yAxisIndex: 0, //这里是从X轴的0刻度开始
                show: false, //是否显示滑动条,不影响使用
                type: "slider", // 这个 dataZoom 组件是 slider 型 dataZoom 组件
                startValue: 0, // 从头开始。
                endValue: 4, // 一次性展示5个。
            },],
            yAxis: {
                type: "category",
                inverse: true, //是否是反向坐标轴
                axisLabel: {
                    show: true,
                    // 让y轴的刻度标签显示到柱状图里面,用来做内容显示
                    inside:true,
                    fontSize:14,
                    lineHeight:20,
                    // 文字颜色
                    color:"rgb(225, 117, 135)",
                    width:330,
                    overflow: "break"  //文字溢出换行
                },
                //是否显示分隔线。默认数值轴显示
                splitLine: {
                    show: false,
                },
                // 不显示标签刻度
                axisTick: {
                    show: false
                },
                //坐标轴线
                axisLine: {
                    show: false
                },
                // y轴刻度标签内容, 这里就是我们要展示的内容,按要求替换就可以
                data:["我爱阿牛","阿牛最帅","阿牛好棒","aniu","阿牛阿牛","阿牛~~~","阿牛呕吼","爱你"]
            },
            series: [{
                type: "bar",
                barWidth: "65%",
                // x轴的数据,100表示长度拉满,y轴里data的长度决定这里有几个100
                data: [100, 100, 100, 100, 100,100,100,100],
                itemStyle:{
                    // 柱子的颜色
                    color:"rgba(141,162,223,0.3)",
                    borderRadius:20

                }
            },],
            animation: true,
            // 将初始动画的时长关掉
            animationDuration: 0,
        };
        // 3.把配置项给实例对象
        barChart.setOption(barOption);
        
        // 让图表跟随屏幕自动的去适应,这一块是为自适应做的
        window.addEventListener("resize", function() {
            barChart.resize();
        });
        //自动滚动
        var timeOut = setInterval(()=>{
               // 如果轮播完了则回到开始
            if (barOption.dataZoom[0].endValue == barOption.series[0].data.length ) {
                barOption.dataZoom[0].endValue = 4;
                barOption.dataZoom[0].startValue = 0;
            } else {
                barOption.dataZoom[0].endValue = barOption.dataZoom[0].endValue + 1;
                barOption.dataZoom[0].startValue = barOption.dataZoom[0].startValue + 1;
            }
            //重新把配置项给实例对象
            barChart.setOption(barOption);
        },2000)
    </script>
</body>
</html>

同时,我也写好了ajax前端向后端请求数据的接口,每次请求获得数据后
将其给option.yAxis.data,然后重新把配置项给实例对象(setOption)

//获取数据
function getBarData2(){
    $.ajax({
        url: "/getBarData2",
        type:"POST",
        success: function(data) {
            barOption.yAxis.data=data.data;
            barChart.setOption(barOption);
        },
        error: function(xhr, type, errorThrown) {

        }
    })
};
getBarData2();

结果动图

请添加图片描述

结语

将这个小demo用在了项目中,项目已经完工,之后会将项目开源出来,敬请期待!
项目地址:https://gitee.com/aniu-666/project
项目拿走不谢,还请给个star💖

相关文章
|
5月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
200 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
28天前
|
前端开发 数据可视化 JavaScript
前端echarts加标记点及标记线和提示框
通过本文的介绍,希望您能够深入理解和掌握如何在ECharts中添加标记点、标记线和提示框,并在实际项目中灵活运用这些功能,提升数据可视化效果。
43 4
|
4月前
|
前端开发 JavaScript
前端一键回到顶部案例
本文介绍了如何实现网页中的一键回到顶部功能,包括两种方法:第一种是通过HTML中的锚点跳转实现快速回到顶部;第二种是使用JavaScript的`scrollTo`方法结合`requestAnimationFrame`实现滚动动画效果,让页面滚动更加平滑自然。
87 1
前端一键回到顶部案例
|
4月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
3月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
416 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
4月前
|
JavaScript 前端开发
前端基础(十)_Dom自定义属性(带案例)
本文介绍了DOM自定义属性的概念和使用方法,并通过案例展示了如何使用自定义属性来控制多个列表项点击变色的独立状态。
60 0
前端基础(十)_Dom自定义属性(带案例)
|
4月前
|
JSON 前端开发 JavaScript
socket.io即时通信前端配合Node案例
本文介绍了如何使用socket.io库在Node.js环境下实现一个简单的即时通信前端配合案例,包括了服务端和客户端的代码实现,以及如何通过socket.io进行事件的发送和监听来实现实时通信。
64 2
|
4月前
|
前端开发
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
88 11
|
4月前
|
前端开发
前端web入门第四天】03 显示模式+综合案例热词与banner效果
本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。
|
4月前
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。