zoukankan      html  css  js  c++  java
  • 瀑布流,纵向

    /*
    瀑布流封装
       2016.4.27 by WJ
    
    @param containerId  容器ID
    @param nline        列数
    @param nWidth       容器宽度
    @param nBoxWidth    元素实际所占宽度
    @param nMarginLeft  元素的margin
    @param nMarginTop   元素的margin
    @param getData      function
    @param onFinish     function
    */
    function waterfall(containerId, nline, nWidth, nBoxWidth, nMarginLeft, nMarginTop, getData, onFinish) {
    
        var line = nline || 4,
            width = nWidth || 1180,
            boxWidth = nBoxWidth || 295,
            marginLeft = nMarginLeft || 0,
            marginTop = nMarginTop || 0;
    
        var i;
        var cache = [];       //缓存当前读到的数据
        var imgCache = []     //缓存图片数据
        var index = 1;        //第几组数据调用(页码)
        var flag = true;      //是否可读取数据(避免重复读取)
    
        //统计每列的当前高度
        var lineArr = [];
        var lineArrBf = []; //备份
        for (i = 0; i < line; i++) {
            lineArr.push(0);
            lineArrBf.push(0);
        }
    
        //最大值
        Array.prototype.max = function () {
            return Math.max.apply({}, this)
        }
        //最小值
        Array.prototype.min = function () {
            return Math.min.apply({}, this)
        }
    
        //ul容器
        var container = document.getElementById(containerId);
        container.style.position = "relative";
    
    
        //缓存图片(将图片有序地加入数组,并触发图片加载)
        var printFall = function () {
            imgCache = []
            for (i = 0; i < cache.length; i++) {
                var imagethis = new Image();
                imagethis.onload = function () { chn(this); }
                imagethis.onerror = function () { chn(this); }
                imagethis.src = cache[i].c;
                imgCache.push(imagethis)
            }
        }
    
        //每张图片加载完成后都会触发本事件(输出元素到页面上)
        var chn = function (img) {
            var k = 0, j = 0, i = 0, m = 0, n = 0,
                temp;
            var li, liId, thisbox, liList, thisLiid, thisliIdNum;
    
            //标记本条数据的图片已加载完成
            for (k = 0; k < cache.length; k++) {
                if (imgCache[k] === img) {
                    temp = cache[k];
                    temp = { "a": 1, "b": temp.b, "c": temp.c }
                    cache[k] = temp;
                    break;
                }
            }
    
            var thisflag = true;
    
            for (i = 0; i < cache.length; i++) {
                if (cache[i].a == 1) {
                    li = document.createElement("li");
                    liId = "grid_" + index + "_" + i
                    li.id = liId;
                    li.innerHTML = cache[i].b;
                    thisbox = document.getElementById(liId);
                    if (!thisbox) {
    
                        //读取本组的所有已输出的元素
                        liList = $("li[id^='grid_" + index + "_']");
                        for (m = 0, len = liList.length; m < len; m++) {
                            thisLiid = liList[m].id;
                            thisliIdNum = parseInt(thisLiid.split('_')[2]);
                            if (thisliIdNum > i) {
                                break;
                            }
                        }
                        if (m >= liList.length) {
                            container.appendChild(li);
                            fixLi(li);
                        } else {
                            //有序地插入队中
                            container.insertBefore(li, liList[m]);
                            //调整本组元素的定位
                            //复位
                            for (n = 0; n < line; n++) {
                                lineArr[n] = lineArrBf[n];
                            }
                            //重铺
                            liList = $("li[id^='grid_" + index + "_']");
                            for (n = 0, len = liList.length; n < len; n++) {
                                fixLi(liList[n]);
                            }
                        }
                    }
                } else {
                    thisflag = false;
                }
            }
    
            //修改容器的高度
            var maxLine = lineArr.max();
            container.style.height = maxLine + 'px';
    
            if (thisflag && !flag) {
                //本组图片已全部完成加载
                index++;
                cache = [];
                flag = true;
                onFinish();
            }
        }
    
        //调整元素位置
        var fixLi = function (li) {
            var minLine, targetLine, j;
            //获取新元素的位置
            minLine = lineArr.min();//找到最短的一列的高度
            targetLine = 0;//确认最短列的数组下标
            for (j = 0; j < lineArr.length; j++) {
                if (minLine == lineArr[j]) {
                    targetLine = j;
                    break;
                }
            }
            //填入队尾
            li.style.top = lineArr[targetLine] + 'px';
            li.style.position = "absolute";
            li.style.left = targetLine * boxWidth + targetLine * marginLeft + 'px';
            lineArr[targetLine] += li.offsetHeight + marginTop;//修改数组的值
        }
    
        //处理AJAX返回的数据
        var processData = function (data, getSrc, getHtml) {
            if (data.length == 0) {
                if ($("#" + containerId).html == "") {
                    $("#" + containerId).html("内容正在采集中……"); return false;
                }
            }
            else {
                var html = ""
                var src = "";
                for (i = 0; i < line; i++) {
                    lineArrBf[i] = lineArr[i];
                }
                for (var i = 0; i < data.length; i++) {
                    src = getSrc(data[i]);
                    html = getHtml(index, data[i], src);
    
                    //a:0表示图片未完成缓存
                    cache.push({ "a": 0, "b": html, "c": src });
                }
                printFall();
            }
        }
    
        //滚动事件
        var myFunction = function () {
            if (flag) {
                var doc_height = $(document).height();
                //屏幕下遮挡的页面高度
                var hBelow = doc_height - $(this).scrollTop() - $(this).height();
                var perc = hBelow / doc_height;
    
                //触发加载数据的条件
                if (hBelow < 3000 || perc < 0.3) {
                    flag = false;
                    getData(index, processData);
                }
            }
        }
    
        return myFunction;
    }
    

      

    //调取瀑布流
    $(function () {
        //加载数据时执行的操作
        var getData = function (index, processData) {
            //图片链接
            var getSrc = function (item) {
                return "/uploads/" + item.g_id + "/" + item.c_picurl1;
            }
            //li标签内的内容拼接
            var getHtml = function (index, item, src) {
                var html = "";
                html += "<a href="/uploads/" + item.g_id + "/" + item.c_picurl2 + "" class="fancyBox">";
                html += "<img src="" + src + "">";
                html += "<h3 title='" + item.c_info_title + "'>" + getLength(item.c_info_title, 15) + "</h3>";
                html += "</a>";
                return html
            }
    
            var para = {};
            para["index"] = index;
            para["kind"] = parameter.k.k;
            para["action"] = "list";
    
            $.ajax({
                type: "post",
                url: "cl/getCase.ashx",
                data: para,
                dataType: "json",
                success: function (data) {
                    processData(data.Rows, getSrc, getHtml);
                },
                error: function (msg) {
                    //alert(msg); 
                }
            });
        };
    
        //加载完成后执行的操作
        var onFinish = function () {
            $(".fancyBox").fancybox({
                type: 'image',
                openEffect: 'elastic',
                closeEffect: 'elastic',
                padding: 0,
                centerOnScroll: true,
                helpers: {
                    title: {
                        type: 'float'
                    }
                }
            });
        }
    
        var myfall = waterfall('coont', 3, 860, 274, 14, 20, getData, onFinish);
        $(window).bind("scroll", myfall);
        myfall();
    });
    
    
    function getLength(str, i) {
        var s = str.toString();
        if (s) {
            if (s.length > i) {
                return s.substring(0, i);
            } else {
                return s;
            }
        } else {
            return "";
        }
    }
    

      

  • 相关阅读:
    C++笔记 谓词 1
    win7 ipv6设置(isatap)
    C++笔记
    打水印
    jquery导航滚动固定在顶部
    javascript获得属性
    tr光棒效果
    按字母查找
    js购物车
    数据采集
  • 原文地址:https://www.cnblogs.com/wj033/p/5370432.html
Copyright © 2011-2022 走看看