首页 > 其他分享 >下拉加载瀑布流(横向)

下拉加载瀑布流(横向)

时间:2023-02-09 18:02:18浏览次数:40  
标签:function list 横向 瀑布 result var colHeight true 加载

图文以瀑布流(横向)的方式进行渲染绘制

样式部分:

.img_item_li{
    position: absolute;
    width: calc(16.5% - 8px);
    margin: 5px 4px 0 4px;
    padding: 0;
    opacity: 0;
    transition: all .8s;
}

设置opacity,会有一点动画,不设置也可以

逻辑部分:

<script>
    var isFirst = true,
    isDataArrive = true,
    curPage = 1,
    pagesize = 23;
    colHeight = [];
    initResultlist();
    $(window).on('scroll',function(){
        if(!isDataArrive){
            return;
        }
        //判断 'id = result_list_load' 是否进入视野
        if(isVisible($('#result_list_load'))){
            initResultlist();
        }
    })
    // 主流程函数
    function initResultlist(){
        // 执行 getResultlistData 使用 ajax 获取数据
        getResultlistData(function(newList){
            isDataArrive = true;
            if(isFirst){
                var _html = '<li class="first_li img_item_li"><div>固定首个</div></li>';

                $('.result_list').append(_html);
                waterFall($(_html),true);
            }

            $.each(newList,function(index,news){
                // 拿到的数据进行 DOM 拼接
                var $node = getNode(news)
                $node.find('img').on('load',function(){
                    $('.result_list').append($node)
                    // 进行瀑布流布局
                    waterFall($node);
                })
            })
        })
        // 即获取并添加之后,修改数据状态
        isDataArrive = false
    }
    // 执行搜索条件,重新执行
    function searchResultlist(){
        $(".result_list").html("");
        $("#result_list_load").html("点击或者下拉加载更多");
        isFirst = true;
        isDataArrive = true;
        curPage = 1;
        colHeight = [];
        initResultlist();
    }
    function getResultlistData(callback){
        if(curPage == 1){
            $(".result_list_noresult").addClass("hide");
            $(".result_list").addClass("hide");
            $(".result_list_loading").removeClass("hide");
        }
        $.ajax({
            url: "url",
            type: "post",
            dataType: "json",
            data: {},
            success: function (res) {
                if (res.error == 0) {
                    var _result = res.data;
                    var _html = '';

                    if(curPage == 1){
                        if(_result.length < 1){
                            $(".result_list").addClass("hide");
                        }else{
                        //loading---结果出后,文字提示是:点击或者下拉加载更多
                            $(".result_list").removeClass("hide");
                            callback(_result);
                            curPage++;
                        }
                        if(_result.length < pagesize){
                            //loading---结果出后,因为不足一页,文字提示是:到底啦
                        }
                    }else{
                        if(_result.length < 1){
                            //loading---结果出后,result,文字提示是:到底啦
                        }else{
                            callback(_result);
                            curPage++;
                        }
                    }
                } else {
                }
            }
        });
    }
    // DOM 拼接
    function getNode(data){
        var _itemHtml = '';        
        _itemHtml += '<li class="img_item_li">';
        _itemHtml += '<div class="img_item_block"><img class="item_img" src="'+data["img_id"]+'"/></div>';
        _itemHtml += '<div class="item_title">'+data["name"]+'</div>';
        _itemHtml += '</li>';

        return $(_itemHtml)
    }
    function waterFall($node,isaddNode=false){
        var nodeWidth = $('.img_item_li').outerWidth(true)

        // 首次调用的时候
        if(isFirst){
            var colNum = parseInt($('.result_list').width()/$('.img_item_li').outerWidth(true));
            for(var i = 0; i < colNum ; i++){
                colHeight[i] = 0
            }
            isFirst = false
        }
        var index = 0,
        minSumHeight = colHeight[0];

        for(var i = 0; i < colHeight.length ; i++){
            if(colHeight[i] < minSumHeight){
                index = i
                minSumHeight = colHeight[i]
            }
        }
        //节点的位置
        $node.css({
            left: nodeWidth * index,
            top: minSumHeight,
            opacity: 1
        })
        if(isaddNode){
            $(".first_li").height(nodeWidth * 0.689 +'px');
            colHeight[index] = nodeWidth * 0.689 + minSumHeight;
        }else{
            colHeight[index] = $node.outerHeight(true) + minSumHeight
        }
        $('.result_list').height(Math.max.apply(Math,colHeight))
    }
</script>

 存在bug:

1)更改浏览器窗口大小时,页面没有重新渲染,会出现图片错位的情况

2)在首次访问时,图片展示顺序会出现错位的情况,这与图片load速度有关

标签:function,list,横向,瀑布,result,var,colHeight,true,加载
From: https://www.cnblogs.com/yumeixin/p/17106537.html

相关文章

  • flask web 项目3 控制语句|模板继承|加载静态文件
    #jinjia2模板前端控制语句{%ifage>18%}代码语句{%elif age==18%}代码语句{%else%}代码语句{%endif%} #for循环{%forbookinbooks%}......
  • Element 中使用加载动画
    <script>//1.引入动画组件import{Loading}from'element-ui';exportdefault{name:"index",data(){return{//2.定义实例......
  • CSS 3.0实现模拟手机信号加载动画
    给大家分享一个用CSS3.0实现的模拟手机信各异的加载动画,效果如下: 以下是代码实现,欢迎大家复制、粘贴和收藏。<!DOCTYPEhtml><htmllang="en"><head><metach......
  • CSS 3.0实现瀑布流布局
    瀑布流布局是网页中常见的布局效果,一般我们都是用JS实现的,其实用CSS3.0的属性也可以实现这个功能,并且还自带了响应式功能,效果如下 : 以下是代码实现,欢迎大家复制粘贴和收......
  • 基于Docker使用CTB生成地形切片并加载
    1.引言CTB(CesiumTerrainBuilder)是一个用于地形切片的C++编写的命令行工具GitHub地址为:GitHub-geo-data/cesium-terrain-builder:AC++libraryandassociatedcom......
  • properties文件加载工具类
    importjava.util.HashMap;importjava.util.Map;importjava.util.Properties;/***@authorAdministrator*/publicclassPropertiesUtils{publicstaticMap<Str......
  • 动态链接库的动态加载
    #include<stdio.h>#include<dlfcn.h>intmain(void){//使用动态加载的编译时必须链接dl库(-ldl),因为动态加载的各种方法都在dl库中//gccmain.c-otes......
  • [openlayers07]——加载天地图为底图并展示GeoJSON
    [openlayers07]_加载天地图为底图并展示GeoJSON1.加载底图(得申请key)天地图2.创建地图、设置center和投影//创建地图constcenter=[114.1692,30.494];//EPSG:4......
  • 浅析JVM中的类加载器
    摘要本文将浅析JVM类加载器的执行全过程。开头的代码例子一眼出答案且正确的可以不用往下看了。举个栗子packagecom.syb.javase;publicclassPerson1{privat......
  • 资源加载
    构造函数里加载资源构造函数里加载普通资源一般用ConstructorHelpers::ObjectFinder加载。加载蓝图类用constructorHelpers::ClassFinder加载。他们最终分别进行了如下调......