jquery实现简单瀑布流布局(续):图片懒加载

# jquery实现简单瀑布流布局(续):图片懒加载

这篇文章是jquery实现简单瀑布流布局思想的小小扩展。代码基于前作的代码继续完善。
图片懒加载就是符合某些条件时才触发图片的加载。最常见的具体表现就是,当页面被请求时,只加载可视区域的图片,其它部分的图片只占位而不加载,只有这些图片出现在可视区域时才会动态加载。具体实现的技术并不复杂,下面分别对其说明。

## 技术路线

1011161-20161205061917585-109686990.png

  • 怎么加载。首先未加载的图片有一个占位假图片(一般是loading),按照真实图片的大小进行样式化。网上较为常用的思路是对图片元素的父级定义一个data-src属性,用来存放该图片元素的真实src。到用的时候再调用。
  • 加载判断条件:
    首屏一次性加在20张。保证首页有料。
    后边的图片基于以下思路。

1011161-20161205060120554-460529033.png

往下拉(滚动),找到第一个顶部进入可视区的img,优先加载。

  • 监听位置:
  • 滚动条滚动时,这提示需要写一个新加载的函数。
  • 第二个有点难察觉,就是在getlist方法加载瀑布流完结之前。因为getList一旦调用,就意味着有新的图片进入可视区。不能只靠滚动进行触发

修改getList函数

function getList(n){
    $.getJSON(createUrl(n),function(data){
        if(data.length==0){
            return false;
        }else{
            for(var i=0;i<data.length;i++){           
                var $html=null;
                if(i<=20&&n==1){//首屏一次加载20张
                    $html=$('<div><img src="'+data[i].preview+'"><p>'+data[i].title+'</p></div>');
                     
                }else{
                    $html=$('<div><img src="images/1.jpg"><p>'+data[i].title+'</p></div>'); 
                    $html.find('img').css('opacity','0'); //占位图片不透明度为0
                } 

                $('li').eq(getShortestLi()).append($html);
                $html.attr('data-src',data[i].preview);
                $html.find('img').css('height',(data[i].height*225/data[i].width)+'px');
                $html.find('img').css('width','225px'); 

            };
        }

        bCheck=true;    
    });
}

加载真实图片的执行函数

function loadClientPic(arr){//arr是页面所有的img标签。
    var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;

    for(var i=0;i<arr.length;i++){
        if(arr.eq(i).attr('src')=='images/1.jpg'){
            if(arr.eq(i).offset().top<document.documentElement.clientHeight+scrollTop){//进入可视区内!
                arr.eq(i).attr('src',arr.eq(i).parent().attr('data-src'));
                //console.log(i)
                //transition: 1s; opacity: 1
                if(arr.eq(i).attr('src')!=='images/1.jpg'&&arr.eq(i).height()!==0){
                    arr.eq(i).css('transition','1s').css('opacity','1');
                }

            }else{
                //console.log('不在可视区!')               
            }
        }else{
            //console.log('已加载')               
        }                     
    }
};

## 最后,在监听位置加上写好的函数

  • 在$(window).scroll(function(){})里加上loadClientPic($('img));
  • 不要遗漏getList方法结束前也执行loadClientPic。

## 附录

demo地址 http://djtao.top/ppl/ppl.html

全部代码:

//找出高度最小li的索引值
function getShortestLi(){
    var shortest=0;
    for(var i=1;i<4;i++){
        if($('li').eq(i).height()<$('li').eq(shortest).height()){
            shortest=i;
        }
    }
    return shortest;
}

function createUrl(num){
    return 'http://www.wookmark.com/api/json/popular?page='+num+'&callback=?';
}


var bCheck=false;
function getList(n){
    $.getJSON(createUrl(n),function(data){
        if(data.length==0){
            return false;
        }else{
            for(var i=0;i<data.length;i++){           
                var $html=null;
                if(i<=20&&n==1){//首屏一次加载20张
                    $html=$('<div><img src="'+data[i].preview+'"><p>'+data[i].title+'</p></div>');
                     
                }else{
                    $html=$('<div><img src="images/1.jpg"><p>'+data[i].title+'</p></div>'); 
                    $html.find('img').css('opacity','0'); //占位图片不透明度为0
                } 

                $('li').eq(getShortestLi()).append($html);
                $html.attr('data-src',data[i].preview);
                $html.find('img').css('height',(data[i].height*225/data[i].width)+'px');
                $html.find('img').css('width','225px'); 

            };
        }
        loadClientPic($('img'));//函数临结束执行判断
        bCheck=true;    
    });
}

$(function(){
    var pageNum=1;
    getList(pageNum);
    $(window).scroll(function(){
        
        var $li=$('li').eq(getShortestLi());
        var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
        //console.log([$li.offset().top+$li.height(),document.documentElement.clientHeight+scrollTop])
        //如果li高度与li到页面顶部的高度之和<可视区高度+滚动距离
        if($li.offset().top+$li.height()<document.documentElement.clientHeight+scrollTop){
            if(bCheck){
                bCheck=false;
                pageNum++;

                //console.log(pageNum);
                getList(pageNum); 
            }else{
                return false;
            }
            
        }

        loadClientPic($('img'));
    })
})

function loadClientPic(arr){
    var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;

    for(var i=0;i<arr.length;i++){
        if(arr.eq(i).attr('src')=='images/1.jpg'){
            if(arr.eq(i).offset().top<document.documentElement.clientHeight+scrollTop){//进入可视区内!
                arr.eq(i).attr('src',arr.eq(i).parent().attr('data-src'));
                //console.log(i)
                //transition: 1s; opacity: 1
                if(arr.eq(i).attr('src')!=='images/1.jpg'&&arr.eq(i).height()!==0){
                    arr.eq(i).css('transition','1s').css('opacity','1');
                }
                
            }else{
                //console.log('不在可视区!')               
            }
        }else{
            //console.log('已加载')               
        }                     
    }
};

看着那些图片,不由得再感叹一句,歪果仁太会玩了..

转载于:https://www.cnblogs.com/djtao/p/6132595.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现jquery下拉加载和瀑布流的步骤如下: 1. 引入jquery库和瀑布流插件masonry。 ```html <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/masonry/4.2.2/masonry.pkgd.min.js"></script> ``` 2. 创建一个包含内容的容器。 ```html <div id="content"> <!-- 内容项 --> </div> ``` 3. 使用ajax获取数据。 ```javascript var page = 1; // 默认第一页 var isLoading = false; // 是否正在加载中 function getData() { if (isLoading) return; // 如果已经在加载中,则不进行请求 isLoading = true; // 设置为正在加载中 $.ajax({ type: 'GET', url: 'your-api-url', data: { page: page }, success: function(res) { // 成功获取数据后,page数加一,isLoading设为false page++; isLoading = false; // 处理数据并渲染页面 render(res.data); }, error: function() { isLoading = false; console.log('请求失败'); } }); } ``` 4. 渲染数据并使用瀑布流布局。 ```javascript function render(data) { var content = $('#content'); var html = ''; // 遍历数据,生成对应的 HTML 代码 for (var i = 0; i < data.length; i++) { html += '<div class="item">' + data[i].title + '</div>'; } // 将 HTML 插入到容器中 content.append(html); // 使用瀑布流布局 content.imagesLoaded(function() { content.masonry({ itemSelector: '.item', columnWidth: 240, // 每列的宽度 gutter: 20 // 列与列之间的距离 }); }); } ``` 5. 监听滚动事件,当滚动到底部时触发加载更多数据的函数。 ```javascript $(window).scroll(function() { if ($(document).scrollTop() + $(window).height() >= $(document).height()) { getData(); } }); ``` 这样就可以实现jquery下拉加载和瀑布流效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值