項目中需要使用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="width: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="width: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; width: 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; width: 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 { width: 300px !important; } } .card-item{ @media only screen and (min-width: 1200px){ .chy-big{ width: 100%; } .changezoom{ position:absolute;right:0;top:0; width: 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-width: 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