当前位置: 首页 > article >正文

vue2自定义指令实现滚动动画-使用IntersectionObserver观察器

vue2自定义指令实现滚动动画

使用IntersectionObserver观察器

效果(滑动后触发动画):
在这里插入图片描述

ScrollAnimation.vue代码:

<template>
  <div>
    <div class='list'>
      <div v-slide-in
           class='item'
           v-for='item in 100'
           :key='item'
           :style="{background:randomColor()}">{{item}}</div>
    </div>
  </div>
</template>

<script>
const elMap = new WeakMap()

const ob = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        if (entry.isIntersecting) {
            elMap.get(entry.target).play()
            ob.unobserve(entry.target)
        }
    })
})
export default {
    name: 'ScrollAnimation',
    methods: {
        randomColor() {
            return `rgb(${Math.floor(Math.random()*255)},${Math.floor(Math.random()*255)},${Math.floor(Math.random()*255)})`
        },
    },
    directives: {
        'slide-in': {
            inserted(el) {
                const rect = el.getBoundingClientRect()
                if (!(rect.top > window.innerHeight)) {
                    return
                }
                const an = el.animate([{
                        transform: 'translateY(50px)',
                        opacity: 0.5
                    },
                    {
                        transform: 'translateY(0px)',
                        opacity: 1
                    }
                ], {

                    duration: 1000,
                    easing: 'ease-out',
                    fill: 'forwards'
                })
                elMap.set(el, an)
                an.pause()
                ob.observe(el)
            },
            unbind(el) {
                ob.unobserve(el)
            }
        }
    },
}
</script>

<style scoped>
* {
    margin: 0;
    padding: 0;
}

.list {
    width: 90%;
    margin: 0 auto;
}

.item {
    width: 100%;
    height: 100px;
    margin-bottom: 10px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 30px;
    font-weight: bold;
    color: #fff;
    border-radius: 10px;
}
</style>


http://www.kler.cn/a/612150.html

相关文章:

  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.3分布式数据加载与并行处理(PyTorch DataLoader优化)
  • nestjs 连接redis
  • 数据可视化(matplotlib)-------图表样式美化
  • 蓝桥杯第十届 数的分解
  • Linux——进程信号(1)(signal与sigaction)
  • java程序员实用英语学习总结
  • linux scp复制多层级文件夹到另一服务器免密及脚本配置
  • 【深度学习与实战】2.1、线性回归模型与梯度下降法先导
  • [250324] Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!| Wine 10.4 发布!
  • Apache Shiro 全面指南:从入门到高级应用
  • 网络安全可以去哪些单位工作
  • Windows 图形显示驱动开发-WDDM 2.7功能-MCDM KM 驱动程序实现指南(三)
  • Anaconda 安装NCL (Linux系统)
  • ArcGIS字段计算器的详细使用案例
  • 机器学习核心评估指标解析:AUC-ROC、RMSE、轮廓系数与PR AUC详解
  • 深度解析 | Android 12系统级禁用SIM卡功能实现与Framework层定制
  • 城电科技 | 光伏植物墙 一款会发电发光自动浇水的植物墙
  • STM32八股【2】-----ARM架构
  • OpenHarmony子系统开发 - init启动引导组件(七)
  • 在Windows docker desktop 中安装Dify