javascript实现仿百度图片的瀑布流加载效果


Posted in Javascript onApril 20, 2016

由于没有服务器,就用一个json字符串作为下拉时加载图片数据的来源了

html:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="js/waterfall.js"></script>
<style type="text/css">
 *{padding: 0;margin:0;}
 #main{
  position: relative;
 }
 .pin{
  padding: 15px 0 0 15px;
  float:left;
 }
 .box{
  padding: 10px;
  border:1px solid #ccc;
  box-shadow: 0 0 6px #ccc;
  border-radius: 5px;
 }
 .box img{
  width:162px;
  height:auto;
 }
</style>
</head>
<body>
<div id="main">
 <div class="pin">
  <div class="box">
   <img src="./images/1.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/2.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/3.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/4.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/5.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/6.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/7.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/8.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/9.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/10.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/11.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/12.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/13.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/14.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/15.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/16.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/17.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/18.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/19.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/20.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/21.jpg"/>
  </div>
 </div>
</div>
</body>
</html>

JSWallper.js:

window.onload=function(){
 
 waterfall('main','pin');
 
 var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
 
 window.onscroll=function(){
  if(checkscrollside()){
   var oParent = document.getElementById('main');// 父级对象
   for(var i=0;i<dataInt.data.length;i++){
    var oPin=document.createElement('div'); //添加 元素节点
    oPin.className='pin';     //添加 类名 name属性
    oParent.appendChild(oPin);    //添加 子节点
    var oBox=document.createElement('div');
    oBox.className='box';
    oPin.appendChild(oBox);
    var oImg=document.createElement('img');
    oImg.src='./images/'+dataInt.data[i].src;
    oBox.appendChild(oImg);
   }
   waterfall('main','pin');
  };
 }
}
 
/*
 parend 父级id
 pin 元素id
*/
function waterfall(parent,pin){
 var oParent=document.getElementById(parent);// 父级对象
 var aPin=getClassObj(oParent,pin);// 获取存储块框pin的数组aPin
 var iPinW=aPin[0].offsetWidth;// 一个块框pin的宽
 var num=Math.floor(document.documentElement.clientWidth/iPinW);//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
 oParent.style.cssText='width:'+iPinW*num+'px;margin:0 auto;';//设置父级居中样式:定宽+自动水平外边距
 
 var pinHArr=[];//用于存储 每列中的所有块框相加的高度。a
 for(var i=0;i<aPin.length;i++){//遍历数组aPin的每个块框元素
  var pinH=aPin[i].offsetHeight;
  if(i<num){
   pinHArr[i]=pinH; //第一行中的num个块框pin 先添加进数组pinHArr
  }else{
   var minH=Math.min.apply(null,pinHArr);//数组pinHArr中的最小值minH
   var minHIndex=getminHIndex(pinHArr,minH);
   aPin[i].style.position='absolute';//设置绝对位移
   aPin[i].style.top=minH+'px';
   aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';
   //数组 最小高元素的高 + 添加上的aPin[i]块框高
   pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加了块框后的列高
  }
 }
}
 
 /*
 *通过父级和子元素的class类 获取该同类子元素的数组
 */
function getClassObj(parent,className){
 var obj=parent.getElementsByTagName('*');//获取 父级的所有子集
 var pinS=[];//创建一个数组 用于收集子元素
 for (var i=0;i<obj.length;i++) {//遍历子元素、判断类别、压入数组
  if (obj[i].className==className){
   pinS.push(obj[i]);
  }
 };
 return pinS;
}
/****
 *获取 pin高度 最小值的索引index
 */
function getminHIndex(arr,minH){
 for(var i in arr){
  if(arr[i]==minH){
   return i;
  }
 }
}

function checkscrollside(){
 var oParent=document.getElementById('main');
 var aPin=getClassObj(oParent,'pin');
 var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性
 var documentH=document.documentElement.clientHeight;//页面高度
 return (lastPinH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
}

演示图:

javascript实现仿百度图片的瀑布流加载效果

源码下载:https://3water.com/jiaoben/452663.html

演示地址:http://demo.3water.com/js/2016/JSWallper/

Javascript 相关文章推荐
js实现浏览器的各种菜单命令比如打印、查看源文件等等
Oct 24 Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 Javascript
JavaScript中Function()函数的使用教程
Jun 04 Javascript
jQuery检测返回值的数据类型
Jul 13 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
Bootstrap轮播插件使用代码
Oct 11 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
Mar 26 Javascript
jQuery zTree树插件简单使用教程
Jan 10 Javascript
JavaScript获取select中text值的方法
Feb 13 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
Nov 19 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 Javascript
vue中使用mockjs配置和使用方式
Apr 06 Vue.js
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 #Javascript
javascript实现简单计算器效果【推荐】
Apr 19 #Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 #Javascript
jQuery实现选项联动轮播效果【附实例】
Apr 19 #Javascript
浅析JavaScript中浏览器的兼容问题
Apr 19 #Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 #Javascript
深入浅析JavaScript中的constructor
Apr 19 #Javascript
You might like
php标签云的实现代码
2012/10/10 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
JavaScript中数组Array方法详解
2017/02/27 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
2018/09/27 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
小小聊天室Python代码实现
2016/08/17 Python
python模块之paramiko实例代码
2018/01/31 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
tensorflow自定义激活函数实例
2020/02/04 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
什么是索引指示器
2012/08/20 面试题
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
J2EE相关知识面试题
2013/08/26 面试题
护理实习自我鉴定
2013/12/14 职场文书
素食餐饮项目创业计划书
2014/02/02 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
运动会口号大全
2014/06/07 职场文书
甘南现象心得体会
2014/09/11 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
七年级作文之游记
2019/12/11 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS