js瀑布流 原理实现揭秘 javascript 原生实现
web,js瀑布流揭秘
瀑布流再很久之前流行,可能如我一样入行晚的 ,可能就没有机会去使用。但是这个技术终究是个挺炫酷的东西,花了一个上午来研究,用原生js实现了一个,下面会附上源码,供大家解读。
说起瀑布流,其实实现原理特别简单,而且方法有很多,现在说一个大众的方法,所谓瀑布流就是 一堆样式差不多的 盒子排列在一起,排列规则是,插入到高度最低的那一列,所以,实现起来就很简单了,布局分 块,页面分列,计算每一列的高度,然后把块插入到列高度低的那一列,设置定位,left和top值就好了。
1.从布局开始,基本布局如下:
<div id="main">
<div class="box"><div class="fig"><img src="xxxx"></div></div>
</div>
main为父级大容器,用来盛放 块 box,所有的box都一样的
2.style样式,基本样式如下:
*{padding: 0; margin: 0; box-sizing: border-box; -webkit-transition: all .3s;}
#main{
position: relative; //因为box要绝对定位,所以给父级设置相对定位
}
.box{
padding: 10px 5px 5px 10px;
float: left;
}
.fig{border: 1px #ccc solid; border-radius: 4px; box-shadow: 0 0 5px rgba(0,0,0,.6); padding: 5px;}
.fig img{width: 200px;}
3. 主要js如下:
;(function ($){
function show(el){
el.style.display = 'block';
}
function hide(el){
el.style.display = 'none';
}
function getById(id){
return document.getElementById(id);
}
function getByClass(name,parent){
var parent = parent ? document.getElementById(parent) : document;
var eles = document.getElementsByTagName('*');
var result = [];
for(var i=0, len = eles.length; i < len; i++){
if(eles[i].className == name){
result.push(eles[i]);
}
}
return result;
}
function getIndex(arr,val){
for(var i in arr){
if(arr[i] == val){
return i;
}
}
return -1;
}
var elMark = getById('Mark');
var baseUrl = "./images/";
var dataImg = {
"data" : [
{"src": '1.jpg'},
{"src": '2.jpg'},
{"src": '3.jpg'},
{"src": '4.jpg'},
{"src": '5.jpg'},
{"src": '6.jpg'},
{"src": '7.jpg'},
{"src": '8.jpg'},
{"src": '9.jpg'},
{"src": '10.jpg'},
{"src": '1.jpg'},
{"src": '2.jpg'},
{"src": '3.jpg'},
{"src": '4.jpg'},
{"src": '5.jpg'},
{"src": '6.jpg'},
{"src": '7.jpg'},
{"src": '8.jpg'},
{"src": '9.jpg'},
{"src": '10.jpg'}
]
}
function WaterFull(insName){
this.instance = insName;
this.wrap = '';
this.box = '';
this.elwrap = '';
}
WaterFull.prototype = {
init : function (parent, box){
this.wrap = parent;
this.box = box;
this.elwrap = getById(parent);
this.insertHtml();
},
insertHtml : function (){
show(elMark);
var self = this;
for(var i=0, len = dataImg.data.length; i < len; i++){
var url = baseUrl + dataImg.data[i].src;
self.elwrap.appendChild(self.creatHtml(url));
}
setTimeout(function (){
self.setPosition();
hide(elMark);
},400);
},
creatHtml : function (url){
var box = document.createElement('div');
box.className = this.box;
var fig = document.createElement('div');
fig.className = 'fig';
box.appendChild(fig);
var img = new Image();
img.src = url;
fig.appendChild(img);
return box;
},
setPosition : function (){
var hArr = [];
var boxs = getByClass(this.box, this.wrap);
var boxW = boxs[0].offsetWidth;
var cols = Math.floor(document.body.clientWidth / boxW);
this.elwrap.style.cssText = 'width: '+cols*boxW+'px;'+'margin: 0 auto;';
for(var i=0, len = boxs.length; i < len; i++){
if(i<cols){
boxs[i].style.position = 'static';
hArr.push(boxs[i].offsetHeight);
}else{
var minH = Math.min.apply(null, hArr);
var colsIndex = getIndex(hArr, minH)
if(colsIndex == -1){
alert("查询失败");
return false;
}
boxs[i].style.cssText = "position: absolute; top: "+minH+"px;"+"left: "+boxW*colsIndex+"px";
hArr[colsIndex] += boxs[i].offsetHeight;
}
}
},
checkLoad : function (){
var boxs = getByClass(this.box, this.wrap);
var lastH = boxs[boxs.length -1].offsetTop + boxs[boxs.length -1].offsetHeight;
var loadH = document.documentElement.clientHeight + document.body.scrollTop || document.documentElement.scrollTop;
return lastH < loadH;
}
}
function main(){
var waterfull = new WaterFull();
waterfull.init('main','box');
window.onscroll = function (){
if(waterfull.checkLoad.call(waterfull)){
waterfull.insertHtml.call(waterfull);
}
}
window.onresize = function (){
waterfull.setPosition.call(waterfull);
}
}
$.main = main;
}(this))
全部js都在,如果需要全套代码的 ,麻烦联系我一下哈,QQ号:309093631
更多内容会经常更新,谢谢关注!!!
js瀑布流 原理实现揭秘 javascript 原生实现的更多相关文章
- 面向对象js瀑布流效果
index.html <!doctype html><html lang="en"> <head> <!--网站编码格式,UTF-8 国 ...
- 【js】【图片瀑布流】js瀑布流显示图片20180315
js实现把图片用瀑布流显示,只需要“jquery-1.11.2.min.js”. js: //瀑布流显示图片 var WaterfallImg = { option: { maxWidth: 850, ...
- 分享:纯 css 瀑布流 和 js 瀑布流
分享一次纯 css 瀑布流 和 js 瀑布流 纯 css 写瀑布流 1.multi-columns 方式: 通过 Multi-columns 相关的属性 column-count.column-ga ...
- JS 瀑布流效果
JS瀑布流效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...
- 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...
- 比较容易理解的---原生js瀑布流
最近一直在恶补基础JS H5 CSS3的基础知识 关于这个瀑布流: 本来打算看着教程来做的. 不过 感觉理解起来有点复杂. SO, 自己参考教程默写了一个.. 目前我所接触过的瀑布流布局分为2大类 主 ...
- js瀑布流(定位法)
1.首先,自己写好图片路径,引入jquery <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】
先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pin ...
- JS瀑布流效果
本篇内容实现类似百度图片的呈现功能,瀑布流+自动加载 index13.html <!DOCTYPE html> <html> <head> <meta cha ...
随机推荐
- jenkins邮件配置
jenkins自带的邮件管理太弱了,为了能按自定义的方式发送邮件,需要安装一个插件: Jenkins Email Extension Plugin. 1.配置邮件:通过"系统管理&quo ...
- [No00008A]bat改变cmd命令提示符颜色
从Windows 95到现在的Windows 10,系统中带的DOS命令提示符软件都是黑白画面,下面教大家几个自定义DOS命令提示符颜色的小技巧. 改变DOS命令提示符的标题:在开始菜单点运行,输入 ...
- Linux 进程与线程五
pthread_self函数 pthread_t pthread_self(void); 一般会成功,返回当前线程的ID 注意:在子线程中执行exit()函数会退出整个进程,一般使用pthread_e ...
- [LeetCode] Two Sum III - Data structure design 两数之和之三 - 数据结构设计
Design and implement a TwoSum class. It should support the following operations:add and find. add - ...
- 【原创】Chrome最新版(53-55)再次爆出BUG!
前言 今年十月份,我曾发布一篇文章<Chrome53 最新版惊现无厘头卡死 BUG!>,不过那个BUG在最新的 Chrome 54 中已经修正. 而今天即将发布的Chrome弱智BUG: ...
- LTE中的各种ID含义
原文链接:http://www.hropt.com/ask/?q-7128.html ECI (28 Bits) = eNB ID(20 Bits) + Cell ID(8 Bits) 换成16进制就 ...
- mysql判断一个字符串是否包含某子串
使用locate(substr,str)函数,如果包含,返回>0的数,否则返回0 例子:判断site表中的url是否包含'http://'子串,如果不包含则拼接在url字符串开头 update ...
- echarts-案例
关系图 http://echarts.baidu.com/echarts2/doc/example/force1.html http://www.cnblogs.com/spring_wang/p/4 ...
- NSRunLoop
1.什么是RunLoop 运行循环 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果 ...
- 【转】MipMap
原文地址http://www.cppblog.com/wc250en007/archive/2011/08/06/152653.html 首先从MIPMAP的原理说起,它是把一张贴图按照2的倍数进行缩 ...