javascript-实现简单瀑布流
直接上代码:
<style>
*{
margin:0;
padding:0;
}
.waterfall_item{
border:solid 3px #ccc;
box-shadow:1px 1px 3px #eee;
border-radius:8px;
font:normal 12px/22px 'Microsoft yahei';
text-align: center;
padding: 20px 0;
overflow: hidden;
}
</style> <script>
/**
瀑布流
分析:
瀑布流主要解决各个列的各元素的位置,以及各列的高度问题
*/
/**
瀑布流
分析:
瀑布流主要解决各个列的各元素的位置,以及各列的高度问题
确定一行有几列,每个元素之间的间隔大小。
获取各元素的高度,添加到面板,并确定每列的高度
属性:
panel//画板
items//要加载的项目
colNum//列数
col=[]//列数组
colLeft// 左间距
colTop// 上间距
方法:
init//初始化
refresh//刷新
setColNum//设置列数
setColLeft//设置左间距
setColTop//设置上间距
paint//添加到外框
refreshPanel//更新外部画板 */
function getStyle(o,name){
if(document.defaultView&&document.defaultView.getComputedStyle)
return document.defaultView.getComputedStyle(o,null)[name];
else
return o.currentStyle[name];
}
function waterfall(opts){
this.init(opts);
}
waterfall.prototype={
constructor:waterfall,
init:function(opts){
this.panel=opts.panel||document.body;//画板
this.items=opts.items||[];//要加载的项目
this.colNum=opts.colNum||3;//列数
this.colLeft=opts.colLeft||5;//左间距
this.colTop=opts.colTop||5;// 上间距
this._updated=false;
this.col=[];
this.initCol();
this.newItems=this.items;
this.draw(this.newItems);
},
initCol:function(){
//初始化列数组
for(var i=0,len=this.colNum;i<len;i++){
this.col[i]={
height:0,//高度
itemNum:0,//项目数
idx:i,
count:0
}
}
},
refresh:function(type){
var items;
if(this._updated){
if(type!=='append'){
this.initCol();
this.panel.innerHTML='';
items=this.items;
}else{
items=this.newItems;
}
this.draw(items);
}
},
_setUpdate:function(updated){
if(this._updated!=updated){
this._updated=updated;
}
},
setColNum:function(num){
if(num==this.colNum)return;
this._setUpdate(true);
this.colNum=num;
},
setColLeft:function(leftSpan){
this._setUpdate(true);
this.colLeft=leftSpan;
},
setColTop:function(topSpan){
this._setUpdate(true);
this.colLeft=leftSpan;
},
addItems:function(items){
this._setUpdate(true);
this.items=this.items.concat(items);
this.newItems=items;
},
draw:function(items){
var that=this,
i=0,
p=this.panel,
len=items.length;
for(;i<len;i++){
var r=Math.floor(i/this.colNum);
var w=parseInt(getStyle(p,'width'))/this.colNum-this.colLeft;
var curCol=this.getMinHeightCol();
var c=curCol.idx;
var t=curCol.height+this.colTop;
var l=c*(w+this.colLeft)+this.colLeft;
var oitem=this.createItem(w,l,t,items[i]);
p.appendChild(oitem);
var itemH=oitem.offsetHeight;
curCol.height=curCol.height+itemH+this.colTop;
curCol.count++;
p.style.height=curCol.height+'px';
}
},
createItem:function(w,l,t,html){
var oitem=document.createElement('div');
oitem.innerHTML=html;
oitem=oitem.firstChild;
oitem.style.position='absolute';
oitem.style.width=w+'px';
oitem.style.left=l+'px';
oitem.style.top=t+'px';
return oitem;
},
getMinHeightCol:function(){
var idx=0,minner=this.col[idx].height;
for(var i=0,len=this.colNum;i<len;i++){
if(minner>this.col[i].height){
minner=this.col[i].height;
idx=i; }
}
return this.col[idx];
}
} </script>
<div style="margin:0 auto">列:<input type="text" value='3' id="col_num" /><button id="refresh">刷新</button></div>
<div id="response_flow" class="response_flow" style="width:1000px;position:relative;"> </div>
<script>
//测试用例
var items=[
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' style='height:100px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='1.jpg' height='200' style='height:200px;' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>"
]
var colNum;
var refreshBtn=document.getElementById('refresh'); var panel=document.getElementById('response_flow'); var flow=new waterfall({
panel:panel,
items:items,
colLeft:20,
topLeft:20
})
//追加
var newItems=[
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='100' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'><img src='http://sandbox.runjs.cn/uploads/rs/392/w5zrkmek/1.jpg' height='200' /><br />asdfasdfasdf</div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>",
"<div class='waterfall_item'>asdfasdfasdf<br />asdfasdfasdf<br /></div>"
]; refreshBtn.onclick=function(){
colNum=document.getElementById('col_num').value;
flow.setColNum(colNum);
flow.refresh();
}
var toop=200;
var loadNum=1;
var maxNum=5;
var originTop=document.body.scrollHeight-document.documentElement.clientHeight;
window.onscroll=function(){
var to=document.body.scrollTop;
if(loadNum>maxNum)return;
if(to>loadNum*toop){
loadNum++;
flow.addItems(newItems)
flow.refresh('append')
}
}
window.onresize=function(){
flow._setUpdate(true);
flow.refresh();
} </script>
效果见:
javascript-实现简单瀑布流的更多相关文章
- iOS之简单瀑布流的实现
iOS之简单瀑布流的实现 前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionVie ...
- jquery实现简单瀑布流
瀑布流这个概念一直不是很理解,看到别人可以实现,自己弄了很久还是不能实现就很纠结.瀑布流这根刺就一直扎在我心里,一次偶然的机会看到别人实现了瀑布流,我想我是不是也应该再继续把这个未完成的任务画一个圆满 ...
- WPF下制作的简单瀑布流效果
最近又在搞点小东西,美化界面的时候发现瀑布流效果比较不错.顺便就搬到了WPF,下面是界面 我对WEB前端不熟,JS和CSS怎么实现的,我没去研究过,这里就说下WPF的实现思路,相当简单. 1.最重要的 ...
- JavaScript:实现瀑布流
一.前言: 瀑布流现在是一个非常常用的布局方式了,尤其在购物平台上,例如蘑菇街,淘宝等等. 二.流程: 1.在html文件中写出布局的元素内容: 2.在css文件中整体对每一个必要的元素进行样式和浮动 ...
- jquery实现简单瀑布流代码
测试环境:ie8 ff13.0.1 chrome22 可以将分页获取的内容依次填入四个div中,瀑布流的分页可以以多页(比如5页)为单位二次分页,这样可以减少后台算法的复杂度 <!DOCTYP ...
- Jquery简单瀑布流代码示例
最近很多网站都采用瀑布流风格设计,感觉挺有个性的,比较合适做图片类型的网站,没事仿开心网做一个瀑布流示例. 需要用到Jquery,jquery.masonry.min.js <!DOCTYPE ...
- 用原生JavaScript实现图片瀑布流的浏览效果
学习JS,活跃思维,灵活运用的一个较为典型的学习案例.同一个瀑布流的效果但实现方式却很多,利用递归.冒泡等等手法都可以达到你想要的目的.这次要说的就是利用类似递归来实现此效果的原创方案.此方案个人认为 ...
- 从零开始学习前端JAVASCRIPT — 11、JavaScript运动模型及轮播图效果、放大镜效果、自适应瀑布流
未完待续...... 一.运动原理 通过连续不断的改变物体的位置,而发生移动变化. 使用setInterval实现. 匀速运动:速度值一直保持不变. 多物体同时运动:将定时器绑设置为对象的一个属性. ...
- thinphp下拉获取更多瀑布流效果
html页面 <body> <script type="text/javascript" src="jquery.min.js">< ...
随机推荐
- Android 调用堆栈跟踪
Android开发中,我们也会经常遇到段错误,也就是SIGSEGV(11),这个时候libc的backtrace会打印出对应的堆栈信 息,而你看到的仅仅是一对数字,好像无从查起. 如下面这一从串断错误 ...
- 多线程的设计模式--Future模式,Master-Worker模式,生产者-消费者模式
代码示例: public interface Data { String getRequest(); } public class FutureData implements Data{ privat ...
- iOS 将金钱变为逗号形式
; NSNumberFormatter * formatter = [NSNumberFormatter new]; [formatter setNumberStyle:NSNumberFormatt ...
- Angular入门(三) 引入boostrap4
1.cnpm install ngx-bootstrap bootstrap --save ※可能缺少jquery cnpm i jquery 2. 打开 angular-cli.json (项目 ...
- 【JDF】学习和理解
一.资源地址 官方GitBub地址: putaoshu/jdf: Jingdong front-end integrated solution https://github.com/putaoshu/ ...
- php获取本地IP
function get_local_ip() { $preg = "/\A((([0-9]?[0-9])|(1[0-9]{2})|(2[0-4][0-9])|(25[0-5]))\.){3 ...
- [NSUserDefaults]的使用:登陆后不再显示登录界面。
简介: NSUserDefaults是IOS应用用来存储用户偏好和配置信息的途径,就像是一个数据库,但是它通过键值对(key-value)的方式存储. 比如["Thematrix" ...
- epoll浅析以及nio中的Selector
出处: https://my.oschina.net/hosee/blog/730598 首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference) ...
- 踩坑之jinja2注释问题(Flask中)
报错信息 jinja2.exceptions.TemplateSyntaxError jinja2.exceptions.TemplateSyntaxError: Expected an expr ...
- Vue(7)- vue-cookies、极验滑动验证geetest、vue-router的导航守卫
一.vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/vu ...