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. Referenced file contains errors (http://www.springframework.org/schema...错误

    Referenced file contains errors (http://www.springframework.org/schema...错误 Referenced file contains ...

  2. dubbo/dubbox 增加原生thrift及avro支持

    (facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...

  3. CSS优先级

    一.CSS代码出现的几个位置 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下:(外部样式)Extern ...

  4. C/C++ 中的include

    当需要使用已有的方法或库时, 可以将它们的头文件#include进来. #include会在preprocess过程中被替换成它包含的代码. 头文件中包含了需要使用的函数/变量的声明. 当然声明与定义 ...

  5. 输入流和字符串互转,InputStream2String,String2InputStream

    输入流转字符串 public static String InputStream2String(InputStream in) { InputStreamReader reader = null; t ...

  6. 获取文件的缩略图Thumbnail和通过 AQS - Advanced Query Syntax 搜索本地文件

    演示如何获取文件的缩略图 FileSystem/ThumbnailAccess.xaml <Page x:Class="XamlDemo.FileSystem.ThumbnailAcc ...

  7. AngularJs的$http发送POST请求,php无法接收Post的数据解决方案

      最近在使用AngularJs+Php开发中遇到php后台无法接收到来自AngularJs的数据,在网上也有许多解决方法,却都点到即止.多番摸索后记录下解决方法:tips:当前使用的AngularJ ...

  8. 在非UI线程中自制Dispatcher

    在C#中,Task.Run当然是一个很好的启动新并行任务的机制,但是因为使用这个方法时,每次新的任务都会在一个新的线程中(其实就是线程池中的线程)运行 这样会造成某些情形下现场调度的相对困难,即使我隔 ...

  9. sass 安装、配置,css规则

    http://blog.csdn.net/oyuemijindu/article/details/51036096 --sass 安装 一安装  1.ruby下载,可以到官网下载 ,注意如果是系统如果 ...

  10. 浅谈:javascript的面向对象编程之具体实现

    下面的javascript代码都是需要使用jQuery插件来做的.希望大家可以搭建好工作环境 首先我们来做一个练习:在一个删除的超链接中添加一个提示信息,提示是否确认删除. 一般情况下我们都会这么做 ...