vue左右div结构手动拉伸并且echarts图表根据拉伸宽高自适应
需求:
- 左右结构的div,可以根据数据抬起按下进行拉伸修改容器宽度的操作
- 给左右结构某一图表设置拉伸自适应
- 左右结构都设置个最小宽度,只能到一定区域内拉伸
- 解决echarts的bug(重复加载chart实例):[ECharts] There is a chart instance already initialized on the dom.
- 解决浏览器兼容性报错问题

5.解决echarts在flex布局下宽高不显示问题
1.效果

2.左右结构布局
左右布局给定一个基础的宽度,并且给最小宽度,min-width,如果不给最小宽度,那么拉伸的时候会拉到底,到时候其他元素挤压或者是隐藏了就不太好
<template><div class="content-box"><div class="container"><div class="container_box"><div class="left" :style="{ width: leftWidth + 'px' }">左侧内容区</div><div class="center"></div><div class="right" :style="{ width: rightWidth + 'px' }"><div class="right_top">右上内容区</div><!-- echarts图标区 --><div id="echartsWarp"><div id="myChat" :style="{ width: '100%', height: '100%' }"></div></div></div></div></div></div>
</template><script>
export default {data() {return {isResizing: false,containerWidth: 600,leftWidth: 300,rightWidth: 400};},mounted() {},methods: {}
};
</script><style lang="scss" scoped>
.container_box {display: flex;height: 500px;width: 100%;.left {min-width: 300px;background-color: #ddd;}.center {min-width: 10px;height: 100%;background-color: #c7adad;cursor: col-resize;}.right {background-color: #d3e2d1;flex: 1;min-width: 500px;display: flex;flex-direction: column;.right_top {height: 60px;}#echartsWarp {height: calc(100vh - 300px);}}
}
</style>
效果如下:

3.拉伸效果实现
- 首先下载echarts,不用多说,下载最新版就行
npm install echarts -S
2.局部导入和全局导入,根据自己的需求来
局部导入:在需要用到的页面导入即可,为了各位看的更明白我用的是局部导入的方式
import * as echarts from 'echarts';
全局导入:在main.js文件导入挂载
import echarts from 'echarts';
Vue.prototype.$echarts = echarts;
全局导入后在页面使用:
this.$echarts.方法名
3.在中间灰色区域添加个鼠标按下事件
<template><div class="content-box"><div class="container"><div class="container_box"><div class="left" :style="{ width: leftWidth + 'px' }">左侧内容区</div><div class="center" @mousedown="onMouseDown"></div><div class="right" :style="{ width: rightWidth + 'px' }"><div class="right_top">右上内容区</div><!-- echarts图标区 --><div id="echartsWarp"><div id="myChat" :style="{ width: '100%', height: '100%' }"></div></div></div></div></div></div>
</template><script>
export default {data() {return {isResizing: false,containerWidth: 600,leftWidth: 200,rightWidth: 400};},mounted() {},methods: {onMouseDown() {// 鼠标按下时开始拖动this.isResizing = true;// 监听鼠标移动事件document.addEventListener('mousemove', this.onMouseMove);// 监听鼠标松开事件document.addEventListener('mouseup', this.onMouseUp);},onMouseMove(event) {if (this.isResizing) {// 计算鼠标在容器中的位置const containerRect = this.$el.getBoundingClientRect();const mouseX = event.clientX - containerRect.left;// 更新左侧和右侧容器的宽度this.leftWidth = mouseX;this.rightWidth = this.containerWidth - mouseX;}},onMouseUp() {// 鼠标松开时停止拖动this.isResizing = false;// 移除监听鼠标移动和松开事件document.removeEventListener('mousemove', this.onMouseMove);document.removeEventListener('mouseup', this.onMouseUp);}}
};
</script><style lang="scss" scoped>
.container_box {display: flex;height: 500px;width: 100%;.left {min-width: 300px;background-color: #ddd;}.center {min-width: 10px;height: 100%;background-color: #c7adad;cursor: col-resize;}.right {background-color: #d3e2d1;flex: 1;min-width: 500px;display: flex;flex-direction: column;.right_top {height: 60px;}#echartsWarp {height: calc(100vh - 300px);}}
}
</style>
效果:

3.添加echarts图表
如果是按照以前的办法,不能实现自适应的哈,只能说把图标显示出来了,但是在拉伸的时候折线图不能自适应。
解决echarts的bug(重复加载chart实例)关键代码如下:
if (//判断是否存在echarts实例化对象,如果存在则销毁this.chartsDom != null &&this.chartsDom != '' &&this.chartsDom != undefined) {this.chartsDom.dispose();}
<template><div class="content-box"><div class="container"><div class="container_box"><div class="left" :style="{ width: leftWidth + 'px' }">左侧内容区</div><div class="center" @mousedown="onMouseDown"></div><div class="right" :style="{ width: rightWidth + 'px' }"><div class="right_top">右上内容区</div><!-- echarts图标区 --><div id="echartsWarp"><div id="myChat" :style="{ width: '100%', height: '100%' }"></div></div></div></div></div></div>
</template><script>
import * as echarts from 'echarts';
export default {data() {return {isResizing: false,containerWidth: 600,leftWidth: 200,rightWidth: 400};},mounted() {this.echartsDom();},methods: {echartsDom() {// 基于准备好的dom,初始化echarts实例this.$nextTick(_ => {if (//判断是否存在echarts实例化对象,如果存在则销毁this.chartsDom != null &&this.chartsDom != '' &&this.chartsDom != undefined) {this.chartsDom.dispose();}const dom = document.getElementById('myChat');dom.style.width = dom.parentNode.parentNode.clientWidth + 'px';this.chartsDom = echarts.init(dom); //创建echarts实例化对象this.chartsDom.clear(); //清空画布数据//设置对应的参数,标题,x轴,y轴坐标,以及显示的数据let options = {xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{data: [820, 932, 901, 934, 1290, 1330, 1320],type: 'line',smooth: true}]};this.chartsDom.setOption(options);this.chartsDom.resize();setTimeout(function() {window.addEventListener('resize', () => {this.chartsDom.resize();});}, 200);});},onMouseDown() {// 鼠标按下时开始拖动this.isResizing = true;// 监听鼠标移动事件document.addEventListener('mousemove', this.onMouseMove);// 监听鼠标松开事件document.addEventListener('mouseup', this.onMouseUp);},onMouseMove(event) {if (this.isResizing) {// 计算鼠标在容器中的位置const containerRect = this.$el.getBoundingClientRect();const mouseX = event.clientX - containerRect.left;// 更新左侧和右侧容器的宽度this.leftWidth = mouseX;this.rightWidth = this.containerWidth - mouseX;}},onMouseUp() {// 鼠标松开时停止拖动this.isResizing = false;// 移除监听鼠标移动和松开事件document.removeEventListener('mousemove', this.onMouseMove);document.removeEventListener('mouseup', this.onMouseUp);}}
};
</script><style lang="scss" scoped>
.container_box {display: flex;height: 500px;width: 100%;.left {min-width: 300px;background-color: #ddd;}.center {min-width: 10px;height: 100%;background-color: #c7adad;cursor: col-resize;}.right {background-color: #d3e2d1;flex: 1;min-width: 500px;display: flex;flex-direction: column;.right_top {height: 60px;}#echartsWarp {height: calc(100vh - 300px);}}
}
</style>
效果:

4.解决echarts图表没有根据拉伸自适应问题(完整代码)
1.下载element-resize-detector
npm install element-resize-detector -S
2.局部导入
var elementResizeDetectorMaker = require('element-resize-detector');
3.完整代码如下:
<template><div class="content-box"><div class="container"><div class="container_box"><div class="left" :style="{ width: leftWidth + 'px' }">左侧内容区</div><div class="center" @mousedown="onMouseDown"></div><div class="right" :style="{ width: rightWidth + 'px' }"><div class="right_top">右上内容区</div><div id="echartsWarp"><div id="myChat" :style="{ width: '100%', height: '100%' }"></div></div></div></div></div></div>
</template>
<script>
//elementResizeDetectorMaker,该全局函数是使元素调整大小检测器实例的maker函数。
var elementResizeDetectorMaker = require('element-resize-detector');
import * as echarts from 'echarts';
export default {name: 'Index',data() {return {isResizing: false,containerWidth: 600,leftWidth: 200,rightWidth: 400,chartsDom: null};},mounted() {this.changeEchartsWidthApi();},methods: {//监听盒子大小,改变echarts宽度,实现echarts自适应changeEchartsWidthApi() {// 创建实例,无参数var erd = elementResizeDetectorMaker(); //使用默认选项(将使用基于对象的方法)// 创建实例带参数// 使用基于超快速滚动的方法。// 这是推荐的策略。var erdUltraFast = elementResizeDetectorMaker({strategy: 'scroll',callOnAdd: true, //callOnAdd选项,用于确定在添加侦听器时是否应调用它们。默认为true。//如果为true,则确保在添加侦听器后将对其进行调用。如果为false,则在添加侦听器时将不保证其//被调用(不会阻止其被调用)debug: true});//监听class为staticNextMain的元素 大小变化var self = this;//侦听元素的调整大小事件,并使用元素作为调整大小事件的参数来调用侦听器函数。传递给函数的选项将//覆盖实例选项erd.listenTo(document.getElementById('echartsWarp'), function(element) {self.ChartsApi();});},ChartsApi() {// 基于准备好的dom,初始化echarts实例this.$nextTick(_ => {if (//判断是否存在echarts实例化对象,如果存在则销毁this.chartsDom != null &&this.chartsDom != '' &&this.chartsDom != undefined) {this.chartsDom.dispose();}const dom = document.getElementById('myChat');dom.style.width = dom.parentNode.parentNode.clientWidth + 'px';this.chartsDom = echarts.init(dom); //创建echarts实例化对象this.chartsDom.clear(); //清空画布数据//设置对应的参数,标题,x轴,y轴坐标,以及显示的数据let options={xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{data: [820, 932, 901, 934, 1290, 1330, 1320],type: 'line',smooth: true}]}this.chartsDom.setOption(options);this.chartsDom.resize();setTimeout(function() {window.addEventListener('resize', () => {this.chartsDom.resize();});}, 200);});},onMouseDown() {// 鼠标按下时开始拖动this.isResizing = true;// 监听鼠标移动事件document.addEventListener('mousemove', this.onMouseMove);// 监听鼠标松开事件document.addEventListener('mouseup', this.onMouseUp);},onMouseMove(event) {if (this.isResizing) {// 计算鼠标在容器中的位置const containerRect = this.$el.getBoundingClientRect();const mouseX = event.clientX - containerRect.left;// 更新左侧和右侧容器的宽度this.leftWidth = mouseX;this.rightWidth = this.containerWidth - mouseX;}},onMouseUp() {// 鼠标松开时停止拖动this.isResizing = false;// 移除监听鼠标移动和松开事件document.removeEventListener('mousemove', this.onMouseMove);document.removeEventListener('mouseup', this.onMouseUp);}}
};
</script>
<style lang="scss" scoped>
.container_box {display: flex;height: 500px;width: 100%;.left {min-width: 300px;}.center {min-width: 10px;height: 100%;background-color: #c7adad;cursor: col-resize;}.right {flex: 1;min-width: 500px;display: flex;flex-direction: column;.right_top {height: 60px;}#echartsWarp {height: calc(100vh - 300px);}}
}
</style>
文章到此结束,希望对你有所帮助~
相关文章:
vue左右div结构手动拉伸并且echarts图表根据拉伸宽高自适应
需求: 左右结构的div,可以根据数据抬起按下进行拉伸修改容器宽度的操作给左右结构某一图表设置拉伸自适应左右结构都设置个最小宽度,只能到一定区域内拉伸解决echarts的bug(重复加载chart实例):[ECharts] …...
开发工具Eclipse的使用
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Eclipse是什么 二.使用Eclipse的…...
DrawerLayout布局使用教程Android侧边栏导航完全指南:创建简单实用的导航抽屉
导航抽屉(侧边栏)在现代移动应用中扮演着关键角色,提供了流畅的用户导航体验。本文将带您从头开始,逐步创建一个基本的 Android 侧边栏导航示例,为您的应用增添更多交互魅力。 1. 创建新的 Android 项目 首先&#x…...
Dynamics 365 实体快速创建功能启用
这里我会先用例子讲快速创建,包含了字段创建等内容。希望直接了解配置过程的,可以根据目目录跳转查看。 1 例子 我们这里创建了两个实体,学生和选择的科目。它们的关系是一个学生可以选择多个科目,即学生和科目选择是一对多关系。所以我们在选择的科目中创建了一个学生的…...
Mybatis三剑客(一)在springboot中自动生成Mybatis【generator】
1、pom.xml中新增plugin <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.7</version><configuration><overwrite>true</overwrite><…...
【LeetCode 热题 100】图论 专题(bfs,拓扑排序,Trie树 字典树)
from: https://leetcode.cn/studyplan/top-100-liked/ bfs 具有 边权为1 的最短路性质 拓扑排序,入度 Trie树, 高效存储 字符串【见鬼,不知道为什么写错,需要掌握熟练度】 文章目录 200. 岛屿数量【dfs / bfs】994. 腐…...
Jmeter压测实战:Jmeter二次开发之自定义函数
目录 1 前言 2 开发准备 3 自定义函数核心实现 3.1 新建项目 3.2 继承实现AbstractFunction类 3.3 最终项目结构 4 Jmeter加载扩展包 4.1 maven构建配置 4.2 项目打包 4.3 Jmeter加载扩展包 5 自定义函数调用调试 5.1 打开Jmeter函数助手,选择自定义函数…...
在python中使用nvidia的VPF库对RTSP流进行硬解码并使用opencv进行显示
解码并处理视频流的多线程应用 随着视频处理技术的不断发展,越来越多的应用需要对视频流进行解码和处理。在本文中,我们将介绍一个基于Python的多线程应用程序,该应用程序可以解码并处理多个RTSP视频流,同时利用GPU加速࿰…...
C++中using namespace std的作用记录
using namespace std;这句代码的作用是引入std命名空间,使得程序可以直接使用std命名空间下的标识符,而不需要加上std::前缀。 在C中,标识符被组织在不同的命名空间中,以避免命名冲突。最常见的命名空间是std,它包含了C标准库中的所有标识符,如cout、vector、string等。 默认…...
【TX 企业微信私有化历史版本 API 信息泄露】
目录 影响版本 复现过程 修复方式 影响版本 影响私有化部署: toB toG版微信 2.5.x 版本 2.6.930000 版本以下 危险程度:高危。攻击者可以进行获取企业的部门信息,员工信息,如权限较高包括应用获取,记录文件等等均…...
腾讯云轻量应用服务器镜像应用模板清单大全
腾讯云轻量应用服务器支持多种应用模板镜像,Windows和Linux镜像模板都有,如:宝塔Linux面板腾讯云专享版、WordPress、WooCommerce、LAMP、Node.js、Docker CE、K3s、宝塔Windows面板和ASP.NET等应用模板镜像,腾讯云服务器网分享腾…...
C语言链表操作
目录 链表基本操作 删除重复元素 查找倒数第N个节点 查找中间节点 约瑟夫环 循环链表 合并有序链表 逆置链表 逆置链表(双向链表) 链表基本操作 //linklist.c#include "linklist.h" #include <stdlib.h>struct node *head NULL; struct node *tail…...
详解拦截器和过滤器
目录 代码演示过滤器Demo拦截器Demo 过滤器自定义拦截器配置拦截器过滤器执行原理多个过滤器的执行顺序 拦截器自定义拦截器注册拦截器1)注册拦截器2)配置拦截的路径3)配置不拦截的路径 多个拦截器的执行顺序 过滤器和拦截器的区别 代码演示 …...
关于`IRIS/Caché`进程内存溢出解决方案
文章目录 关于IRIS/Cach进程内存溢出解决方案 描述原因相关系统变量$ZSTORAGE$STORAGE 什么情况下进程内存会变化?内存不足原理解决方案 关于 IRIS/Cach进程内存溢出解决方案 描述 在IRIS/Cach中,进程内存溢出错误是指一个进程(例如运行中的…...
构建Docker容器监控系统(cadvisor+influxDB+grafana)
目录 一、部署 1、安装docker-cd 2、阿里云镜像加速 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、创建granafa容器 一、部署 1、安装docker-cd [rootlocalhost ~]# iptables -F [rootlocalhost ~]# setenforce 0 setenforce: SELi…...
最强自动化测试框架Playwright(17)- 模拟接口
模拟接口 介绍 Web API 通常作为 HTTP 终结点实现。Playwright提供了API来模拟和修改网络流量,包括HTTP和HTTPS。页面所做的任何请求,包括 XHR 和获取请求,都可以被跟踪、修改和模拟。使用Playwright,您还可以使用包含页面发出的…...
Python爬虫——requests_get请求
import requests# ?可加可不加 url http://www.baidu.com/s?headers {Cookie: ,User-Agent: , }data {wd: 北京 } # params 参数 response requests.get(urlurl, paramsdata, headersheaders)content response.text print(content)总结: 参数使用params传递…...
【EI复现】一种建筑集成光储系统规划运行综合优化方法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
C++11 异步与通信之 std::async
概念简介 std::async 异步运行一个函数,将返回值保存在std::future中。 含有2个策略参数: launch::deferred 延迟执行,当调用wait()和get()时,任务才会被运行,且不创建线程;launch::async : 创建线程并执…...
影视站用什么cms好?
影视站是指用于提供电影、电视剧、综艺等视频资源的网站。由于影视站需要频繁更新大量的内容,因此使用一个好的内容管理系统(CMS)非常重要。以下是几个受欢迎的影视站CMS的介绍。最新下载地址:roulang WordPress WordPress是目前…...
三月七小助手:5步掌握崩坏星穹铁道全自动游戏助手终极指南
三月七小助手:5步掌握崩坏星穹铁道全自动游戏助手终极指南 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否厌倦了每天重复的清体力、做日常、领奖励…...
SVG、XML 及其生态技术全景指南:从基础规范到工程实践
XML(Extensible Markup Language)并非单一工具,而是一套可扩展的元语言规范,其核心价值在于定义结构化数据的语法框架。 基于 XML 的各类应用标准(XML-based applications)在 Web、出版、科学计算、工业控…...
SpringBoot 全局异常处理 + 参数校验,企业级规范写法(代码直接复制)
一、前言 在 SpringBoot 前后端分离项目里,这两个东西几乎是必写基础: 1.接口参数乱传,直接报错到前端 2.异常满天飞,前端各种无法解析 3.每个接口都写 try-catch,代码又臭又长 4.参数校验逻辑重复,维护成…...
RHEL 7.3 (x86_64) 更换国内 YUM 源
兴趣原因,在本地部署了一台VBox虚拟机,安装了Redhat7.3版本,由于无法正常使用yum源,于是便修改成国内的源,在网上找了搜索了许多的更换教程,略有繁琐,现将我自己的更换方法记录如下,…...
ANIMATEDIFF PRO广告制作:智能模板批量生成技术
ANIMATEDIFF PRO广告制作:智能模板批量生成技术 电商大促期间,广告视频制作需求激增,传统制作方式难以应对海量内容需求。ANIMATEDIFF PRO通过智能模板技术,让广告视频制作效率提升10倍以上。 1. 智能广告制作的新突破 电商大促期…...
为什么Alfred Workflows能极大提升你的工作效率?7个真实案例分享
为什么Alfred Workflows能极大提升你的工作效率?7个真实案例分享 【免费下载链接】alfred-workflows Collection of Alfred workflows 项目地址: https://gitcode.com/gh_mirrors/alfr/alfred-workflows Alfred Workflows是一款强大的效率工具集合࿰…...
国标GB28181平台EasyGBS筑牢智慧交通视频安全技术底座
传统交通安防系统往往面临设备异构难以统一管理、视频共享存在安全隐患、应急处置响应迟缓等痛点。作为深耕视频监控领域的国标GB28181平台,EasyGBS创新性地将国密GB35114安全能力全面融入产品架构,为智慧交通打造了一个“可视、可控、可管、可信”的一体…...
Antv L7 + Mapbox 实现3D地图可视化:从基础配置到高级应用
1. 为什么选择Antv L7 Mapbox做3D地图 第一次接触3D地图可视化时,我试过不少方案,最后发现Antv L7和Mapbox的组合最顺手。这个组合最大的优势是既能享受Mapbox强大的底图服务,又能用L7实现各种炫酷的数据可视化效果。 L7是阿里AntV团队推出的…...
My first article
12345...
Qwen3-32B大模型并发性能优化实战:从理论估算到压力测试
1. Qwen3-32B并发性能优化的核心挑战 第一次在8张A10显卡上部署Qwen3-32B模型时,我遇到了典型的"显存充足但吞吐量上不去"的困境。这个拥有320亿参数的大家伙,就像个挑食的巨人——给它喂FP16精度的数据时,单是加载模型就要吃掉64G…...
