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. VS 生成事件

    转载自: http://hi.baidu.com/gisince/item/7f0439ee610c94255a2d64b4 今天写了生成事件的处理,如下: 从网上Down了一个例子,运行时提示错误 ...

  2. [LeetCode] Number of Digit One 数字1的个数

    Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...

  3. [LeetCode] Linked List Cycle 单链表中的环

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  4. c#中多线程同步Lock(锁)的研究以及跨线程UI的操作

    本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...

  5. web 前端常用组件【07】弹出层 Layer

    web 项目中总是需要弹出框,来让用户进行下一步的操作. 大到弹出另外一个页面,小到弹出提示.确认等. 经手几个项目,还是感觉 Layer 用起来比较的轻松,你能想到的 Layer 都能帮你做到. 感 ...

  6. [开源].NET高性能框架Chloe.ORM-完美支持SQLite

    扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...

  7. 攻城记:Thinkphp框架的项目规划总结和踩坑经验

    一.项目模块规划 1.项目分为PC端.移动端.和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin: 对应入口 ...

  8. LTE中的各种ID含义

    原文链接:http://www.hropt.com/ask/?q-7128.html ECI (28 Bits) = eNB ID(20 Bits) + Cell ID(8 Bits) 换成16进制就 ...

  9. websocket初探

    本文尚未完成,在此只写一些句子,以后慢慢整理. 一.参数 IllegalArgumentException No payload parameter present on the method[mes ...

  10. js或css文件后面的参数是什么意思?

    经常看到不少导航网站测样式或js文件后面加了一些参数,主要是一你为一些并不经常更新的页面重新加载新修改的文件. 经常遇到页面里加载的js与css文件带有参数,比如: <script type=& ...