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 原生实现的更多相关文章

  1. 面向对象js瀑布流效果

    index.html <!doctype html><html lang="en"> <head>  <!--网站编码格式,UTF-8 国 ...

  2. 【js】【图片瀑布流】js瀑布流显示图片20180315

    js实现把图片用瀑布流显示,只需要“jquery-1.11.2.min.js”. js: //瀑布流显示图片 var WaterfallImg = { option: { maxWidth: 850, ...

  3. 分享:纯 css 瀑布流 和 js 瀑布流

    分享一次纯 css 瀑布流  和 js 瀑布流 纯 css 写瀑布流 1.multi-columns 方式: 通过 Multi-columns 相关的属性 column-count.column-ga ...

  4. JS 瀑布流效果

    JS瀑布流效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  5. 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)

    瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...

  6. 比较容易理解的---原生js瀑布流

    最近一直在恶补基础JS H5 CSS3的基础知识 关于这个瀑布流: 本来打算看着教程来做的. 不过 感觉理解起来有点复杂. SO, 自己参考教程默写了一个.. 目前我所接触过的瀑布流布局分为2大类 主 ...

  7. js瀑布流(定位法)

    1.首先,自己写好图片路径,引入jquery <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  8. javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】

    先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pin ...

  9. JS瀑布流效果

    本篇内容实现类似百度图片的呈现功能,瀑布流+自动加载 index13.html <!DOCTYPE html> <html> <head> <meta cha ...

随机推荐

  1. [No00009D]使用visual studio 2015 update3打包程序安装包的简单方法(不需要InstallShield)

    注意: 该方法只适用于小型软件的打包发布: 该打包向导可以预先检查需要的运行库支持: 由于visual studio自2012后取消掉了自带的打包程序,如果有需要打包安装,需要使用一个叫用Instal ...

  2. [LeetCode] Insert Delete GetRandom O(1) 常数时间内插入删除和获得随机数

    Design a data structure that supports all following operations in average O(1) time. insert(val): In ...

  3. [LeetCode] Remove Element 移除元素

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  4. java之并发编程线程池的学习

    如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. java.uitl.concurrent.Thre ...

  5. 用上了ReSharper

    用上了ReSharper,发现很爽1.使用var2.去掉无用的using3.将foreach改为linq let4.字符串为cost5.作用域与变量名适配6.文件夹与namespace不匹配7.去掉为 ...

  6. Jmeter学习笔记ONE

    最近想学一些关于性能测试方面的知识,其实之前已经初步了解了Jmeter工具,它是一个轻量级的性能测试工具,开源并且免费,相比于Loadrunner来说用起来更简便. JMeter 可以用于对服务器.网 ...

  7. js获取当前域名、Url、相对路径和参数以及指定参数

    一.js获取当前域名有2种方法 1.方法一 var domain = document.domain; 2.方法二 var domain = window.location.host; 3.注意问题 ...

  8. JavaIO学习笔记(五)

    JavaIO前期准备 什么是同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 什么是异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO ...

  9. iOS dealloc 不被调用的问题

    最近项目中老是无缘无故的出现一下奔溃.查看一下堆栈信息,指针的指向都有,但还是奔溃.所以第一个怀疑出现野指针引起的问题.然后调试代码中的一下dealloc函数.好多对象在释放之后都没掉用.顿时吓出一身 ...

  10. js修改伪类的值

    css文件 p.change:after { content: attr(data-content); } js文件 $(this).addClass('change').attr('data-con ...