美文网首页
原生JS实现懒加载(Lazy Load)

原生JS实现懒加载(Lazy Load)

作者: 时间的溺水者 | 来源:发表于2022-03-28 20:42 被阅读0次

如果页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费。采用懒加载技术,即用户浏览到哪儿,就加载该处的图片。这样节省网络资源、提升用户体验、减少服务器压力。

方法1:使用scrollTop/innerHeight/offsetTop

基本知识点:

  • window.innerHeight:浏览器可视区域高度
    document.body.scrollTop || document.documentElement.scrollTop:浏览器滚动条滚过高度
    img.offsetTop:元素距文档顶部的高度 *

这里有张图可以非常清晰的理解上述概念:

image.png

加载条件:

img.offsetTop < window.innerHeight + document.body.scrollTop;

代码如下:

var imgs = document.querySelectorAll('img');
window.onscroll = function(){
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    var winTop = window.innerHeight;
    for(var i=0;i < imgs.length;i++){
    if(imgs[i].offsetTop < scrollTop + winTop ){
        imgs[i].src = imgs[i].getAttribute('data-src');
    }
    }

函数节流:

        var imgs = document.querySelectorAll('img');
    var lazyload = function(){
        var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
        var winTop = window.innerHeight;
        for(var i=0;i < imgs.length;i++){
            if(imgs[i].offsetTop < scrollTop + winTop ){
                imgs[i].src = imgs[i].getAttribute('data-src');
            }
        }
    }
    function throttle(method,delay){
        var timer = null;
        return function(){
            var context = this, args=arguments;
            clearTimeout(timer);
            timer=setTimeout(function(){
                method.apply(context,args);
            },delay);
        }
    }
    window.onscroll = throttle(lazyload,200);

方法2:使用IntersectionObserver方法

基本知识:

var io = new IntersectionObserver(callback, option);
 
 //开始观察
 io.observe(document.getElementById('example'));
  
 //停止观察
 io.unobserve(element);
  
 // 关闭观察器
 io.disconnect();

上面代码中,构造函数IntersectionObserver接收两个参数:callback是可见性变化时的回调函数,option是配置对象(该参数可选)。
这个构造函数的返回值是一个观察器实例。构造函数的返回值是一个观察器实例,实例的observe方法可以指定观察哪个DOM节点。

上面代码中,observe的参数是一个DOM节点对象。如果要观察多个节点,就要多次调用这个方法。
callback函数的参数(entries)是一个数组,每个成员都是一个IntersectionObserverEntry对象。举例来说,如果同时有两个被观察的对象的可见性发生变化,entries数组就会有两个成员

intersectionRatio:目标元素的可见比例,完全可见时为1,完全不可见时小于等于0

代码如下:

    //获取观察器实例  changes是被观察的对象数组
    var observer = new IntersectionObserver(function(changes){  
        console.log(changes);
        changes.forEach(function(index,item){
            if(item.intersectionRatio > 0 && item.intersectionRatio < 1)
                //target:被观察的目标元素,是一个 DOM 节点对象
                item.target.src = item.target.dataset.src;
        });
    });
    function addObserver(){
        var listItems = document.querySelectorAll('.img-item');
        listItems.forEach(function(item){
            //实例的observe方法可以指定观察哪个DOM节点
            //开始观察  observe的参数是一个 DOM 节点对象
            observer.observe(item);
        });
    }
    addObserver();

相关文章

  • HBuilder之scroll-view

    image-src:lazy-load 设置为1时懒加载。

  • Objective-C | 谈谈我对懒加载的一点看法

    懒加载: lazy load,又名延迟加载,需要的时候才加载。 目前对于懒加载有下面三种说法: 1.禁止使用懒加载...

  • OC 谈谈我对懒加载的一点看法

    懒加载: lazy load,又名延迟加载,需要的时候才加载。 目前对于懒加载有下面三种说法: 1.禁止使用懒加载...

  • swift的

    懒加载的优点 懒加载(lazy load),其实是延时加载,它的优点显而易见,首先,懒加载将对象的创建延迟到了需要...

  • Swift - 懒加载的实现

    懒加载的优点 懒加载(lazy load),其实是延时加载,它的优点显而易见,首先,懒加载将对象的创建延迟到了需要...

  • 实现一个懒加载

    什么是懒加载 懒加载,又叫“延迟加载”,英文名“lazy load”。懒加载实际就是将页面上所有的图片都换成一个相...

  • hibernate懒加载(lazy)

    lazy需要的时候,加载,不需要的时候,不加载。 类的懒加载 session.load方法是懒加载类的延迟加载在映...

  • 图片懒加载

    前端实现图片懒加载(lazyload)的两种方式 原生JS实现最简单的图片懒加载 30行Javascript代码实...

  • 懒加载

    安装 npm install lazy-load-img --save 优势: 1.原生js开发,不依赖任何框架或...

  • Spring对Hibernate延迟加载操作的支持

    延迟加载(lazy load)是(也称为懒加载),延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓...

网友评论

      本文标题:原生JS实现懒加载(Lazy Load)

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