【Vue中使用Echarts】大屏可视化项目整体布局(pink老师vue 版)

文章目录

  • 一、效果展示
  • 二、基本的布局
  • 三、背景
  • 四、代码
  • 布局中遇到的一些问题

一、效果展示

先看一下展示的效果,无论是尺寸多宽的屏幕,都会将内容显示完整,做到了正正的响应式。唯一不足的是图表中的样例,会随着图表的缩放而变换位置,窗口尺寸变化过快会反应不过来,好在有节流函数,可以让浏览器计算量没有那么大。本篇博客不会直接拿echarts图表下手,会先介绍一些这个大屏可视化的响应式布局。后面会出一个专门的博客介绍echarts的使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、基本的布局

大致的布局如下,整体分为头部与body,头部有标题与时间两部分,body分为三个子标签,使用flex布局分别占3\5\3份,然后在占3份的标签内又分为三部分,占5份的标签内分为两部分。
在这里插入图片描述
请添加图片描述
写入样式之后就有了下面的样子
请添加图片描述
此时需要将前面封装的画图组件插入到指定的位置。得到下面的结果
请添加图片描述

三、背景

可以看出。这有一个在转的地球,地球有一个比较亮的描边,还有一些网格状的东西罩在上面。
地球与网状格格顺时针旋转,光边逆时针旋转,这种效果使用的是动画效果与过渡效果实现,样式代码如下:
map1、map2、map3盒子的背景分别是地球、描边、网格。

.map1,
.map2,
.map3 {position: absolute;top: 50%;left: 50%;background-size: 100% 100%;background-repeat: no-repeat;transform: translate(-50%, -50%);width: 6.475rem;height: 6.475rem;opacity: 0.3;
}
.map1 {background-image: url(../../public/images/map.png);animation: rotate 15s linear infinite;
}
.map2 {width: 8.0375rem;height: 8.0375rem;background-image: url(../../public/images/lbx.png);opacity: 0.8;animation: rotate 5s linear infinite;z-index: 2;
}
.map3 {width: 7.075rem;height: 7.075rem;background-image: url(../../public/images/jt.png);animation: rotate1 10s linear infinite;
}
@keyframes rotate {from {transform: translate(-50%, -50%) rotate(0deg);}to {transform: translate(-50%, -50%) rotate(360deg);}
}
@keyframes rotate1 {from {transform: translate(-50%, -50%) rotate(0deg);}to {transform: translate(-50%, -50%) rotate(-360deg);}
}

在这里插入图片描述

四、代码

//以下面一个panel作为例子进行讲解
<Panelmychart="echart1":option="chartsList[0]"title="柱形图 - 就业形式"
></Panel>
//这个标签控制一个图表,mychart是图表将要挂载的ref,option是图表的配置项,title是图表的标题。

Mainbox.vue整体布局

<template><div class="mainbox"><!-- 左边的图形展示 --><div class="column"><Panelmychart="echart1":option="chartsList[0]"title="柱形图 - 就业形式"></Panel><Panelmychart="echart2":option="chartsList[2]"title="曲线图-人员变化"></Panel><Panelmychart="echart3":option="chartsList[4]"title="南丁格尔图-地区分布"></Panel></div><!-- 中间的图形展示 --><div class="column"><!-- 首页数字展示 --><div class="mainboxtop"><div class="tophd"><ul><li>999999999+</li><li>200+</li></ul></div><div class="topbd"><ul><li>前端需求人数</li><li>市场供应人数</li></ul></div></div><!-- 首页地图展示 --><div class="mainboxbody"><div ref="chinamap" class="chinamap"></div><!-- 背景地球 --><div class="map1"></div><!-- 正旋转 --><div class="map2"></div><!-- 逆旋转 --><div class="map3"></div></div></div><!-- 右边的图形展示 --><div class="column"><Panelmychart="echart4":option="chartsList[1]"title="技能占比-进度条"></Panel><Panelmychart="echart5":option="chartsList[3]"title="曲线图-播放量"></Panel><Panel mychart="echart6" :option="chartsList[5]" title="饼图"></Panel></div></div>
</template><script>
// import MyEcharts from "./MyEcharts.vue";
// import "../../node_modules/echarts/dist/china.js";
import "../../node_modules/echarts/map/js/china.js";
// import "../config/chinamap.js";
// import "../config/china.js";import * as echarts from "echarts";
import Panel from "./Panel.vue";
var yearData = [
];var geoCoordMap = {};var XAData = [];var XNData = [];var YCData = [];var planePath ="path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z";
//var planePath = 'arrow';
var convertData = function (data) {var res = [];for (var i = 0; i < data.length; i++) {var dataItem = data[i];var fromCoord = geoCoordMap[dataItem[0].name];var toCoord = geoCoordMap[dataItem[1].name];if (fromCoord && toCoord) {res.push({fromName: dataItem[0].name,toName: dataItem[1].name,coords: [fromCoord, toCoord],value: dataItem[1].value,});}}return res;
};var color = ["#a6c84c", "#ffa022", "#46bee9"]; //航线的颜色
var series = [];
[["西安", XAData],["西宁", XNData],["银川", YCData],
].forEach(function (item, i) {series.push({name: item[0] + " Top3",type: "lines",zlevel: 1,effect: {show: true,period: 6,trailLength: 0.7,color: "red", //arrow箭头的颜色symbolSize: 3,},lineStyle: {normal: {color: color[i],width: 0,curveness: 0.2,},},data: convertData(item[1]),},{name: item[0] + " Top3",type: "lines",zlevel: 2,symbol: ["none", "arrow"],symbolSize: 10,effect: {show: true,period: 6,trailLength: 0,symbol: planePath,symbolSize: 15,},lineStyle: {normal: {color: color[i],width: 1,opacity: 0.6,curveness: 0.2,},},data: convertData(item[1]),},{name: item[0] + " Top3",type: "effectScatter",coordinateSystem: "geo",zlevel: 2,rippleEffect: {brushType: "stroke",},label: {normal: {show: true,position: "right",formatter: "{b}",},},symbolSize: function (val) {return val[2] / 8;},itemStyle: {normal: {color: color[i],},emphasis: {areaColor: "#2B91B7",},},data: item[1].map(function (dataItem) {return {name: dataItem[1].name,value: geoCoordMap[dataItem[1].name].concat([dataItem[1].value]),};}),});
});
var option = {tooltip: {trigger: "item",formatter: function (params, ticket, callback) {if (params.seriesType == "effectScatter") {return "线路:" + params.data.name + "" + params.data.value[2];} else if (params.seriesType == "lines") {return (params.data.fromName +">" +params.data.toName +"<br />" +params.data.value);} else {return params.name;}},},legend: {orient: "vertical",top: "bottom",left: "right",data: ["西安 Top3", "西宁 Top3", "银川 Top3"],textStyle: {color: "#fff",},selectedMode: "multiple",},geo: {map: "china",label: {emphasis: {show: true,color: "#fff",},},// 把中国地图放大了1.2倍zoom: 1.2,roam: true,itemStyle: {normal: {// 地图省份的背景颜色areaColor: "rgba(20, 41, 87,0.6)",borderColor: "#195BB9",borderWidth: 1,},emphasis: {areaColor: "#2B91B7",},},},series: series,
};
export default {components: { Panel },name: "MainBox",data() {return {//这里存放图表chartsList: [],mycharts: null,chartFun: null,};},mounted() {// this.$refs.echart1.setOption(this.chartsList[0]);// this.$refs.echart2.setOption(this.chartsList[0]);if (this.mycharts) {this.mycharts.dispose();}// this.mycharts = echarts.init(document.getElementsByClassName("chinamap"));this.mycharts = echarts.init(this.$refs.chinamap);this.mycharts.setOption(option);let chart = this.mycharts;// 节流函数function throttle(func, wait, options) {let time, context, args, result;let previous = 0;if (!options) options = {};let later = function () {previous = options.leading === false ? 0 : new Date().getTime();time = null;func.apply(context, args);if (!time) context = args = null;};let throttled = function () {let now = new Date().getTime();if (!previous && options.leading === false) previous = now;let remaining = wait - (now - previous);context = this;args = arguments;if (remaining <= 0 || remaining > wait) {if (time) {clearTimeout(time);time = null;}previous = now;func.apply(context, args);if (!time) context = args = null;} else if (!time && options.trailing !== false) {time = setTimeout(later, remaining);}};return throttled;}this.chartFun = throttle(function () {chart.resize();}, 10);window.addEventListener("resize", this.chartFun);},beforeDestroy() {// 移除窗口改变监听window.removeEventListener("resize", this.chartFun);},
};
</script><style scoped>
.mainbox {display: flex;/* background-color: pink; */padding: 0.125rem 0.125rem 0;
}
.column {/* height: 10rem; *//* background-color: red; */flex: 3;
}
.mainbox .column:nth-child(2) {/* background-color: blue; */padding: 0 0.125rem 0.1875rem;/* background-color: blue; */flex: 5;
}/* 以下是存放中国地图的容器样式 */
.mainboxtop {background-color: rgba(101, 132, 226, 0.1);padding: 0.1875rem;
}
.tophd {position: relative;border: 1px solid rgba(25, 186, 139, 0.17);
}
@font-face {font-family: electronicFont;src: url(../../public/font/DS-DIGIT.TTF);
}
.tophd > ul,
.topbd > ul {display: flex;
}
.tophd > ul > li {flex: 1;display: inline-block;height: 1rem;color: #ffeb7b;font-size: 0.875rem;font-family: electronicFont;
}
.tophd > ul::after {position: absolute;right: 50%;width: 0.0125rem;height: 50%;top: 25%;background-color: rgba(255, 255, 255, 0.2);content: "";
}
.tophd::before,
.tophd::after {position: absolute;content: "";width: 0.375rem;height: 0.125rem;
}
.tophd::before {top: 0;left: 0;border-top: 2px solid #02a6b5;border-left: 2px solid #02a6b5;
}
.tophd::after {bottom: 0;right: 0;border-bottom: 2px solid #02a6b5;border-right: 2px solid #02a6b5;
}.topbd > ul > li {flex: 1;height: 0.5rem;line-height: 0.5rem;color: rgba(255, 255, 255, 0.7);font-size: 0.225rem;padding-top: 0.125rem;
}.mainboxbody {position: relative;width: 100%;height: 10.125rem;/* background-color: pink; */
}
.chinamap {position: absolute;top: 0;left: 0;z-index: 5;height: 10.125rem;width: 100%;
}</style>

Header.vue用于管理布局中的头部。

<template><div class="header"><h1>大屏数据可视化展示</h1><div class="showtime">时间</div></div>
</template><script>
export default {name: "Header",mounted() {var t = null;t = setTimeout(time, 1000); //開始运行function time() {clearTimeout(t); //清除定时器let 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><style scoped>
.header {position: relative;width: 100%;height: 1.25rem;/* background-color: pink; */background: url(../../public/images/head_bg.png) no-repeat;background-position: top center;background-size: cover;
}
h1 {color: #fff;text-align: center;line-height: 1rem;font-size: 0.475rem;
}
.showtime {overflow: hidden;width: 4.5625rem;height: 1rem;position: absolute;top: 0;right: 0.375rem;line-height: 0.9375rem;font-size: 0.25rem;color: rgba(255, 255, 255, 0.7);
}
</style>

布局中遇到的一些问题

下面是在布局的时候遇到的一些问题,可以参考一下:

  • Echarts:There is a chart instance already initialized on the dom.//重复给一个dom元素画图

  • echarts警告:Can‘t get DOM width or height. Please check dom.clientWidth and dom.clientHeight. …//没有给盒子宽高

  • Uncaught TypeError: Cannot read properties of undefined (reading ‘echarts’)//没有找到echarts中的china.js
    将china.js文件放入echarts.js所在的目录

  • Error in mounted hook: “TypeError: this.dom.getContext is not a function”
    一开始是使用jQuery获取dom,一直报上面的错误,后来改变用vue的ref获取就可以了
    使用document.getelementById()获取也会报错

  • ./src/components/Home.vue Module not found: Error: Can’t resolve ‘less-loader’ in 'C:\Users\123\Desk
    //使用了less语法,没有装less相关插件,执行npm install less-loader@5.0.0 -D


这篇博客是没有提到如何使用echarts画图的,接下来一篇将会告诉大家如何画图。以及对图表进行响应式布局。如果大家有好的想法或者想要源码欢迎评论区留言。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412226.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完美解决idea一直indexing,无法操作的问题

今天主要分享一下在使用idea 2020.3版本开发maven项目的时候&#xff0c;一直出现有效件index&#xff0c; 有时候是scaning indexing, 有时候是update indexing, indexing的时候&#xff0c;idea基本上就没办法操作了&#xff0c;连跳入到类或方法里都跳不了。不厌其烦。 于是…

Linux/Traceback

Enumeration nmap 使用nmap初步扫描发现只开放了22和80端口&#xff0c;端口详细扫描情况如下 先看看web是什么样子的&#xff0c;打开网站发现有一条留言&#xff0c;显示该站点已经被黑了&#xff0c; 并且留下了后门 查看源代码&#xff0c;可以看到下面的注释 <!--So…

这种网页要小心!注意你的账号密码泄露!

目录 H5是泄露账号和数据的重要渠道 代码混淆是最佳的安全保护手段 基于AI的自适应代码混淆 我们经常见到各类H5海报&#xff0c;产品展示、活动促销、招聘启事等。H5不仅能够无缝地嵌入App、小程序&#xff0c;还可以作为一个拥有独立链接地址的页面&#xff0c;直接在PC端打开…

大数据开发之Hadoop(MapReduce)

第 1 章&#xff1a;MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并…

【网络安全】【密码学】【北京航空航天大学】实验一、数论基础(上)【C语言和Java实现】

实验一、数论基础&#xff08;上&#xff09; 一、实验目的 1、通过本次实验&#xff0c;熟悉相关的编程环境&#xff0c;为后续的实验做好铺垫&#xff1b; 2、回顾数论学科中的重要基本算法&#xff0c;并加深对其的理解&#xff0c;为本学期密码学理论及实验课程打下良好…

2024年美赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

npm install 无反应 npm run serve 无反应

说明情况&#xff1a;其实最开始我就是发现我跟着黑马的苍穹外卖的前端day2的环境搭建做的时候&#xff0c;到这一步出现了问题&#xff0c;无论我怎么 npm install 和 npm run serve 都没有像黑马一样有很多东西进行加载&#xff0c;因此我换了一种方法 1.在这个文件夹下cmd …

怎样展示你在项目中的重要性?

今天我们聊聊面试中&#xff0c;怎样介绍你的项目&#xff0c;以及怎样突出你的重要性。 面试中除了专项技术问答&#xff0c;另一个重头戏是“盘问”应聘者做过的项目。面试官通过了解你的项目工作&#xff0c;可以看到你和团队的协作过程、工作成果&#xff0c;以及你起到的…

全球网络是如何互联的?

1.Internet 在之前的学习中我们知道了Internet和internet的区别&#xff0c;也知道了Internet目前是全球最大的网络&#xff0c;并且由很多规模不同的网络互联而成。到目前已经有超过90个国家接入了Internet&#xff0c;主机超过400万台&#xff0c;可以说Internet是全人类的信…

OpenGL DIR

Mesa简介-CSDN博客 Mesa, also called Mesa3D and The Mesa 3D Graphics Library, is an open source software implementation of OpenGL, Vulkan, and other graphics API specifications. Mesa translates these specifications to vendor-specific graphics ha…

kafka简单介绍和代码示例

“这是一篇理论文章&#xff0c;给大家讲一讲kafka” 简介 在大数据领域开发者常常会听到MQ这个术语&#xff0c;该术语便是消息队列的意思&#xff0c; Kafka是分布式的发布—订阅消息系统。它最初由LinkedIn(领英)公司发布&#xff0c;使用Scala语言编写&#xff0c;与2010年…

数据库-数据库分类

数据库可以分为关系型数据库和非关系型数据库&#xff0c;常见的数据库如下 关系型数据库 关系型数据库是一种采用关系模型来组织数据的数据库&#xff0c;它以行和列的形式存储数据&#xff0c;以便于用户理解。关系型数据库中的数据以二维表的形式组织&#xff0c;被称为表…