首页 > 其他分享 >浏览器全屏时 echarts.resize() 无效/滞后解决办法

浏览器全屏时 echarts.resize() 无效/滞后解决办法

时间:2023-07-10 15:24:52浏览次数:44  
标签:color myChart window 全屏 echarts resize

前言

  • echarts 在 dom 上初始化时使用 echarts. init ,这个 dom 是实例容器,一般是一个具有高宽的 DIV 元素。
  • 不能在单个容器上初始化多个 ECharts 实例。 
  • echartsInstance.resize 改变图表尺寸,在容器大小发生改变时需要手动调用
  • echarts.resize() 的核心是监听 id=“myChart” 的那个 div 的尺寸变化,在其发生变化后调用 echarts.resize()。

 一、 布局+样式

因为后面要测试高度变化,所以设定了高度 chartHeight 为变量。(直接写 height:100% 图表不显示)

<template>
  <div id="myChart" :style="{ height: chartHeight + 'px' }"></div>
</template>

<style>
body {
  background-color: lightblue;
}

#myChart {
  width: 90%;
  background-color: lightgoldenrodyellow;
}
</style>

二、js基本代码(vue3 写法)

初始化 mychart 的高度,初始化一个柱状图:

var myChart = null;
const chartHeight = ref(0);
updateChartHeight();

function updateChartHeight() {
  chartHeight.value = window.innerHeight * 0.9;
}

function initEcharts() {
  myChart = echarts.init(document.getElementById('myChart'));
  myChart.setOption({
    title: {
      text: 'ECharts 入门示例'
    },
    tooltip: {},
    xAxis: {
      data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
    },
    yAxis: {},
    series: [
      {
        name: '销量',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
      }
    ]
  });
}

三、监听 echarts 容器尺寸变化(以下简称div)

1. 没有全屏时,div 宽度、高度发生变化

这个很好办,直接用   window.addEventListener("resize", function())  监听就可以。

function windowResize() {
  window.addEventListener("resize", () => {
    updateChartHeight();
    console.log('%c window.innerWidth', "color:blue", window.innerWidth);
    console.log('%c window.innerHeight', "color:blue", window.innerHeight);
    myChart.resize();//改变图表尺寸
  })
}

  效果如图:

 2. 全屏时,div 高度发生变化

(解决了高度变化时echarts图表不能正确自适应问题后可知,从非最大化-->全屏,宽度、高度均发生变化,且均无问题。)

 浏览器从“最大化--> 全屏”时,宽度不发生变化,只有高度变化,如图:

 从理论上讲,浏览器按 F11 进入的全屏既然可以被 window.addEventListener("resize")监听到,id="myChart" 的div尺寸也变化了,myChart.resize() 也调用了,那么图表就该正常自适应。

但是由实际情况可知,图表的高度变化和div的高度变化不是同步的,而是滞后了。从非全屏-->全屏,图表没变大;从全屏-->非全屏,图表是全屏时的尺寸。

解决办法:

1. 把 div 的高度单位改成 vh: https://juejin.cn/post/7083382244307370014

<div id="myChart"></div>

#myChart {
  width: 90%;
  height: 80vh;
  background-color: lightgoldenrodyellow;
}

 2. 用 ResizeObserver 监听DOM元素尺寸的变化,在监测到变化后调用 myChart.resize();

function windowResize() {
  window.addEventListener("resize", () => {
    updateChartHeight();//这里只修改div高度
    console.log('%c window.innerWidth', "color:blue", window.innerWidth);
    console.log('%c window.innerHeight', "color:blue", window.innerHeight);
  })
}

function watchEchart() {
  const myChartSize = document.getElementById("myChart");
  var ro = new ResizeObserver(entries => {
    for (let entry of entries) {
      const cr = entry.contentRect;
      console.log('myChart Element:', entry.target);
      console.log(`%c myChart Element  w:${cr.width}px  h:${cr.height}px`, "color:red");
      
       myChart.resize();//监测到div尺寸变化后调用
    }
  });
  ro.observe(myChartSize);
}

 用 ResizeObserver 解决全部代码如下(展开查看):

<script setup>
import { ref, onMounted } from 'vue';
import * as echarts from 'echarts';

var myChart = null;
const chartHeight = ref(0);
updateChartHeight();

onMounted(() => {
  initEcharts();
  windowResize();
  watchEchart();
})
function updateChartHeight() {
  chartHeight.value = window.innerHeight * 0.9;
}

function initEcharts() {
  myChart = echarts.init(document.getElementById('myChart'));
  myChart.setOption({
    title: {
      text: 'ECharts 入门示例'
    },
    tooltip: {},
    xAxis: {
      data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
    },
    yAxis: {},
    series: [
      {
        name: '销量',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
      }
    ]
  });
}

function windowResize() {
  window.addEventListener("resize", () => {
    updateChartHeight();//这个必须放在这里
    console.log('%c window.innerWidth', "color:blue", window.innerWidth);
    console.log('%c window.innerHeight', "color:blue", window.innerHeight);
    // console.log("%c windowResize chartHeight ", "color:blue", chartHeight.value);
  })
}

function watchEchart() {
  const myChartSize = document.getElementById("myChart");
  var ro = new ResizeObserver(entries => {
    for (let entry of entries) {
      const cr = entry.contentRect;
      // console.log('myChart Element:', entry.target);
      console.log(`%c myChart Element  w:${cr.width}px  h:${cr.height}px`, "color:red");
      chartResize();
    }
  });
  ro.observe(myChartSize);
}

function chartResize() {
  myChart.resize();
}

</script>

<template>
  <div id="myChart" :style="{ height: chartHeight + 'px' }"></div>
</template>

<style>
body {
  background-color: lightblue;
}

#myChart {
  width: 90%;
  background-color: lightgoldenrodyellow;
}
</style>
View Code

 效果图如下:

 

标签:color,myChart,window,全屏,echarts,resize
From: https://www.cnblogs.com/sunshine233/p/17540934.html

相关文章

  • Delphi12支持全屏显示启动界面的styles.xml
    <resourcesxmlns:android="http://schemas.android.com/apk/res/android"><stylename="AppTheme"parent="@android:style/Theme.Material.Light.NoActionBar"><itemname="android:navigationBarColor&qu......
  • 微信小程序taro-react-echarts使用dataZoom问题
    taro微信小程序中使用taro-react-echarts展示图表数据,因为数据量大,需要使用dataZoom来左右滑动图表。实现效果解决首先在echarts的options中添加xAxis:...yAxis:...dataZoom:[{type:'inside',start:0,end:data.time?.length>20?(20/data.time......
  • echarts 在使用dataZoom时报错,Cannot read properties of undefined (reading 'type')
    今天我再vue中使用柱状图拖动时,一直报错Cannotreadpropertiesofundefined(reading'type')。原因如下,我使用了myChart来接收数据,当myChart使用的是vue的ref或者reactive来命名的变量,如果这样子命名就会报上述错误。myChart=echarts.init(statistical......
  • 小程序使用echarts(二)
    一、在根据(一)进行使用时出现得问题 1、按照教程图表依旧不显示2、图表不跟随页面滑动二、解决办法(1)不显示1、应当引入插件2、查看父元素是否存在display:flex;属性;以及height:100%类似属性;也不能使用float(2)滑动1、不能存在(1)2中的display:flex;属性,以及图表的父元素不......
  • iframe嵌套其它网站页面 全屏设置
    背景:今天在使用iframe时,发现嵌套页面中有个【全屏】功能,不好使,查了一下,发现iframe还有1个属性allowfullscreen设置,可以设置是否支持全屏,默认是false,现在把iframe的基础属性整理一下。iframe基本属性通常我们使用iframe主要设置 src,宽、高,是否滚动,其实有一些不常用的属性<if......
  • echarts,时间轴折线图,tooltip相关
    其中,data数组是通过echarts工具由表格直接转换得到:https://echarts.apache.org/zh/spreadsheet.html第一部分:datadata中的长串是由表格得到,由日期转为的时间戳形式,比如‘1636905600000’,是excel中的【2021/11/150:00:00】通过公示【=((C3-70*365-19)*86400-8*3600)*1000】得到1......
  • python 中pyecharts模块用法
    https://zhuanlan.zhihu.com/p/111330795#:~:text=bar1%3D(Bar().add_xaxis(['1月'%2C'2月'%2C'3月'%2C'4月'%2C'5月'%2C'6月'%2C'7月'%2C'8月'%2C'9月'%2C'10月'%2C'11月......
  • 解决vmware的fedora34或者部分linux系统不能全屏的问题
    参考:https://manjaro.site/how-to-enable-full-screen-mode-fedora-34-on-vmware-workstation/如果安装了open-vm-tools后,vmware内的linux系统依然不能全屏,可能是因为系统使用的不是传统的XWindowSystem,而是XWayland,open-vm-tools对XWanyland的支持有时侯会有问题。解决方法:......
  • echarts超出外部div
    问题产生:先渲染dom后渲染数据解决方法:1可以延时渲染2监听resize事件that=this;window.addEventListener('resize',()=>{that.echartsA.resize();});window.removeEventListener('resize',that.echartsA.resize());......
  • HTML5中如何上传Resize后的图片
    参考资料:不依赖form标签,而是自己定义FormData上传数据,文件被编码为一个Blob或File对象:https://developer.mozilla.org/en-US/docs/Web/Guide/Using_FormData_Objects如何用jquery上传FormData:http://stackoverflow.com/questions/9622901/how-to-upload-a-file-using-jquery-ajax-a......