zoukankan      html  css  js  c++  java
  • vue 监听窗体变化 echarts自适应

    vue 监听窗体变化

    监听窗体变化

    这个是什么意思呢,就是当浏览器窗体发生变化的时候会触发。主要用在布局计算,比如说分辨率不一样,可能高度宽度需要重新计算渲染。在一个就是很典型的echarts报表,当我们的浏览器缩放发生变化,或者是电脑分辨率发生变化之后,echarts报表大小位置啥的是不会发生变化的,但是这个时候就会出现问题,所以说就可以使用这个方法监听浏览器窗体变化,来重新渲染echarts报表,使它不至于错版。

    就像下面这张图,如果不适应,当浏览器缩放echarts报表就是单纯的跟浏览器大小缩放(左),而自适应了之后,或根据浏览器缩放重新渲染合适的大小(右)。

    window.onresize = () => {
      return (() => {
         // 这里写当窗体变化的业务逻辑
         // ...
      })()
    }
    

    窗体变化echarts报表重新渲染问题

    当窗体变化之后,echarts会搓板,不能自适应,需要处理,下面是处理的方式。

    首先需要一个js文件 a.js,把他放到 public 文件夹 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%;  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}
    

    然后在 echarts 组件中引用一下 a.js 文件

     import {EleResize} from '../../public/js/a.js'
    

    然后设置重新渲染

    // 改变屏幕大小图表重新加载
    var resizeDiv = document.getElementById(id) // 这个id是渲染echarts的div的id
    var listener = () => {
      this.echarts.resize()
    }
    EleResize.on(resizeDiv, listener)
    this.echarts.clear()
    this.echarts.setOption(option);
    

    当浏览器缩放调整的时候,echarts报表会重新根据大小渲染合适的位置和大小

    效果完成!

  • 相关阅读:
    蓝桥杯基础练习 杨辉三角形
    蓝桥杯基础练习 回文数 特殊的数字
    普及图论三题 P1807 P1113 P 4017
    P3916 图的遍历
    [转载][总结]图论入门:建图,DFS,BFS,拓扑排序
    如何转载博客园的文章
    P1892 [BOI2003]团伙
    P1621 集合
    [模板]线性筛素数(欧拉筛)
    P5076 普通二叉树(简化版)
  • 原文地址:https://www.cnblogs.com/wjw1014/p/13856619.html
Copyright © 2011-2022 走看看