js实现瀑布流布局
window.onload = function () {
var d1 = new Waterfall();
d1.init();
};
//构造函数
function Waterfall() {
this.oColNum =null;//显示列数
this.oData = null; //存储请求数据
this.settings ={
width:300,
autoLoad:true
}
}
//初始化方法
Waterfall.prototype.init = function (opt) {
extend(this.settings,opt);
this.requestData();
var that = this;
window.onresize = function(){
that.init();
};
//滚动无限加载
if(this.settings.autoLoad){
// var that = this;
window.onscroll = function(){
if(getScrollTop() + getWindowHeight() == getScrollHeight()){
that.recreateEle();
}
};
}
};
//创建item
Waterfall.prototype.createItem = function (Data) {
var owater = document.getElementById("water-content");
var html="";
this.oData = Data;
var _this = this;
// console.log(this.oData.waterfall);
this.oData.waterfall.forEach(function (item,index) {
html +='<div class="waterfall-item" style="width: '+_this.settings.width+"px"+'"><div class="waterfall-img"><img class="waterfall-images" src="'+item.src+'"></div><div class="info"><span>'+item.name+'</span></div></div>';
});
owater.innerHTML=html;
};
//请求获取数据
Waterfall.prototype.requestData =function () {
var xmlhttp;
var data=null;
var _this=this;
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
data=eval('(' +xmlhttp.responseText+ ')');
//渲染数据
_this.createItem(data);
//存储img的src
var src =document.getElementsByClassName("waterfall-images");
//循环遍历创建 new Image;对象,保证onload事件执行,以获取加载img的div高度
for(var i = 0; i<src.length;i++){
var img = new Image();
img.onload =function () {
// console.log(img.src);
//设置位置样式
_this.setWaterfall();
};
img.src = src[i].src;
}
}
};
xmlhttp.open("GET","waterfall.json",true);
xmlhttp.send();
};
//排版布局
Waterfall.prototype.setWaterfall = function () {
this.oColNum = parseInt(viewWidth()/this.settings.width);
var oColNumHeight = [];//存储每一列的高度
for(var i = 0;i<this.oColNum;i++){
oColNumHeight.push(0);
}
var items =document.getElementsByClassName("waterfall-item");
//遍历设置元素位置
for(var i = 0; i < items.length; i++){
var curEle = items[i],
idx = 0;//存储最小值对应索引
var minHeight = oColNumHeight[0];//临时存储最小高度
//获取最小高度,以放置元素
for(var j = 0; j < oColNumHeight.length; j++){
if( minHeight >oColNumHeight[j]){
minHeight = oColNumHeight[j];
idx = j;
}
}
//设置元素位置
curEle.style.left = curEle.offsetWidth * idx +"px";
curEle.style.top = minHeight + "px";
// //更新每列的高度数据
oColNumHeight[idx] = oColNumHeight[idx]+ curEle.offsetHeight;
}
// for (var i = 0; i<items.length ;i++){
// items[i].className = 'waterfall-item';
// }
// items.forEach(function (item,index) {
// var curEle = item,
// idx =0,
// minHeight = that.oColNumHeight[0];
// for(var i = 0; i<that.oColNumHeight.length;i++){
// if(minHeight>that.oColNumHeight[i]){
// minHeight = that.oColNumHeight[i];
// idx = i;
// }
// }
// curEle.style.left = that.settings.width*idx +"px";
// curEle.style.top = minHeight + "px";
// that.oColNumHeight[idx] = minHeight + curEle.style.height;
//
// })
};
//滚动无限加载
Waterfall.prototype.recreateEle = function () {
var dataSrc = {
"data":[
{
"src":"1.jpg",
"name":"重加载!"
},
{
"src":"5.jpg",
"name":"重加载!"
},
{
"src":"3.jpg",
"name":"重加载!"
},
{
"src":"6.jpg",
"name":"重加载!"
},
{
"src":"9.jpg",
"name":"重加载!"
},
{
"src":"8.jpg",
"name":"重加载!"
},
{
"src":"1.jpg",
"name":"重加载!"
},
{
"src":"5.jpg",
"name":"重加载!"
},
{
"src":"3.jpg",
"name":"重加载!"
},
{
"src":"6.jpg",
"name":"重加载!"
},
{
"src":"9.jpg",
"name":"重加载!"
},
{
"src":"8.jpg",
"name":"重加载!"
}
]
};
var _this =this;
var oDiv = document.getElementById("water-content");
// <div class="waterfall-img"><img class="waterfall-images" src="'+item.src+'"></div><div class="info"><span>'+item.name+'</span></div>
//创建加载的元素
for (var i = 0; i < dataSrc.data.length;i++){
var oItem = document.createElement("div");
oItem.className = "waterfall-item";
oItem.style.width = _this.settings.width +'px';
oDiv.appendChild(oItem);
var oItemImg = document.createElement("div");
oItemImg.className = 'waterfall-img';
oItem.appendChild(oItemImg);
var oImg = document.createElement("img");
oImg.className = 'waterfall-images';
oImg.src =dataSrc.data[i].src;
oItemImg.appendChild(oImg);
var oInfoDiv = document.createElement("div");
oInfoDiv.className = 'info';
oItem.appendChild(oInfoDiv);
var oSpan = document.createElement("span");
oSpan.innerHTML = dataSrc.data[i].name;
oInfoDiv.appendChild(oSpan);
}
//存储img的src
var src =document.getElementsByClassName("waterfall-images");
// console.log(src);
//循环遍历创建 new Image;对象,保证onload事件执行,以获取加载img的div高度
for(var i = src.length - 1; i > src.length - dataSrc.data.length;i--){
var img = new Image();
img.onload =function () {
//设置位置样式
_this.setWaterfall();
// console.log('.....')
};
img.src = src[i].src;
}
};
//获取浏览器可视宽度
function viewWidth() {
return document.documentElement.clientWidth;
}
//实现复制
function extend(obj1,obj2) {
for(var attr in obj2){
obj1[attr] = obj2[attr];
}
}
//滚动条在Y轴上的滚动距离
function getScrollTop(){
var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;
if(document.body){
bodyScrollTop = document.body.scrollTop;
}
if(document.documentElement){
documentScrollTop = document.documentElement.scrollTop;
}
scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;
return scrollTop;
}
//文档的总高度
function getScrollHeight(){
var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;
if(document.body){
bodyScrollHeight = document.body.scrollHeight;
}
if(document.documentElement){
documentScrollHeight = document.documentElement.scrollHeight;
}
scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;
return scrollHeight;
}
//浏览器视口的高度
function getWindowHeight(){
var windowHeight = 0;
if(document.compatMode == "CSS1Compat"){
windowHeight = document.documentElement.clientHeight;
}else{
windowHeight = document.body.clientHeight;
}
return windowHeight;
}
js实现瀑布流布局的更多相关文章
- 纯js实现瀑布流布局及ajax动态新增数据
本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax ...
- js网页瀑布流布局
瀑布流布局思路: 1.css样式,图片的父级div样式设置为定位或者浮动 2.找出图片父级元素(box)和最外元素(main):获取box的宽度和main的宽,然后计算main容器一行能容纳多少个bo ...
- 原生JS实现瀑布流布局
瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 1.首先瀑布流所有的图片应该保持宽度一致,高 ...
- JS案例之6——瀑布流布局(1)
在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...
- JS 瀑布流布局
瀑布流布局 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- JS瀑布流布局模式(1)
在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...
- JS瀑布流布局
好久没有更新博客喽,今天来说一个瀑布流布局. 瀑布流在很多网站已有很多,现在只说一下简单的实现原理吧, 1.计算一行可以排放几个元素 2.建立一个数组用于存放第一行的每个元素的高度. 3.得到数组中的 ...
- js实现网页瀑布流布局
效果图: html代码实现网页布局: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- 瀑布流布局js
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
随机推荐
- HDU1102&&POJ2421 Constructing Roads 2017-04-12 19:09 44人阅读 评论(0) 收藏
Constructing Roads Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- MFC中的一般经验之谈3
Window消息可以分为三类:(1)标准Window消息(CWnd子类处理),(2)控制通知消息(CWnd子类处理),(3)命令消息(应用中的5类都可以).所有派生自CCmdObjec对象的类都可以处 ...
- Quartus II 软件生成FFT、NCO、FIR等IP核时卡住不动的解决办法
据网友表示,遇到这个问题时,在任务管理器中手动关闭quartus_map进程就可以了,由于我的电脑最近一直没有出问题,因此也无法验证.欢迎大家针对这个问题讨论,提出肯定.否定的说法. 另外,很多人表示 ...
- handsontable-cell type
在单元格中呈现自定义的元素:不能使用html元素 var data = [ { title: "<a href='http://www.amazon.com/Professional- ...
- 基于Struts2开发学生信息管理系统 源码
开发环境: Windows操作系统开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: 联系博主-Q:782827013
- ADB server didn't ACK问题,连上手机问题(转)
出现如下情况 ADB server didn't ACK* failed to start daemon * 解决办法: 方法一: (1)查看任务管理器,关闭所有adb.exe,或者运行->cm ...
- Radius 认证协议介绍-兼rfc导读
老规矩, 先看维基: 远端用户拨入验证服务(RADIUS, Remote Authentication Dial In User Service)是一个AAA协议,意思就是同时兼顾验证(authent ...
- Dockerfile文件参数详解
参考: https://www.jianshu.com/p/e4b31ca37043 https://blog.csdn.net/u010246789/article/details/54139168 ...
- js 倒计时,转义
function leftTimer(time) { var leftTime = (new Date(time)) - (new Date()); //计算剩余的毫秒数 var days = par ...
- 开源日志收集Exceptionless简单使用
这两天在研究一个开源的日志收集工具Exceptionless 官网地址:https://exceptionless.com/GitHub地址:https://github.com/exceptionl ...