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

server/2024/10/18 8:20:16/

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/server/25560.html

相关文章

2024年 Java 面试八股文——java框架篇

目录 1、简单的谈一下SpringMVC的工作流程 难度系数: 2、说出Spring或者SpringMVC中常用的5个注解 难度系数:⭐ 3、简述SpringMVC中如何返回JSON数据 难度系数:⭐ 4、谈谈你对Spring的理解 难度系数:⭐ 5、Spr…

战胜DALL·E 3和 Midjourney的开源模型来了——playground-v2.5

这是首次超越闭源AI模型的开源时刻。Playground AI 前不久宣布Playground v2.5正式开源。Playground v2.5 是美学质量方面最先进的开源模型,特别关注增强的颜色和对比度、改进的多纵横比生成以及改进的以人为中心的精细细节。并且在美学质量方面树立了新标准&#x…

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

面试的时间地点(南京坦道)工程化问题比较少,通用性问题表较多

1.前端的选型 2.前端的$nicktick() 3.前端的媒体查询 4.前端的 VUE 高级用法 我的回答{ web端视图层的渲染原理 } 5.前端的数组,异步处理 我的回答{ 回了,最笨的方法。 es6的set(); 参数是&…

设计模式(三)、模板方法设计模式

模式定义 模板方法模式(Template Method Pattern):定义一个操作中算法的框架而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 模式结构 模板方法模式包含如下角色: AbstractClass: 抽象类 ConcreteClass:具体…

随手记:vue2 filters this指向undefined

今天在使用filters的时候,需要用到this的数据,结果发现,this打印出来的是undefined 原因: 过滤器注册在vue实例之前,所以this指向了window,但是因为严格模式原因,为 undefined; 所以需要全局声…

Java后端如何生成二维码

为节约服务器资源,一般情况下,不要直接生成海量二维码。 可以考虑,前缀字符,自定义规则生成二维码。 支持自定义二维码大小、二维码logo、颜色等等 前端生成二维码 详见前端开发手册 附件:代码文件下载 ​​http…

K8S 哲学 - deployment -- kubectl【create 、 rollout 、edit、scale、set】

kubectl create kubectl rollout kubectl edit kubectl set kubectl scale 1、创建与配置文件解析 2、deploy 滚动更新 :template 里面的内容改变触发滚动更新 编辑该 deploy 的 配置文件 ,加入一个 label 不会触发滚动更新 改变 nginx镜…