美文网首页
IntersectionObserver观察一个元素是否在视窗可

IntersectionObserver观察一个元素是否在视窗可

作者: jane819 | 来源:发表于2020-04-07 15:18 被阅读0次
    destroy() {
        window.removeEventListener('scroll', this.scrollEvent)
      }
      // 单个元素
      observeSelectTools() {
        const selectTools = document.querySelector('.select-tools') as HTMLDivElement
        const { height } = selectTools.getBoundingClientRect() // 获取元素的位置 返回{s}
        selectTools.style.height = `${height}px`
        // boundingClientRect:目标元素的矩形区域的信息
        // intersectionRatio:目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0
        const io = new window.IntersectionObserver(
          ([{ boundingClientRect, intersectionRatio }]) => {
            if (boundingClientRect.top > 0 && intersectionRatio < 1) {
              return false
            }
            this.fixedSelect = intersectionRatio < 1
            return true
          },
          // 当目标元素和根元素相交的面积占目标元素面积的百分比到达或跨过某些指定的临界值时就会触发回调函数
          { threshold: [0, 1] }
        )
        io.USE_MUTATION_OBSERVER = false
        // 观察目标元素
        io.observe(selectTools)
        // 针对有的手机出现浮动的bug
        window.addEventListener('scroll', this.scrollEvent)
      }
    
    // 多个元素时
    observeSelectTools() {
        const selectTools = document.querySelector(`.select-tools-${this.activeName}`) as HTMLDivElement
        const parent = selectTools.parentNode as HTMLDivElement //获取当前元素的父元素
        const { height } = selectTools.getBoundingClientRect() // 方法返回元素的大小及其相对于视口的位置
        if (height > 0) {
          selectTools.style.height = `${height}px`
        }
        // boundingClientRect:目标元素的矩形区域的信息
        // intersectionRatio:目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0
        const io = new window.IntersectionObserver(
          ([{ boundingClientRect, intersectionRatio }]) => {
            if (parent.getBoundingClientRect().height === 0
            || (boundingClientRect.top > 0 && intersectionRatio < 1)) {
              return false
            }
            this.fixedSelect = intersectionRatio < 1
            return true
          },
          // 当目标元素和根元素相交的面积占目标元素面积的百分比到达或跨过某些指定的临界值时就会触发回调函数
          { threshold: [0, 1] }
        )
        io.USE_MUTATION_OBSERVER = false
        // 观察目标元素
        io.observe(selectTools)
        // 针对有的手机出现浮动的bug
        window.addEventListener('scroll', this.scrollEvent)
      }
    
      scrollEvent() {
        timer && clearTimeout(timer)
        timer = setTimeout(() => {
          const selectTools = document.querySelector('.select-tools') as HTMLDivElement
          if (!selectTools) return
          const { top } = selectTools.getBoundingClientRect()
          if (top > 0) {
            this.fixedSelect = false
          }
        }, 100)
      }
    

    相关文章

      网友评论

          本文标题:IntersectionObserver观察一个元素是否在视窗可

          本文链接:https://www.haomeiwen.com/subject/lzlnphtx.html