项目中需要使用echarts图表功能。刚开始都是一个echarts图表排成一排。没有内容的时候显得非常空而乱。于是改成一排两个,但是又出现新的问题了。如果查询数据比较多的时候,内容都挤在一起了,非常不友好。于是想到一个可以放大缩小的功能,这样不就很完美了。想法不错,实现起来却遇到了困难。于是网上找,甚至在博客园发问。可能描述不够清晰。
提问连接:https://q.cnblogs.com/q/129882/
这个周末双休,于是在家来实践摸索一下。花了几个小时,总算勉强实现我想要的效果了。
先看看效果,不然不知道我要说什么。
初始状态下的界面
点击第一个放大后的界面
在点击第二个放大效果
点击第一个缩小后的效果
就是这样,每个图表都可以放大缩小,然后改变显示效果。
之前想法是通过事件去改变框架自带的样式——lg属性,后面发现不行。于是自定义了一个样式名来控制,内容是一样的。如果不是vue 我早就想到了。因为以前做过类似的。
这还只是一个demo形式,真正移到项目里还需要做一些调整,改变窗体的时候,echarts图表并没有发生改变。
实践代码,差点忘记添加了。
<template> <div class="chart-container"> <div class="card-item"> <el-row :gutter="20"> <el-col :xs="24" :sm="12" :class="chagneclass1==true?'chy-big':''"> <div class="card-panel"> <div class="card-panel-content"> <div class=" chy-datashow" id='gCarWasherNum' name='gCarWasherNum' ref="gCarWasherNum"> <div class="chart-title"> <span>测试数据一</span> <div class="changezoom"> <span class="chy-span " :class="chagneclass1==false?'chy-disable':'chy-enable'" @click="change(1,false)">缩小</span> <span class="chy-span " :class="chagneclass1==false?'chy-enable':'chy-disable'" @click="change(1,true)">放大</span> </div> </div> <div class="chy-datetime"> <el-date-picker class="right-data-picker" v-model="monthDateSpan" type="daterange" align="right" unlink-panels range-separator="—" start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="monthPickerOptions" :editable="false" ></el-date-picker> </div> <div class="chart-wrapper"> <!-- <chart height="300px" width="100%" /> --> <div style="100%;height:300px" ref="chart1"></div> </div> </div> </div> </div> </el-col> <el-col :xs="24" :sm="12" :class="chagneclass2==true?'chy-big':''"> <div class="card-panel"> <div class="card-panel-content"> <div class=" chy-datashow" id='gCarWasherNum' name='gCarWasherNum' ref="gCarWasherNum"> <div class="chart-title"> <span>测试数据二</span> <div class="changezoom"> <span class="chy-span " :class="chagneclass2==false?'chy-disable':'chy-enable'" @click="change(2,false)">缩小</span> <span class="chy-span " :class="chagneclass2==false?'chy-enable':'chy-disable'" @click="change(2,true)">放大</span> </div> </div> <div class="chy-datetime"> <el-date-picker class="right-data-picker" v-model="monthDateSpan" type="daterange" align="right" unlink-panels range-separator="—" start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="monthPickerOptions" :editable="false" ></el-date-picker> </div> <div class="chart-wrapper"> <!-- <chart height="300px" width="100%" /> --> <div style="100%;height:300px" ref="chart2"></div> </div> </div> </div> </div> </el-col> </el-row> </div> </div> </template> <script> //import Chart from '@/components/Charts/LineMarker' const echarts = require('echarts'); export default { name: 'LineChart', //components: { Chart }, data(){ return{ monthPickerOptions: {}, monthDateSpan: [], beginTime:'', endTime:'', chagneclass1:true, chagneclass2:false, chart1:null, chart2:null } }, mounted(){ this.initCharts(); this.initCharts2(); // this.init(); }, methods:{ initCharts () { this.chart1 = echarts.init(this.$refs.chart1); // 绘制图表 this.chart1.setOption({ // title: { text: '在Vue中使用echarts' }, tooltip: {}, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }); window.addEventListener('resize',function () {//执行 this.chart1.resize(); }) // 监听侧边栏的变化 this.sidebarElm = document.getElementsByClassName('sidebar-container')[0] this.sidebarElm && this.sidebarElm.addEventListener( 'transitionend', function () {//执行 this.chart1.resize(); }) }, initCharts2 () { this.chart2= echarts.init(this.$refs.chart2); // console.log(this.$refs.myPie); // 绘制图表 this.chart2.setOption( { xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, yAxis: { type: 'value' }, series: [{ data: [120, 200, 150, 80, 70, 110, 130], type: 'bar', showBackground: true, backgroundStyle: { color: 'rgba(220, 220, 220, 0.8)' } }] }); window.addEventListener('resize',function () {//执行 this.chart2.resize(); }) this.sidebarElm = document.getElementsByClassName('sidebar-container')[0] this.sidebarElm && this.sidebarElm.addEventListener( 'transitionend', function () {//执行 this.chart2.resize(); }) }, // init() { //关键三 init的时候使用定时器监听窗口的变化,再调用echarts的resize方法 // setTimeout(() => { // window.addEventListener('resize', () => { // this.chart.resize(); // this.myPie.resize(); // }) // }, 20) // }, // destroyed() { //关键四 定时清除init带来的定时器 // window.removeEventListener('resize', this.init, 20) // }, change(item,obj){ if(item=='1'){ this.chagneclass1=obj } else if(item=='2'){ this.chagneclass2=obj } this.init(item) }, init(item) { //关键三 init的时候使用定时器监听窗口的变化,再调用echarts的resize方法 setTimeout(() => { if(item=='1'){ this.chart1.resize(); } else if(item=='2'){ this.chart2.resize(); } }, 20) }, } } </script> <style scoped lang="scss"> .chart-container{ position: relative; 100%; height: calc(100vh - 84px); background-color: gray; } .chy-datashow{ position: relative; .chy-datetime{ margin: 5px; // z-index: 8; // position: absolute; // top: 55px; // right: 20px; // text-align: center; // margin: auto; } .chart-title{ // margin-bottom: 45px; margin: 5px; font-size: 16px; font-weight: bold; position:relative; 100%; } .el-date-editor--daterange.el-input, .el-date-editor--daterange.el-input__inner, .el-date-editor--timerange.el-input, .el-date-editor--timerange.el-input__inner { 300px !important; } } .card-item{ @media only screen and (min- 1200px){ .chy-big{ 100%; } .changezoom{ position:absolute;right:0;top:0; 100px; height: 30px; font-size: 14px; .chy-span{ display: inline-block; margin: 0 2px; } .chy-disable{ color: gray; } .chy-enable{ color: #3AD1C5; } } } @media screen and (max- 1200px) { .changezoom{ display: none; } } .card-panel:hover{ border: 2px solid #3AD1C5 !important ; } .card-panel{ background-color: white; border-radius: 10px; border: 2px solid white !important ; margin: 5px 0; } .card-panel-content{ padding: 10px; } } .chy_summary{ position: relative; font-size: 16px; min-height: 20px; top: 55px; } </style>
参考:https://blog.csdn.net/qq_34312235/article/details/100920873