JS實現的圖片瀑布流

m45y 9年前發布 | 3K 次閱讀 JavaScript

(function ($) {
    $.fn.niceWall = function (options) {
        $.fn.niceWall.defaults = {
            "wrap": "body",
            "width": 200,
            "gap": 10,
            "url": "",
            "count": null,
            "callback": null
        };
        var opts = $.extend({}, $.fn.niceWall.defaults, options || {});
        //
        return this.each(function () {
            var $this = $(this);
            var colspanW = opts.width + opts.gap;
            var arrX = [];
            var arrY = [];
            var iPage = 0;
            var iBtn = true;
            var colspan = Math.floor($(opts.wrap).innerWidth() / colspanW);
            //
            function setLayer() {
                colspan = Math.floor($(window).innerWidth() / colspanW);
                $this.css("width", colspanW  colspan - opts.gap);
                for (var i = 0; i < colspan; i++) {
                    arrX[i] = colspanW  i;
                    arrY[i] = 0;
                }
            };
            setLayer();
            //
            function render() {
                if (!iBtn) return;
                iPage++;
                iBtn = false;
                $.getJSON(opts.url, { page: iPage }, function (data) {
                    $.each(data, function (index, element) {
                        console.log(element)
                        var oDiv = $("<div class='nice-wall'><p></p></div>");
                        var oImg = $("<img>");
                        var iH = (element.height / element.width) * opts.width;
                        oDiv.css({
                            "position": "absolute",
                            "width": opts.width + "px",
                            "height": iH + "px"
                        });
                        var _index = getMin();
                        oDiv.css({
                            "left": arrX[_index] + "px",
                            "top": arrY[_index] + "px"
                        });
                        arrY[_index] += iH + opts.gap;
                        //
                        oDiv.append(oImg);
                        $this.append(oDiv);

                    var hookImg = new Image();
                    hookImg.src = element.preview;
                    hookImg.onload = function () {
                        oImg.attr({
                            "src": this.src,
                            "href": element.image
                        });
                    };
                    //
                    iBtn = true;

                });
                //
                if (opts.callback) {
                    opts.callback();
                }
            });
        };
        render();
        //
        function getMin() {
            var v = arrY[0];
            var _index = 0;
            for (var i = 1; i < arrY.length; i++) {
                if (arrY[i] < v) {
                    v = arrY[i];
                    _index = i;
                }
            }
            return _index;
        };
        //
        $(window).off("scroll", srcollFn).on("scroll", srcollFn);
        //
        function srcollFn() {
            var stp = $(window).scrollTop() + $(window).innerHeight();
            var dH = $(document).height();
            var _index = getMin();
            if (arrY[_index] + 50 < stp) {
                render();
            }
        };

        //
        $(window).on("resize", function () {
            arrX = [];
            arrY = [];
            setLayer();
            //
            $this.find(".nice-wall").each(function () {
                var _index = getMin();
                $(this).animate({
                    "left": arrX[_index] + "px",
                    "top": arrY[_index] + "px"
                }, 400);
                arrY[_index] += $(this).height() + opts.gap;
            });
        });
    });
}

})(jQuery);</pre>

 本文由用戶 m45y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!