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 相关文章推荐
javascript学习之闭包分析
Dec 02 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
用JavaScript实现动画效果的方法
Jul 20 Javascript
jQuery判断checkbox是否选中的3种方法
Aug 12 Javascript
JQuery球队选择实例
May 18 Javascript
jQuery ajax应用总结
Jun 02 Javascript
Angular工具方法学习
Dec 26 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
微信小程序mpvue点击按钮获取button值的方法
May 29 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
Sep 04 Javascript
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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
php for 循环使用的简单实例
2016/06/02 PHP
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
AngularJS内置指令
2015/02/04 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
JS写滑稽笑脸运动效果
2020/05/28 Javascript
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
后勤岗位职责
2013/11/26 职场文书
学生自我鉴定模板
2013/12/30 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
个人投资计划书
2014/05/01 职场文书
医院合作协议书
2014/08/19 职场文书
铅球加油稿100字
2014/09/26 职场文书
北京英文导游词
2015/02/12 职场文书
留学推荐信中文范文
2015/03/26 职场文书
德能勤绩工作总结
2015/08/11 职场文书
感恩的心主题班会
2015/08/12 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
Go语言基础知识点介绍
2021/07/04 Golang