携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
懒加载
现在需要一个需求,用户通过页面滑动到底的时候显示加载中,去加载更多的数据,如果没有滑到底部,只需要加载当前的元素。当页面显示在加载中的时候,则加载剩余的元素,达到一个懒加载的目的,而不是将元素一次性全部渲染出来
当页面加载到此刻,我们去加载我们剩下的元素
实现
<style>
.box{
width: 100px;
height: 120px;
background: lightblue;
margin: 10px auto;
}
</style>
<div class="box_con">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<div class="loading" style="width:100px;height:100px;margin: 10px auto;">加载中。。。</div>
我们先放置好我们目前的元素,以及加载中的元素
function loadItems(){
console.log('loading')
let bod = document.querySelector('.box_con');
let ele = document.createElement('div')
ele.className = 'box';
bod.append(ele)
}
我们要做的时候loading元素显示的时候,触发加载loadItems函数,函数的目的是去增加剩下的元素
主要api
其实我们的实现主要是靠一个api--Intersection Observer来实现即可
IntersectionObserver接口 (从属于Intersection Observer API) 提供了一种异步观察目标元素与其祖先元素或顶级文档视窗 (viewport) 交叉状态的方法。祖先元素与视窗 (viewport) 被称为根 (root)。
该api可以监听元素和父级元素或者窗口的重叠状态,简单来说就是看元素有没有出现在父级或者窗口中。
实现
var loading = document.querySelector('.loading');
var flag = 0
var ob = new IntersectionObserver(function(entries){
flag+=1
if (entries[0].intersectionRatio >0&&flag!=0){//当前元素可见时
loadItems(10);
}
},{
thresholds:0.5,//元素进入父级元素视野的大小
})
ob.observe(loading)
实现的过程比较简单,实例化api后监听loading元素,entries[0].intersectionRatio主要是判断是否达到条件
这里为了更明显图片上我是加了定时器进去的,模仿调取数据需要用到的时间
setTimeout(() => {
let bod = document.querySelector('.box_con');
let ele = document.createElement('div')
ele.className = 'box';
bod.append(ele)
}, 1000);
上面的写法中,我用了flag来做一个判断,如果你用了我这个栗子去跑一下,你会发现页面加载的时候,不加flag,api会自动监听loading元素已经显示,所以就会默认调用一次,这里做了一个判断,默认的情况下只加载我们写好的div,而不调用我们的loading函数。