vue2 实现echarts图表进入可视区域后再加载动画,以及 使用了resize之后,动画失效问题解决

embedded/2024/9/23 14:23:22/

Intersection Observer API 是一个现代的浏览器 API,用于监测一个或多个目标元素与其祖先元素或视窗(viewport)之间的交叉状态(intersection)的变化。它可以有效地监听元素是否进入或离开可视区域,从而实现一些懒加载、无限滚动、图表加载等需求。 

主要特点和用途:

  1. 懒加载(Lazy Loading):当页面中的某些元素在可视区域内时再加载它们,以提升页面加载速度和性能。

  2. 无限滚动(Infinite Scrolling):当滚动到页面底部时加载更多内容,实现无限滚动列表或分页加载。

  3. 图表加载:在图表或其他数据可视化组件进入可视区域时再触发加载动画或数据更新。

  4. 广告展示:监测广告是否被用户看到,从而统计广告的曝光量

javascript">使用方法:
1、创建 IntersectionObserver 实例:
var observer = new IntersectionObserver(callback, options);
callback 是一个回调函数,用于处理交叉状态的变化。
options 是一个配置对象,可以设置 root(祖先元素)、rootMargin(边界)、thresholds(阈值)等参数。2、观察目标元素:observer.observe(target);3、处理交叉状态变化:
var callback = function(entries, observer) {entries.forEach(entry => {if (entry.isIntersecting) {// 处理目标元素进入可视区域的逻辑} else {// 处理目标元素离开可视区域的逻辑}});
};4、停止观察:observer.unobserve(target);

 主要属性和方法:

  • isIntersecting:表示目标元素是否与根元素(root)或视窗(viewport)相交。
  • intersectionRatio:表示目标元素的可见比例,取值范围为 0 到 1。
  • root:观察器的根元素,即相对于该元素来计算交叉状态,默认为视窗。
  • rootMargin:边界,可以设置在计算交叉状态时扩展或缩小根元素的大小。
  • thresholds:阈值数组,用于指定交叉比例的阈值,当目标元素的交叉比例超过指定的阈值时触发回调。

Intersection Observer API 的主要优势在于它可以高效地监测大量元素的交叉状态变化,而无需频繁地监听滚动事件或手动计算元素位置,从而提升了性能和用户体验。

javascript">  mounted () {await this.getInitDataFun() //  数据this.$nextTick(() => {this.getEchartData() // 绘制图表})},methods: {// 获取数据 处理图表需要的datagetInitDataFun () {return new Promise(async (resolve, reject) => {........})},getEchartData () {const salesTrendDom = this.$refs.salesTrendRef //销售额const orderCustomerDom = this.$refs.orderCustomerRef //下单客户数趋势// 销售额if (salesTrendDom) {this.loadAnimationFun(salesTrendDom, 'salesTrendOption')}//下单客户数趋势if (orderCustomerDom) {this.loadAnimationFun(orderCustomerDom, 'orderCustomerOption')}},// 加载动画loadAnimationFun (dom, option) {let myChart = this.$echarts.init(dom)var observer = new IntersectionObserver((entries) => {entries.forEach((entry) => {if (entry.isIntersecting) {// 加载动画myChart.setOption(this[option])this.addLoadEvent(myChart.resize) //添加 监听屏幕缩放setTimeout(function () {// 使用了resize之后,动画失效,这是echarts5的bug,echarts4不会  动画在这里加就好了myChart.resize({animation: {duration: 1800,easing: 'ease-in-out'}})}, 1)// 停止观察图表observer.unobserve(entry.target)}})})// 观察图表元素observer.observe(myChart.getDom())},addLoadEvent (fn) {var old = window.onresizeif (typeof window.onresize != 'function') {//防止多个window.onresize   冲突  解决window.onresize = fn} else {window.onresize = function () {old()setTimeout(function () {//个别时候无法刷新echarts 延迟1MS  解决fn()}, 1)}}}
}


http://www.ppmy.cn/embedded/26743.html

相关文章

【会员单位】浙江晧月水务科技有限公司

中华环保联合会理事单位 水环境治理专业委员会副主任委员单位 公司成立于2018年3月14日,是专业研究废水处理业务的国家高新技术企业。 公司自主研发的脱硫废水“零排放”的技术,不仅适应性好,技术先进,智慧化程度高&#xff0c…

运行DeepSORT_YOLOv5_Pytorch时出现的问题

文章目录 前言问题1:Loaderyaml.FullLoader问题2:utils. -> yolov5.utils.问题3:np.float -> float问题4:np.int -> int问题5:ImportError: cannot import name time_synchronized from yolov5.utils.torch_u…

python Django 的内置权限系统或自定义模型来存储更复杂的角色和权限关系

在 Django 中,管理用户权限和角色通常涉及到使用 Django 的内置权限系统或自定义模型来存储更复杂的角色和权限关系。下面是一个基本的指南,说明如何在 Django 中为后台管理系统分配权限并将其保存在数据库中,同时结合 Vue.js 和 Element UI 作为前端框架。 后端(Django)…

芯片安全(security)

芯片安全包括什么 芯片安全是为了防止芯片数据和程序遭遇非法攻击和访问等导致数据错误或者信息泄露或者非正常运行? 比如指纹信息被泄露;PC被植入非法挖矿程序;非法修改ddr中的数据等。 1.在子系统级别看到的axprot[1]和nsaid(non-securit…

CSS3(响应式布局)

#过渡# 属性连写: transition: width 2s linear 1s; //前一个时间用于表示过渡效果持续时间,后一个时间用于表示过渡效果的延迟。 #转换# #2D转换# 和 #3D转换# 注意:其中angle对应单位为:deg #圆角# #边框# …

分段函数拟合-施加分段点连续约束条件|【Matlab源码+视频介绍】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

用于复杂任务的 AI 编码引擎:多文件多步骤拆解实现 | 开源日报 No.239

plandex-ai/plandex Stars: 3.1k License: AGPL-3.0 plandex 是一个用于复杂任务的 AI 编码引擎。 使用长时间运行的代理完成跨多个文件且需要多个步骤的任务将大型任务分解为较小子任务,逐一实现,直至完成整个工作帮助处理积压工作、使用陌生技术、摆…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x新特性) 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2 文…