vue使用echarts圖表自適應(yīng)的幾種解決方案
1.使用window.onresize
let myChart = echarts.init(document.getElementById(dom))
window.onresize = function () {
myChat.resize()
}
優(yōu)點(diǎn):可以根據(jù)窗口大小實(shí)現(xiàn)自適應(yīng)
缺點(diǎn):
多個(gè)圖表自適應(yīng)寫法比較麻煩(當(dāng)一個(gè)頁(yè)面的圖表太多時(shí),這樣寫法不是很靈活);
let myChart1 = echarts.init(document.getElementById(dom1))
let myChart2 = echarts.init(document.getElementById(dom2))
window.onresize = function () {
myChat1.resize()
myChat2.resize()
}
多個(gè)vue頁(yè)面有onresize方法時(shí),會(huì)被覆蓋;
當(dāng)vue頁(yè)面路由跳轉(zhuǎn)到下一個(gè)頁(yè)面時(shí),上一個(gè)頁(yè)面的onresize方法會(huì)繼續(xù)執(zhí)行,(這個(gè)時(shí)候下一個(gè)頁(yè)面已經(jīng)不需要onresize方法執(zhí)行了,當(dāng)圖表過(guò)多時(shí)會(huì)造成頁(yè)面卡頓)
2.使用window.addEventListener添加resize方法
let myChart = echarts.init(document.getElementById(dom))
let sizeFun = function () {
myChat.resize()
}
window.addEventListener('resize', sizeFun )
優(yōu)點(diǎn):
- 可以根據(jù)窗口大小實(shí)現(xiàn)自適應(yīng);
- 將圖表方法封裝以后,只需要執(zhí)行一遍就可以實(shí)現(xiàn)多個(gè)圖表的自適應(yīng);
- 不會(huì)被覆蓋
缺點(diǎn):
- 當(dāng)vue頁(yè)面路由跳轉(zhuǎn)到下一個(gè)頁(yè)面時(shí),上一個(gè)頁(yè)面的onresize方法會(huì)繼續(xù)執(zhí)行
【造成這個(gè)問(wèn)題的原因是因?yàn)関ue是單頁(yè)面應(yīng)用,echarts中的操作都是基于window,當(dāng)然也可以使用window.removeEventListener在下一個(gè)頁(yè)面刪除綁定的方法】
點(diǎn)擊查看window.removeEventListener使用注意點(diǎn)
3.實(shí)現(xiàn)在div使用onresize方法
github項(xiàng)目地址,喜歡的小伙伴給個(gè)star,謝謝
實(shí)現(xiàn)原理:在div上實(shí)現(xiàn)類似window的onresize 監(jiān)聽(tīng),這樣既能實(shí)現(xiàn)圖表的自適應(yīng),也不會(huì)因?yàn)轫?yè)面跳轉(zhuǎn)之后繼續(xù)執(zhí)行三個(gè)頁(yè)面的onresize 方法
實(shí)現(xiàn)方法:
引入esresize.js(文末貼上代碼)

在div上綁定對(duì)應(yīng)onresize 方法

優(yōu)點(diǎn):
- 可以根據(jù)窗口大小實(shí)現(xiàn)自適應(yīng)
- 頁(yè)面跳轉(zhuǎn)不會(huì)執(zhí)行上次操作
- 多個(gè)方法不會(huì)覆蓋
缺點(diǎn):暫無(wú)發(fā)現(xiàn)(如有問(wèn)題,歡迎各位補(bǔ)充)
文章參考:JS監(jiān)聽(tīng)div的resize事件
esresize.js代碼
var EleResize = {
_handleResize: function (e) {
var ele = e.target || e.srcElement
var trigger = ele.__resizeTrigger__
if (trigger) {
var handlers = trigger.__z_resizeListeners
if (handlers) {
var size = handlers.length
for (var i = 0; i < size; i++) {
var h = handlers[i]
var handler = h.handler
var context = h.context
handler.apply(context, [e])
}
}
}
},
_removeHandler: function (ele, handler, context) {
var handlers = ele.__z_resizeListeners
if (handlers) {
var size = handlers.length
for (var i = 0; i < size; i++) {
var h = handlers[i]
if (h.handler === handler && h.context === context) {
handlers.splice(i, 1)
return
}
}
}
},
_createResizeTrigger: function (ele) {
var obj = document.createElement('object')
obj.setAttribute('style',
'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;')
obj.onload = EleResize._handleObjectLoad
obj.type = 'text/html'
ele.appendChild(obj)
obj.data = 'about:blank'
return obj
},
_handleObjectLoad: function (evt) {
this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize)
}
}
if (document.attachEvent) { // ie9-10
EleResize.on = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners
if (!handlers) {
handlers = []
ele.__z_resizeListeners = handlers
ele.__resizeTrigger__ = ele
ele.attachEvent('onresize', EleResize._handleResize)
}
handlers.push({
handler: handler,
context: context
})
}
EleResize.off = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners
if (handlers) {
EleResize._removeHandler(ele, handler, context)
if (handlers.length === 0) {
ele.detachEvent('onresize', EleResize._handleResize)
delete ele.__z_resizeListeners
}
}
}
} else {
EleResize.on = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners
if (!handlers) {
handlers = []
ele.__z_resizeListeners = handlers
if (getComputedStyle(ele, null).position === 'static') {
ele.style.position = 'relative'
}
var obj = EleResize._createResizeTrigger(ele)
ele.__resizeTrigger__ = obj
obj.__resizeElement__ = ele
}
handlers.push({
handler: handler,
context: context
})
}
EleResize.off = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners
if (handlers) {
EleResize._removeHandler(ele, handler, context)
if (handlers.length === 0) {
var trigger = ele.__resizeTrigger__
if (trigger) {
trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize)
ele.removeChild(trigger)
delete ele.__resizeTrigger__
}
delete ele.__z_resizeListeners
}
}
}
}
export {EleResize}
到此這篇關(guān)于vue使用echarts圖表自適應(yīng)的幾種解決方案的文章就介紹到這了,更多相關(guān)vue使用echarts圖表自適應(yīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element-ui?form表單的動(dòng)態(tài)rules校驗(yàn)功能實(shí)現(xiàn)
在vue項(xiàng)目中,有時(shí)候可能會(huì)用到element-ui?form表單的動(dòng)態(tài)rules校驗(yàn),這篇文章主要介紹了element-ui form表單的動(dòng)態(tài)rules校驗(yàn),我們可以巧妙的運(yùn)用element-ui form表單里面form-item的校驗(yàn)規(guī)則來(lái)處理,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Vue前端登錄token信息驗(yàn)證功能實(shí)現(xiàn)
最近公司新啟動(dòng)了個(gè)項(xiàng)目,用的是vue框架在做,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)token登錄驗(yàn)證的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
vue:axios請(qǐng)求本地json路徑錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了vue:axios請(qǐng)求本地json路徑錯(cuò)誤問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
vue3中vite的@路徑別名與path中resolve實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于vue3中vite的@路徑別名與path中resolve的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02
vuex + keep-alive實(shí)現(xiàn)tab標(biāo)簽頁(yè)面緩存功能
這篇文章主要介紹了vuex + keep-alive實(shí)現(xiàn)tab標(biāo)簽頁(yè)面緩存功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Vue保持用戶登錄狀態(tài)(各種token存儲(chǔ)方式)
本文主要介紹了Vue保持用戶登錄狀態(tài)(各種token存儲(chǔ)方式),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
vue-element的select下拉框賦值實(shí)例
這篇文章主要介紹了vue-element的select下拉框賦值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
vue中動(dòng)態(tài)修改animation效果無(wú)效問(wèn)題詳情
這篇文章主要介紹了vue中動(dòng)態(tài)修改animation效果無(wú)效問(wèn)題詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
Vue之解決Echarts組件使用ID不能復(fù)用的問(wèn)題
這篇文章主要介紹了Vue之解決Echarts組件使用ID不能復(fù)用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

