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. NodeJS、NPM安装配置步骤(windows版本)

    windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的"INSTA ...

  2. JavaScript 汉字与拼音互转终极方案 附JS拼音输入法

    转:http://www.codeceo.com/article/javascript-pinyin.html 前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的 ...

  3. TypeScript 素描 - 类

    本文虽然是学自官方教程而来,但是也融入了自己的理解,而且对官方的例子做了一些修改 /* 类 面向对象编程的一大核心 使用C#.Java进行编程的朋友肯定已经是不能够再熟悉了 TypeScript的类与 ...

  4. [LeetCode] Valid Perfect Square 检验完全平方数

    Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...

  5. [LeetCode] Maximum Product Subarray 求最大子数组乘积

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  6. [LeetCode] Recover Binary Search Tree 复原二叉搜索树

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  7. MySQL字符串函数substring:字符串截取

    MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...

  8. Ajax跨域实现

    Ajax Ajax,Asynchronus JavaScript and XML,字母意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术.用于异步地去获取XML作 ...

  9. oracle存储过程

    1.存储过程定义 储存程序 (Stored Procedure),又可称预储程序或者存储过程,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序.-- ...

  10. BZOJ 4742: [Usaco2016 Dec]Team Building

    4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 16[Su ...