随笔 - 21,  文章 - 0,  评论 - 0,  阅读 - 7616

 

JavaScript 的 intersectionObserver 可以用来异步监听目标DOM元素与祖先元素或视口(viewport)的交叉状态。

MDN链接

 

简单一点的说,它可以异步检测某个元素是否出现在视口里。比起利用getBoundingClientRect()方法以及scroll事件同步监听,在性能和操作性上,都优秀不少。

 

在项目中,可以用它制作一个每当用户查看某视口时才触发的动画(这样就有用户每次滚动到此处都重新触发动画的效果)

这里以Vue2 项目为例:


1. 在data中创建监听的全局变量 intersectionObserver

  

2. 在template中引用一些DOM元素:

 

  

  

 

 3. 在methods中定义初始化和监听DOM元素的方法:

   在new IntersectionObserver()构造函数中, 为每个监听的元素设置回调函数(callback function),定义元素出现时的动作。

   使用构造函数返回的对象来监听DOM元素

 

 

4. 在mounted中调用方法:

  

5. 在destroyed中取消监听:

  

 源码:

复制代码
          <div class="video-marketing">
            <video ref="scan-jump"
                   style="width: initial; height:100%;"
                   muted>
              <source src="./assets/video/cover002.mp4"
                      type="video/mp4" />
            </video>
          </div>
        <div class="video-surcharge">
          <video ref="buy-total"
                 style="width: initial; height:100%;"
                 muted>
            <source src="./assets/video/cover001.mp4"
                    type="video/mp4" />
          </video>
        </div>
        <div class="video-position">
          <video ref="online-ads"
                 style="width: initial; height:100%;"
                 muted>
            <source src="./assets/video/cover003.mp4"
                    type="video/mp4" />
          </video>
        </div>
复制代码
复制代码
  data() {
    return {
      intersectionObserver: null,
    }
  },
  mounted() {
    this.infiniteVideo()
  },
  destroyed() {
    // 页面销毁前取消所有监听video
    this.intersectionObserver.disconnect()
  },
  methods: {
    // 重复显示video动画效果
    infiniteVideo() {
      // video进入可视区域判断
      this.intersectionObserver = new IntersectionObserver(entries => {
        entries.forEach(item => item.isIntersecting && item.target.play())
      })

      this.intersectionObserver.observe(this.$refs['scan-jump'])
      this.intersectionObserver.observe(this.$refs['online-ads'])
      this.intersectionObserver.observe(this.$refs['buy-total'])
    },
}
复制代码

 

posted on   令狐虫虫666  阅读(606)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示