vue2 实现echarts图表进入可视区域后再加载动画,以及 使用了resize之后,动画失效问题解决
Intersection Observer API 是一个现代的浏览器 API,用于监测一个或多个目标元素与其祖先元素或视窗(viewport)之间的交叉状态(intersection)的变化。它可以有效地监听元素是否进入或离开可视区域,从而实现一些懒加载、无限滚动、图表加载等需求。
主要特点和用途:
-
懒加载(Lazy Loading):当页面中的某些元素在可视区域内时再加载它们,以提升页面加载速度和性能。
-
无限滚动(Infinite Scrolling):当滚动到页面底部时加载更多内容,实现无限滚动列表或分页加载。
-
图表加载:在图表或其他数据可视化组件进入可视区域时再触发加载动画或数据更新。
-
广告展示:监测广告是否被用户看到,从而统计广告的曝光量
使用方法:
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 的主要优势在于它可以高效地监测大量元素的交叉状态变化,而无需频繁地监听滚动事件或手动计算元素位置,从而提升了性能和用户体验。
mounted () { await this.getInitDataFun() // 数据 this.$nextTick(() => { this.getEchartData() // 绘制图表 }) }, methods: { // 获取数据 处理图表需要的data getInitDataFun () { 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.onresize if (typeof window.onresize != 'function') { //防止多个window.onresize 冲突 解决 window.onresize = fn } else { window.onresize = function () { old() setTimeout(function () { //个别时候无法刷新echarts 延迟1MS 解决 fn() }, 1) } } } }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

