js 原生上拉加载 getBoundingClientRect

2019-03-15  本文已影响0人  我讲你思

前端上拉加载是一个比较常用的功能,网络上有许多下拉加载的插件,但是有时场景不同或项目的需求,并不能都适用,因此需要自己写一个原生的。如下:

css:

    .infinite-scroll-signal {
        width: 0;
        height: 0;
        visibility: hidden;
      }

HTML:

    <!-- 评论列表   列表数据容器 -->
    <div class="comment-lists"></div>
    <div class="infinite-scroll-signal"></div>

js:

        var page = 1   // 起始分页
        // throttle
        var canLoade = true   //节流、防抖
        function getEval() {
          if(canLoade) {
            // 防止频繁触发滚动条事件
            canLoade = false
            setTimeout(() => {
              canLoade = true
            }, 800);
            // 数据请求
            $.ajax({
              type: 'post',
              url: location.origin + '/api/informationEval?id=' + id + '&api_token=' + api_token + '&page=' + page,
              dataType: 'json',
              success: function(res) {
                if (res.status == 200 ) {
                  comments =  res.data.data
                  if (comments.length > 0) {
                    comments.forEach((item, index)=> {
                      $('.comment-lists').append(`
                        <div class="comment-list">
                          <div class="commenter"><img src="${item.member.avatar}" alt=""><span class="comment-name">${item.member.member_name}</span></div>
                          <div class="comment-content">
                            <div class="content-inner">
                                <div class="eval">${item.geval_content}</div>
                                <div class="publish-time">${item.created_at}</div>
                            </div>
                          </div>
                        </div>
                      `)
                    })
                    page += 1
                  }
                };
              }
            })
          }
        }
        //  刚进入页面时加载数据
        getEval()

        // 无限刷新
        
        function checkIsTotalVisible (element) {
          const rect = element.getBoundingClientRect()  //用于获取某个元素相对于视窗的位置集合
          const { 
            top, 
            left, 
            bottom, 
            right 
          } = rect
          console.log(rect)
          const isTotalVisible = (
            top >= 0
            &&
            left >= 0
            &&
            bottom < document.documentElement.clientHeight
            &&
            right < document.documentElement.clientWidth
          )
          return isTotalVisible
        }
         // 监听滚动条
        document.addEventListener('scroll', infinteScroll, false)

        function infinteScroll() {
          
          if (checkIsTotalVisible(document.querySelector('.infinite-scroll-signal'))) getEval();
        }

知识点和原理:

在需要无限加载的列表底部,埋下一个隐藏元素。当不断滑动时,隐藏元素将出现在视窗(viewport)里,也就意味着当前浏览的列表已经到底部了,这时候就需要进行列表加载。

getBoundingClientRect:返回值是一个 DOMRect对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合 。

DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。

image.png

空边框盒会被忽略。如果所有的元素边框都是空边框,那么这个矩形给该元素返回的 width、height 值为0,left、top值为第一个css盒子(按内容顺序)的top-left值。

当计算边界矩形时,会考虑视口区域(或其他可滚动元素)内的滚动操作,也就是说,当滚动位置发生了改变,top和left属性值就会随之立即发生变化(因此,它们的值是相对于视口的,而不是绝对的)。如果你需要获得相对于整个网页左上角定位的属性值,那么只要给top、left属性值加上当前的滚动位置(通过window.scrollX和window.scrollY),这样就可以获取与当前的滚动位置无关的值。

上一篇下一篇

猜你喜欢

热点阅读