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 相关文章推荐
JQuery 写的个性导航菜单
Dec 24 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
Sep 12 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
jquery实现无限分级横向导航菜单的方法
Mar 12 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
理解JavaScript原型链
Oct 25 Javascript
ES5学习教程之Array对象
Apr 01 Javascript
react中的ajax封装实例详解
Oct 17 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
package.json配置文件构成详解
Aug 27 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 03 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
js html实现计算器功能
2018/11/13 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python中的默认参数实例分析
2018/01/29 Python
python实现输入数字的连续加减方法
2018/06/22 Python
python 对key为时间的dict排序方法
2018/10/17 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python的concat等多种用法详解
2018/11/28 Python
python实现密码强度校验
2020/03/18 Python
Python包和模块的分发详细介绍
2020/06/19 Python
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
查环查孕证明
2014/01/10 职场文书
村干部培训方案
2014/05/02 职场文书
社区志愿者培训方案
2014/06/10 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
五四青年节活动总结
2015/02/10 职场文书
好员工观后感
2015/06/17 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏