JS总结——IntersectionObserverAPI

什么是IntersectionObserver

文档中的描述为:​​​​​​​Intersection Observer API​的IntersectionObserver接口提供了一种异步观察目标元素与祖先元素或顶级文档视口的交集变化的方法。祖先元素或视口称为根。

ntersectionObserver能做什么

可以监视页面中的一个元素是否出现在视口中,以此可以衍生出许多功能,当这个元素出现在视口中时,可以处理发送请求,触发动画等等业务。

如何使用

我们来分析一下官方给的案例
在使用之前,我们需要对InterceptionObserver进行注册,并且指定回调,该回调函数即当监视的元素出现在视口中,离开视口时均会触发,当元素绑定上监视器的时候首先会触发一次

关键属性:intersectionRatio属性告诉您当前有多少目标元素在根的交叉比率内可见,值介于 0.0 和 1.0 之间。简单地说,就是元素在页面中的面积和整个元素面积的比值,触发函数的时候元素完全在页面中,则为1,一半面积在页面中则为0.5。

//由于InterceptionObserver是JS原生的API,因此可以直接new 来创建对象
const io = new IntersectionObserver(entries => {//entries是触发回调函数的元素数组
//由于我们可以监视多个元素,可能会出现多个元素同时进入视口触发回调的情况,因此是一个数组
  entries.forEach(entry => {
  //由于元素进入视口和退出视口都会触发
  //如何判断此时元素是进入视口还是退出视口呢?
    if (entry.intersectionRatio > 0) {//通过entry.intersectionRatio属性
    //元素在页面中的面积大于0,则元素出现在视口中,即元素进入视口
      entry.target.classList.add('active');//entry.target即为触发函数的dom元素
    }

    else {
    //元素在页面中的面积=0,则元素不在视口中,即元素离开了视口
      entry.target.classList.remove('active');
    }
  })
})

指定了回调之后,我们还需要给元素绑定上监视器,通过io.observe(element)
可以给多个元素绑定,也可以给一个元素绑定

// Declares what to observe, and observes its properties.
const boxElList = document.querySelectorAll('.box');
boxElList.forEach((el) => {
  io.observe(el);
})

其他重要函数

  • io.unobserve(element) 元素绑定了监视器之后,可以在任意时刻解绑,接触绑定之后,当元素进入视口或离开视口,回调函数均不会执行。
  • io.disconnect()。 停止观察其所有目标元素的可见性变化


如果我们想让监视的函数只在元素进入页面的时候执行一次,则可以在回调的进入函数中,将监视器清除。

const io = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.intersectionRatio > 0) {
      entry.target.classList.add('active');
      io.unobserve(entry.target)
    }

    else {
      entry.target.classList.remove('active');
    }
  })
})
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用CSS和JavaScript来实现广告图由左往右滚动的特效。 首先,在HTML文件中创建一个包含广告图的容器,如下所示: ```html <div class="ad-container"> <img src="ad1.jpg"> <img src="ad2.jpg"> <img src="ad3.jpg"> </div> ``` 然后,在CSS文件中设置容器的宽度和高度,并将其中的图片设置为浮动状态,如下所示: ```css .ad-container { width: 500px; height: 200px; overflow: hidden; } .ad-container img { width: 500px; height: 200px; float: left; } ``` 接下来,在JavaScript文件中编写代码,实现广告图由左往右滚动的特效。首先,获取广告图容器以及其中的图片元素,如下所示: ```javascript var adContainer = document.querySelector('.ad-container'); var adImgs = adContainer.querySelectorAll('img'); ``` 然后,使用定时器实现轮播特效。每隔一段时间,将容器向左移动一张图片的宽度,并将第一张图片移动到最后,如下所示: ```javascript var currentIndex = 0; // 当前显示的图片索引 setInterval(function() { var imgWidth = adImgs[0].offsetWidth; // 获取图片的宽度 adContainer.style.transform = 'translateX(-' + imgWidth * currentIndex + 'px)'; currentIndex++; if (currentIndex >= adImgs.length) { currentIndex = 0; adContainer.style.transform = 'translateX(0)'; } }, 3000); // 每隔3秒钟切换一次图片 ``` 最终效果就是,广告图会自动滚动,每隔3秒钟显示下一张图片,直到所有图片都显示完毕后,再从第一张图片重新开始。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑白程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值