原生js实现懒加载并节流

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

方法1:使用scrollTop/innerHeight/offsetTop
基本知识点:
window.innerHeight:浏览器可视区域高度
document.body.scrollTop || document.documentElement.scrollTop:浏览器滚动条滚过高度
img.offsetTop:元素距文档顶部的高度
这里有张图可以非常清晰的理解上述概念:

加载条件:
img.offsetTop < window.innerHeight + document.body.scrollTop;
代码如下:
<script type="text/javascript">
    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‘);
            }
        }
    }
</script>
函数节流:
<script type="text/javascript">
    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);
</script>

方法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。

代码如下:
<script type="text/javascript">
    //获取观察器实例  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();
</script>
完整代码:
懒加载+函数节流

参考资料:

1:https://www.jianshu.com/p/9b30b03f56c2

2:http://www.ruanyifeng.com/blog/2016/11/intersectionobserver_api.html

3:https://blog.csdn.net/kayron/article/details/78643620

原文地址:https://www.cnblogs.com/menglong1214/p/10386918.html

时间: 2025-01-04 15:07:38

原生js实现懒加载并节流的相关文章

js图片懒加载

<script type="text/javascript"> var lazyLoad = { // 获取元素到页面顶部的距离 getoffsetTop: function(elem){ var offTop = 0; while(elem != null){ offTop += elem.offsetTop; // 获取元素到其上一级元素顶部的距离 elem = elem.offsetParent; // 元素的上一级元素 } return offTop; }, //

原生JavaScript实现懒加载

源码工程下载地址:https://github.com/blff122620/jsLibary/lazyLoad.html 实现原理就是通过scroll事件判断元素是否已经进入viewport 导入 lazyLoad.js 使用 inViewPort(item)即可 判断item是否在视口里,然后继续进行自己的逻辑就行了 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT

原生javascript代码懒加载

1.先定义需要懒加载的样式: class="lazyload" 2.设置初始透明度为0.1: .lazyload{ filter: Alpha(opacity=10); -moz-opacity:0.1; opacity:0.1; } 3.把真正需要加载的真实地址放在data-src属性中: src="懒加载图片.png" data-src="真实图片"; 4. 前端开发周大伟同学JavaScript代码编写: function lazyload

js 图片懒加载

图片懒加载(图片出现在可视区域再加载) 兼容性:兼容目前流行的全部浏览器,包括:兼容到IE6) 使用方法: 引入相应的js文件<script src="js/lazy.js"></script> 初始化 Lazy.init(1000); 可以传入延时时间.默认是500ms 注意: <img src="img/load.gif" data-lazy="img/2.jpg"> src 属性放预加载的图片,data-

jquery 图片懒加载

jquery 图片懒加载 CreationTime--2018年7月1日14点45分 Author:Marydon 1.源码展示 (function(a){a.fn.lazyload=function(b){var c={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:window,skip_invisible:!0};b&&(null!==b.failurelim

页面图片预加载与懒加载

预加载 方法一:CSS实现预加载 1 #preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; } 2 #preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; } 3 #preload-03 { background: url(http://domain.t

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

原生js实现图片懒加载

原理: 将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自定义命名,我自己用data-src)属性指向真实的图片. src指向一张默认的图片,否则当src为空时也会向服务器发送一次请求.可以指向loading的地址. 代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title&

2.原生js实现图片懒加载

网上查了很多图片懒加载的内容, 但基本上都是jQuery实现的, 没有说清楚其原理, 所以研究了一下 多的不说, 上代码, 看不明白的建议看下我的上一篇文章<1. 图解浏览器和用户设备的宽高等属性> HTML部分(图片地址自己随意) <div> <img data-src="1.jpg" src="0.gif" alt=""> <img data-src="1.jpg" src=&qu