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


Posted in Javascript onNovember 04, 2013

下面奉上一则用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>
Javascript 相关文章推荐
通过身份证号得到出生日期和性别的js代码
Nov 23 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
Apr 02 Javascript
VS2008中使用JavaScript调用WebServices
Dec 18 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
Sep 04 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
Jquery实时监听input value的实例
Jan 26 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
Jun 16 Javascript
vue获取当前激活路由的方法
Mar 17 Javascript
JavaScript引用类型Date常见用法实例分析
Aug 08 Javascript
vue-video-player 断点续播的实现
Feb 01 Vue.js
jquery监听div内容的变化具体实现思路
Nov 04 #Javascript
让新消息在网页标题闪烁提示的jQuery代码
Nov 04 #Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
Nov 04 #Javascript
浅析return false的正确使用
Nov 04 #Javascript
javascript与jquery中跳出循环的区别总结
Nov 04 #Javascript
js中apply方法的使用详细解析
Nov 04 #Javascript
js数组操作学习总结
Nov 04 #Javascript
You might like
php字符串分割函数用法实例
2015/03/17 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
异步加载script的代码
2011/01/12 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
Python用threading实现多线程详解
2017/02/03 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
python保存网页图片到本地的方法
2018/07/24 Python
python删除字符串中指定字符的方法
2018/08/13 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
python中time tzset()函数实例用法
2021/02/18 Python
自我评价怎么写正确呢?
2013/12/02 职场文书
会计工作心得体会
2014/01/13 职场文书
学生实习介绍信
2014/01/15 职场文书
邮政员工辞职信
2014/01/16 职场文书
《都江堰》教学反思
2014/02/07 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
大学校务公开实施方案
2014/03/31 职场文书
体育专业自荐书
2014/05/29 职场文书
个人违纪检讨书
2014/09/15 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
事业单位岗位说明书
2015/10/08 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL