基于ECharts的数据大屏制作

2023-10-27

P.S.

项目用到的所有文件我放在了百度网盘中,方便下载
链接:https://pan.baidu.com/s/1z_vfDC-SK09CYFrDFMl91Q
提取码:0ajm

零、知识点补充

这里我会写两种的解释,一个是用我自己的话来说(简单版);另一种就是看百度的解释(详细版)。

0.1 Less

简单版

就是辅助写css的,加快项目开发效率。

可以理解为一种类似css写法的一个语言,每次你保存less文件的时候,他会给你自动转换成wxss(微信小程序的样式文件)或者css文件,相对于你直接写css语法所需的代码,用less写要少很多。

当然,less也提供了css没有的东西,从另一角度看,less是一个加强版css

详细版

0.2 jQuery插件

简单版

js插件,一个比较基本的js插件,也很小,很方便导入,一些前端的框架也基于jQuery写的,比如Bootstrap框架,使用Bootstrap的时候,必须先导入jQuery.js,才能正常使用Bootstrap。

详细版

jQuery官网:按住Ctrl点击跳转

官网是英文的,但是What is jQuery这个标题应该都可以找得到。

0.3 Flex布局

简单版

一种布局方式,让我们快速布局。此项目我们用Flex布局来快速布局,以及屏幕适配。

详细版

Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。

这里给出菜鸟的Flex介绍:按住Ctrl点击跳转

0.4 rem

简单版

rem就是一个相对的单位,会根据网页长宽的变化而变化。rem常用来实现响应式布局。

详细版

这个玩意就是个相对计算出来的单位,官网应该没有(我是没找到。。)

给大家看看菜鸟教程上写的东西吧:px、em、rem区别介绍,一样道理按住Ctrl点击即可跳转。

一、项目准备

1.1 项目使用技术

项目学到或用到如下技术:

  • div+css布局
  • flex布局
  • less辅助样式开发
  • 原生js+jQuery使用
  • rem屏幕适配
  • echarts基础

1.2 文件准备

1.2.1 插件文件

  1. flexible.js插件
  2. jquery.js插件
  3. 包含默认组件的echarts.js(或echarts.min.js)插件
  4. VS Code插件
    1. Easy LESS(以下简称less插件)
    2. px to rem & rpx (cssrem)(一下简称rem插件)

1.2.2 VS Code插件下载

步骤

先打开VS Code点击插件下载的图标
在这里插入图片描述

分别搜索Easy LESSpx to rem & rpx (cssrem),搜索到之后点击安装(install)

在这里插入图片描述

详细插件的页面

如果怕自己下载错了,我这里给出两个插件的详情页面。

Easy LESS:
在这里插入图片描述
px to rem & rpx (cssrem):
在这里插入图片描述

可能出现的问题

如果你之前用过less辅助开发微信小程序的话,less默认生成的文件是wxss,我们在less插件的settings.js文件中配置一下就好。

首先我们找到settings.js,并打开;
在这里插入图片描述
设置settings.js,将less自动转化格式为css
在这里插入图片描述
保存less文件,可以看到css文件自动生成成功,问题解决。
在这里插入图片描述

1.3 适配方案

首先我们目标是1920px的大屏幕,flexible.js默认把屏幕分为24等份(1920px÷24=80px

规划好了,我们再来设置rem插件的配置信息。首先和上面类似,找到rem插件的扩展设置,然后就能看到Root Font Size这一项了;
在这里插入图片描述

修改成80即可,不用px单位,其他单位也不用。

二、项目步骤

2.1 项目实现效果

在这里插入图片描述

2.2 项目流程

项目文件架构

项目文件架构为
在这里插入图片描述
除了index.html(手动创建)、index.less(手动创建)、index.js(手动创建)、index.css(less文件保存后自动生成的,不用手动创建)外,其他文件都是能从网上找到的,我们不用自己写。

制作步骤

按图中的序号来。
在这里插入图片描述
先做header部分,然后开始做main部分;main部分中,先做left再做right最后做中间部分;中间部分分上面的数字部分和下面的地图部分。

合适的开发流程有利于提高代码写的效率。

2.3 body基础样式

撰写index.html基本代码骨架(VS Code中输入!,然后Enter,就可以快速生成HTML基本骨架)

P.S. 最好将自动生成的骨架中html的lang属性设置为zh-CN(声明是中文网页),不然每次生成网页,他都提示你翻不翻译,影响开发效率。
在这里插入图片描述
设置80px1rem,方便屏幕适配(前面配过了这步就不用管了)
在这里插入图片描述
导入flexible布局(flexible.js
在这里插入图片描述
插入body(整个页面)的背景图
在这里插入图片描述
效果如下图所示
在这里插入图片描述

2.4 头部栏的制作

2.4.1 实现代码

<!-- index.html -->
<header>
    <h1>2018212229+朱明</h1>
    <div class="showTime"></div>
</header>
<!-- showTime模块实现 -->
<script>
    // 格式: 当前时间:2020年3月17-0时54分14秒
    var t = null;
    t = setTimeout(time, 1000);//開始运行
    function time() {
        clearTimeout(t);//清除定时器
        dt = new Date();
        var y = dt.getFullYear();
        var mt = dt.getMonth() + 1;
        var day = dt.getDate();
        var h = dt.getHours();//获取时
        var m = dt.getMinutes();//获取分
        var s = dt.getSeconds();//获取秒
        document.querySelector(".showTime").innerHTML = '当前时间:' + y + "年" + mt + "月" + day + "-" + h + "时" + m + "分" + s + "秒";
        t = setTimeout(time, 1000); //设定定时器,循环运行     
    }
</script>
// less中的代码
header {
    position: relative;
    height: 1.25rem;
    background: url(../images/head_bg.png) no-repeat;
    background-size: 100% 100%;
    h1 {
        font-size: .475rem;
        color: #FFF;
        text-align: center;
        line-height: 1rem;
    }
    .showTime {
        position: absolute;
        right: .375rem;
        top: 0;
        line-height: .9375rem;
        color: rgba(255, 255, 255, 0.7);
        font-size: .25rem;
    }
}

2.4.2 步骤

增加头部栏(header),并在其中增加标题(h1)和showTime模块区域(div)
在这里插入图片描述
用JavaScript实现showTime模块功能
在这里插入图片描述
当前实现的页面效果如下图所示,不符合预期效果
在这里插入图片描述
当前代码如下:
在这里插入图片描述
经原因分析,h1默认占一行,虽然父标签header设置了positionrelativeshowTime()模块positionabsolute还不行,还需设置top值,我们增加less代码:top: 0
在这里插入图片描述
问题解决。
在这里插入图片描述

2.5 主体部分的制作

2.5.1 实现代码

<!-- 页面主体 -->
<section class="mainbox">
    <!-- 左侧部分制作 -->
    <div class="column">
        <div class="panel bar">
            <h2>柱形图-就业行业</h2>
            <div class="chart"></div>
            <div class="panel-footer"></div>
        </div>
        <div class="panel line">
            <h2>折线图-就业行业</h2>
            <div class="chart"></div>
            <div class="panel-footer"></div>
        </div>
        <div class="panel pie">
            <h2>饼状图-就业行业</h2>
            <div class="chart"></div>
            <div class="panel-footer"></div>
        </div>
    </div>
    <!-- 中间部分制作 -->
    <div class="column">
        <!-- no数字模块的制作 -->
        <div class="no">
            <div class="no-hd">
                <ul>
                    <li>123123</li>
                    <li>123123</li>
                </ul>
            </div>
            <div class="no-bd">
                <ul>
                    <li>前端需求人数</li>
                    <li>市场供应人数</li>
                </ul>
            </div>
        </div>
        <div class="map">
            <div class="map1"></div>
            <div class="map2"></div>
            <div class="map3"></div>
            <div class="chart">地图模块</div>
        </div>
    </div>
    <!-- 右侧部分制作 -->
    <div class="column">
        <div class="panel bar1">
            <h2>柱形图-就业行业</h2>
            <div class="chart"></div>
            <div class="panel-footer"></div>
        </div>
        <div class="panel line1">
            <h2>折线图-就业行业</h2>
            <div class="chart"></div>
            <div class="panel-footer"></div>
        </div>
        <div class="panel pie1">
            <h2>饼状图-就业行业</h2>
            <div class="chart"></div>
            <div class="panel-footer"></div>
        </div>
    </div>
</section>
// less代码
// 字体声明
@font-face {
    font-family: electronicFont;
    src: url(../font/DS-DIGIT.TTF);
}

// 页面主体部分
.mainbox {
    display: flex;
    min-width: 1024px;
    max-width: 1920px;
    margin: 0 auto;
    padding: .125rem .125rem 0;
    .column {
        flex: 3;
    }
    .column:nth-child(2) {
        flex: 5;
        margin: 0 .125rem .1875rem;
    }
    // 全部的图表模块
    .panel {
        position: relative;
        height: 3.875rem;
        border: 1px solid rgba(25, 186, 139, 0.17);
        padding: 0 .1875rem .5rem;
        margin-bottom: .1875rem;
        background: url(../images/line\(1\).png) rgba(255, 255, 255, 0.03);
        &::before {
            position: absolute;
            top: 0;
            left: 0;
            width: 10px;
            height: 10px;
            border-left: 2px solid #02a6b5;
            border-top: 2px solid #02a6b5;;
            content: "";
        }
        &::after {
            position: absolute;
            top: 0;
            right: 0;
            width: 10px;
            height: 10px;
            border-right: 2px solid #02a6b5;
            border-top: 2px solid #02a6b5;;
            content: "";
        }
        .panel-footer {
            position: absolute;
            left: 0;
            bottom: 0;
            width: 100%;
            &::before {
              position: absolute;
              bottom: 0;
              left: 0;
              content: "";
              width: 10px;
              height: 10px;
              border-bottom: 2px solid #02a6b5;
              border-left: 2px solid #02a6b5;
            }
            &::after {
              position: absolute;
              bottom: 0;
              right: 0;
              content: "";
              width: 10px;
              height: 10px;
              border-bottom: 2px solid #02a6b5;
              border-right: 2px solid #02a6b5;
            }
        }
        h2 {
            height: .6rem;
            color: #FFF;
            line-height: .6rem;
            text-align: center;
            font-size: 0.25rem;
            font-weight: 400;
        }
        .chart {
            height: 3rem;
        }  
    }
}

// no数字模块
.no {
    background: rgba(101, 132, 226, 0.1);
    padding: .1875rem;
    .no-hd {
        position: relative;
        border: 1px solid rgba(25, 186, 139, 0.17);
        &::before {
            position: absolute;
            top: 0;
            left: 0;
            content: "";
            width: 25px;
            height: 15px;
            border-top: 2px solid #02a6b5;
            border-left: 2px solid #02a6b5;
        }
        &::after {
            position: absolute;
            bottom: 0;
            right: 0;
            content: "";
            width: 25px;
            height: 15px;
            border-bottom: 2px solid #02a6b5;
            border-right: 2px solid #02a6b5;
        }
        ul {
            display: flex;
            li {
                position: relative;
                flex: 1;
                list-style: none;
                height: 1rem;
                font-size: .875rem;
                color: #ffeb7b;
                text-align: center;
                font-family: 'electronicFont';
            }
            li:nth-child(1)::after {
                content: "";
                position: absolute;
                top: 25%;
                right: 0;
                height: 50%;
                width: 1px;
                background: rgba(255, 255, 255, 0.2);
            }
        }
    }
    .no-bd {
        ul {
            display: flex;
            li {
                position: relative;
                flex: 1;
                list-style: none;
                height: .5rem;
                font-size: .225rem;
                color: rgba(255, 255, 255, 0.7);
                text-align: center;
                padding-top: .125rem;
            }
        }
    }
}

// 地图部分样式
.map {
    position: relative;
    height: 10.125rem;
    .map1 {
        width: 6.475rem;
        height: 6.475rem;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        background: url(../images/map.png);
        background-size: 100% 100%;
        opacity: 0.3;
    }
    .map2 {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 8.0375rem;
        height: 8.0375rem;
        background: url(../images/lbx.png);
        background-size: 100% 100%;
        animation: rotate1 15s linear infinite;
        opacity: 0.6;
    }
    @keyframes rotate1 {
        from {
            transform: translate(-50%, -50%) rotate(0deg);
        }
        to {
            transform: translate(-50%, -50%) rotate(360deg);
        }
    }

    .map3 {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 7.075rem;
        height: 7.075rem;
        background: url(../images/jt.png);
        background-size: 100% 100%;
        animation: rotate2 10s linear infinite;
        opacity: 0.6;
    }

    @keyframes rotate2 {
        from {
          transform: translate(-50%, -50%) rotate(0deg);
        }
        to {
          transform: translate(-50%, -50%) rotate(-360deg);
        }
    }
    .chart {
        position: absolute;
        top: 0;
        left: 0;
        z-index: 5;
        height: 10.125rem;
        width: 100%;
    }
}

2.5.2 左侧的制作

先制作底层,插入背景图,然后加一个0.03透明度的白底背景颜色
在这里插入图片描述
通过设置panel的before和after来制作上方角边框效果
在这里插入图片描述
我们放置一个div置于panel的底部,然后设置该div的after和before来制作下方角边框效果
在这里插入图片描述
加入标题(h2)和放置图表的区域(div)
在这里插入图片描述
下面两个区域也是这样做,我们CV一下,然后修改部分代码,最终效果如下图所示。
在这里插入图片描述

2.5.3 右侧的制作

这部分与左侧一样,我们CV一下,代码都可以完全不改,效果如下图所示。
在这里插入图片描述

2.5.4 中间上半部分的制作

先做中间的上面部分,我们称为no部分,先准备一下底层div的背景
在这里插入图片描述
然后采用flex布局,分为两部分展示两个数字
在这里插入图片描述
然后我们导入字体,在less文件前面声明font路径
在这里插入图片描述

然后我们下面调用刚声明的字体即可
在这里插入图片描述
no(div)中的no-hd(div)展示的数字字体修改为我们导入的字体,效果如下
在这里插入图片描述
然后我们还要解决中间的小竖线,我们给li标签的after加上50%的边框即可
在这里插入图片描述
但是我们不想让第二个liafter也产生竖线
在这里插入图片描述
我们将less的样式限制第一个li标签就好了,下面是改善的代码
在这里插入图片描述
解决最后的效果如下图所示
在这里插入图片描述
那我们经过上面的操作,很容易就写出剩余的部分,我们直接贴出代码
在这里插入图片描述
上半部分最终的效果如下图所示
在这里插入图片描述

2.5.5 中间下半部分的制作

该部分我们命名为map模块,我们先制作最底部div(map1)的背景图
在这里插入图片描述
实现最底部div的效果如下
在这里插入图片描述
再新建一个map2的div,我们进行动画的一些配置
在这里插入图片描述
动图实现效果因为动图展示不了的原因,我们就只能放一个静态图片了
在这里插入图片描述
接下来我们开始制作map3的div,也是动图,我们进行相应的配置
在这里插入图片描述
最终效果实现如下
在这里插入图片描述

2.5.6 每个部分chart的制作

(1)中间的中国地图实现

我们在index.js中写好所需的js代码,并采用即时执行函数,节省变量名
在这里插入图片描述
index.html中引入index.js以及echarts.min.js插件
在这里插入图片描述
效果实现完成
在这里插入图片描述
(2)两侧的柱形图、折线图和饼图实现

引入中国地图china.js插件和MmyMap.js插件(通过ECharts社区下载的样式)

在这里插入图片描述
最终的效果如图所示
在这里插入图片描述

2.5.7 页面适配

最后我们再加上一段代码,保证一下响应式布局

// less代码
/* 约束屏幕尺寸 */
@media screen and (max-width: 1024px) {
    html {
      font-size: 42px !important;
    }
}
@media screen and (min-width: 1920px) {
    html {
      font-size: 80px !important;
    }
}

项目完成。

三、后置寄语

如果你不是很深入学习js或者css的话,很多像@media screen(function() {})();nth-child()::after&::after:before等等等等,你可能完全不熟悉,或者不知道用法,这个没关系。

如果你不是想精通前端,就没必要学的很深,只要会一些基础的语法,然后要实现什么功能就搜索怎么实现,现学就好。

所以本文没有单独拎出来一些点进行详细的讲解,可能你看的云里雾里(精通一门语言就会好一点),耐着性子多看看即可。

结束。By:zm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于ECharts的数据大屏制作 的相关文章

随机推荐

  • SpringCloud Alibaba Seata处理分布式事务

    文章目录 第一章 分布式事务问题 第二章 Seata简介 2 1 Seata是什么 2 2 Seata 整体工作流程 2 3 Seata AT 模式 2 3 1 AT 模式的前提 2 3 2 AT 模式的工作机制 2 4 下载 第三章 Se
  • react 事件绑定this指向

    一 使用class的实例方法 class Hello extends React Component onIncrement gt this setState count this state count 1 二 箭头函数
  • 如何透过上层div点击下层的元素解决方法

    如何透过上层div点击下层的元素解决方法 参考文章 1 如何透过上层div点击下层的元素解决方法 2 https www cnblogs com wei dong p 9928566 html 备忘一下
  • 可以估计不确定性的神经网络:SDE-Net

    作者丨段易通 知乎 来源丨https zhuanlan zhihu com p 234834189 编辑丨极市平台 随着深度学习技术的不断发展 DNN模型的预测能力变得越来越强 然而在一些情况下这却并不是我们想要的 比如说给模型一个与训练集
  • 多线程如何保证线程安全

    1 每次使用该对象的时候都创建一次 造成创建和销毁对象开销大 2 对方法进行加锁 造成线程阻塞性能差 3 使用ThreadLocal保证每个线程对同一个对象只创建一次 gt 较好的方法 ThreadLocal提供了线程的局部变量 每个线程都
  • windows下gvim打开文件显示乱码的解决

    问题 在windows中安装了gvim73 但是 使用gvim打开文件的时候 如果文件内容包含中文 那么 打开之后总是看到一堆乱码 解决办法 放狗搜了一下 发现这篇文章完美地解决了我的问题 http www douban com note
  • C. Doremy‘s IQ #808 div2

    Problem C Codeforces 题意就是给你一串序列 一个定值 如果对应的ai小于定值 就降智 否则直接过去 问你输出最多的方案 应该把心静一下的 思路不难想 对于我来说 应该是代码部分不太好实现 这个算是一个积累吧 思路是 尽量
  • 第八篇 算法————程序的灵魂

    2 1 程序 算法 数据结构 一个程序主要包括以下两方面的信息 1 对数据的描述 在程序中要指定哪些数据 以及这些数据的类型和数据的组织形式 这就是数据结构 2 对操作的描述 要求计算机进行操作的步骤 也就是算法 数据是操作的对象 操作的目
  • MSP432使用CCS模数转换(ADC)通用输入输出(GPIO)脉宽调制(PWM)通用异步接收器和发送器(UART)及其RTOS和机器人超声波距离检测

    示例 1 这段代码只会打开一个 P1 0 板载 LED 它是 MSP432 在寄存器级别的红色板载 LED include msp h void main void WDT A gt CTL WDT A CTL PW WDT A CTL H
  • Kubernetes中Pod容器的使用

    1 概述 Pod是K8S系统中可以创建和管理的最小单元 是资源对象模型中由用户创建或部署的最小资源对象模型 有许多组件围绕Pod进行扩展和支持 比如控制器对象是用来管控Pod对象的 Service或者Ingress资源对象是用来暴露Pod引
  • Vue之事件绑定

    何为事件绑定 当我们开发完UI界面后 还需要和用户交互 所谓交互也就是用户可以点击界面上的按钮 文字 链接等以及点击键盘上的按钮 我们开发的程序可以做出对应的反应 做出的反应会通过UI界面再反馈给用户 或是对话框 或是跳转到新页面 总之就是
  • Jupyter 的安装及使用

    一 Jupyter 是什么 Jupyter是它要服务的三种编程语言 Julia Python R 的缩写 Jupyter d u p t Julia 是一个面向科学计算的高性能动态高级程序设计语言 Python是一门编程语言 具有丰富强大的
  • 移动端Web页面适配方案(整理版)

    主要分为 百分比 rem vw vh 响应式设计 介绍 移动端web页面的开发 由于手机屏幕尺寸 分辨率不同 或者需要考虑横竖屏问题 为了使得web页面在不同移动设备上具有相适应的展示效果 需要在开发过程中使用合理的适配方案来解决这个问题
  • =' not supported between instances of 'str' and 'int'与must be str, not int报错' aria-label='python小白之TypeError: '>=' not supported between instances of 'str' and 'int'与must be str, not int报错'> python小白之TypeError: '>=' not supported between instances of 'str' and 'int'与must be str, not int报错

    1 当编程时出现 TypeError gt not supported between instances of str and int 这样的错误时 代码如下 age input 输入你的年龄 if age gt 18 print 你已成
  • 传统视觉轮廓识别

    传统视觉第二讲 学习任务 2023传统视觉第二讲 轮廓识别 传统视觉识别流程 对于输入的图片 使用各种图像处理手段 如颜色空间转换 二值化 形态学处理等得到一张只包含黑白两色的mask 再对mask进行轮廓提取 根据轮廓的长宽面积等特征筛选
  • Seata 1.4.0 + nacos配置和使用

    下载地址 http seata io zh cn blog download html 下载后如下图 进入conf目录 修改file conf 修改registry conf 将配置导入到nacos nacos config sh脚本准备
  • Unity进阶-消息框架的理论知识与实际操作学习笔记

    文章目录 Unity进阶 消息框架的理论知识与实际操作学习笔记 Unity进阶 消息框架的理论知识与实际操作学习笔记 笔记来源课程 https study 163 com course courseMain htm courseId 121
  • 【目标检测】目标检测中的标签分配

    文章目录 一 前言 二 标签分配方法的分类 2 1 标签是否非负 2 2 是否有预测结果参与 一 前言 在目标检测任务中 标签分配起着关键的作用 其目的是将样本划分成正样本和负样本 然后与GT之间计算loss 决定模型如何学习和收敛 二 标
  • 手把手教你安装JDK8~

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 JDK8安装教程 一 JKD8下载及安装流程 1 浏览器搜索jdk8 进入官网网站进行下载 2 选择相应操作系统进行下载 作者是windows系统 3 下载JDK
  • 基于ECharts的数据大屏制作

    P S 项目用到的所有文件我放在了百度网盘中 方便下载 链接 https pan baidu com s 1z vfDC SK09CYFrDFMl91Q 提取码 0ajm 零 知识点补充 这里我会写两种的解释 一个是用我自己的话来说 简单版