js实现瀑布流的一种简单方法实例分享

前端技术 2023/09/07 JavaScript

下面奉上一则用JS实现瀑布流的方法,望批评。

复制代码 代码如下:

<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<title>瀑布流布局测试</title>
<style>
body {
    background-color: #eee;
    font-size: 84%;
    text-align: justify;
}
.column {
    display: inline-block;
    vertical-align: top;
}
.pic_a {
    display: block;
    padding: 5px;
    margin-bottom: 10px;
    border: 1px solid #ccc;
    background-color: #fff;
    text-decoration: none;
}
.pic_a img {
    display: block;
    margin: 0 auto 5px;
    border: 0;
    vertical-align: bottom;
}
.pic_a strong {
    color: #333;
}
</style>
</head>

<body>
<div id=\"container\"></div>
<script>
var waterFall = {
    container: document.getElementById(\"container\"),
    columnNumber: 1,
    columnWidth: 210,
    // P_001.jpg ~ P_160.jpg
    rootImage: \"test/\",
    indexImage: 0,

    scrollTop: document.documentElement.scrollTop || document.body.scrollTop,
    detectLeft: 0,

    loadFinish: false,

    // 返回固定格式的图片名
    getIndex: function() {
        var index = this.indexImage;
        if (index < 10) {
            index = \"00\" + index;   
        } else if (index < 100) {
            index = \"0\" + index;   
        }
        return index;
    },

    // 是否滚动载入的检测
    appendDetect: function() {
        var start = 0;
        for (start; start < this.columnNumber; start++) {
            var eleColumn = document.getElementById(\"waterFallColumn_\" + start);
            if (eleColumn && !this.loadFinish) {
                if (eleColumn.offsetTop + eleColumn.clientHeight < this.scrollTop + (window.innerHeight || document.documentElement.clientHeight)) {
                    this.append(eleColumn);
                }
            }           
        }

        return this;
    },

    // 滚动载入
    append: function(column) {
        this.indexImage += 1;
        var html = \'\', index = this.getIndex(), imgUrl = this.rootImage + \"P_\" + index + \".jpg\";

        // 图片尺寸
        var aEle = document.createElement(\"a\");
        aEle.href = \"###\";
        aEle.className = \"pic_a\";
        aEle.innerHTML = \'<img src=\"\'+ imgUrl +\'\" /><strong>\'+ index +\'</strong>\';
        column.appendChild(aEle);

        if (index >= 160) {
            //alert(\"图片加载光光了!\");
            this.loadFinish = true;
        }

        return this;
    },

    // 页面加载初始创建
    create: function() {
        this.columnNumber = Math.floor(document.body.clientWidth / this.columnWidth);

        var start = 0, htmlColumn = \'\', self = this;
        for (start; start < this.columnNumber; start+=1) {
            htmlColumn = htmlColumn + \'<span id=\"waterFallColumn_\'+ start +\'\" class=\"column\" style=\"width:\'+ this.columnWidth +\'px;\">\'+
                function() {
                    var html = \'\', i = 0;
                    for (i=0; i<5; i+=1) {
                        self.indexImage = start + self.columnNumber * i;
                        var index = self.getIndex();
                        html = html + \'<a href=\"###\" class=\"pic_a\"><img src=\"\'+ self.rootImage + \"P_\" + index +\'.jpg\" /><strong>\'+ index +\'</strong></a>\';
                    }
                    return html;   
                }() +
            \'</span> \';   
        }
        htmlColumn += \'<span id=\"waterFallDetect\" class=\"column\" style=\"width:\'+ this.columnWidth +\'px;\"></span>\';

        this.container.innerHTML = htmlColumn;

        this.detectLeft = document.getElementById(\"waterFallDetect\").offsetLeft;
        return this;
    },

    refresh: function() {
        var arrHtml = [], arrTemp = [], htmlAll = \'\', start = 0, maxLength = 0;
        for (start; start < this.columnNumber; start+=1) {
            var arrColumn = document.getElementById(\"waterFallColumn_\" + start).innerHTML.match(/<a(?:.|\\n|\\r|\\s)*?a>/gi);
            if (arrColumn) {
                maxLength = Math.max(maxLength, arrColumn.length);
                // arrTemp是一个二维数组
                arrTemp.push(arrColumn);
            }
        }

        // 需要重新排序
        var lengthStart, arrStart;
        for (lengthStart = 0; lengthStart<maxLength; lengthStart++) {
            for (arrStart = 0; arrStart<this.columnNumber; arrStart++) {
                if (arrTemp[arrStart][lengthStart]) {
                    arrHtml.push(arrTemp[arrStart][lengthStart]);   
                }
            }   
        }

       
        if (arrHtml && arrHtml.length !== 0) {
            // 新栏个数       
            this.columnNumber = Math.floor(document.body.clientWidth / this.columnWidth);

            // 计算每列的行数
            // 向下取整
            var line = Math.floor(arrHtml.length / this.columnNumber);

            // 重新组装HTML
            var newStart = 0, htmlColumn = \'\', self = this;
            for (newStart; newStart < this.columnNumber; newStart+=1) {
                htmlColumn = htmlColumn + \'<span id=\"waterFallColumn_\'+ newStart +\'\" class=\"column\" style=\"width:\'+ this.columnWidth +\'px;\">\'+
                    function() {
                        var html = \'\', i = 0;
                        for (i=0; i<line; i+=1) {
                            html += arrHtml[newStart + self.columnNumber * i];
                        }
                        // 是否补足余数
                        html = html + (arrHtml[newStart + self.columnNumber * line] || \'\');

                        return html;   
                    }() +
                \'</span> \';   
            }
            htmlColumn += \'<span id=\"waterFallDetect\" class=\"column\" style=\"width:\'+ this.columnWidth +\'px;\"></span>\';

            this.container.innerHTML = htmlColumn;

            this.detectLeft = document.getElementById(\"waterFallDetect\").offsetLeft;

            // 检测
            this.appendDetect();
        }
        return this;
    },

    // 滚动加载
    scroll: function() {
        var self = this;
        window.onscroll = function() {
            // 为提高性能,滚动前后距离大于100像素再处理
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            if (!this.loadFinish && Math.abs(scrollTop - self.scrollTop) > 100) {
                self.scrollTop = scrollTop;
                self.appendDetect();   
            }

        };
        return this;
    },

    // 浏览器窗口大小变换
    resize: function() {
        var self = this;
        window.onresize = function() {
            var eleDetect = document.getElementById(\"waterFallDetect\"), detectLeft = eleDetect && eleDetect.offsetLeft;
            if (detectLeft && Math.abs(detectLeft - self.detectLeft) > 50) {
                // 检测标签偏移异常,认为布局要改变
                self.refresh();   
            }
        };
        return this;
    },
    init: function() {
        if (this.container) {
            this.create().scroll().resize();   
        }
    }
};
waterFall.init();
</script>
</body>
</html>

本文地址:https://www.stayed.cn/item/19415

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。